こんにちは、石飛です。
今回はOpenAIが提供する音声認識技術のAPI「WhisperAPI」を使い、音声データから文字お起こしをしてみようと思います。
はじめに
以下の条件で実装します。
・言語はPHP(v8系)
・Composer(v2.7.7)はインストール済み
・実行基盤はAWS EC2(Amazon Linux2)※AWS環境の構築は省略
・OpenAIの疎通はできる状態(以下、参考にどうぞ)
実装
GuzzleHTTPをインストール
HTTPリクエスト用のライブラリGuzzleHTTPをインストールします。
$ composer require guzzlehttp/guzzle
実装
以下ソースです。
叩き台となるソースはChatGPTで作成しています。
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
function transcribeAudioWithGuzzle($apiKey, $filePath) {
// Guzzleクライアントを作成
$client = new Client([
'base_uri' => 'https://api.openai.com/v1/',
'headers' => [
'Authorization' => 'Bearer ' . $apiKey,
],
]);
try {
// Whisper APIへのPOSTリクエストを送信
$response = $client->request('POST', 'audio/transcriptions', [
'multipart' => [
[
'name' => 'file',
'contents' => fopen($filePath, 'r'),
'filename' => basename($filePath)
],
[
'name' => 'model',
'contents' => 'whisper-1'
],
[
'name' => 'response_format',
'contents' => 'text'
],
],
]);
// レスポンスのボディを取得して表示
$body = $response->getBody();
return $body;
} catch (\Exception $e) {
// エラーメッセージ
return 'Error: ' . $e->getMessage();
}
}
// APIキーと音声ファイルのパスを設定
$apiKey = 'XXXXXX'; // ※普段使っているOpenAIのAPIキーで問題ない
$filePath = '/XXXX/XXXX/xxxx.mp3'; // ※任意の箇所に置いた音声データ
// 関数を呼び出して結果を表示
$response = transcribeAudioWithGuzzle($apiKey, $filePath);
echo "Transcription Result: " . $response;
上記、$apiKey はOpenAIで発行されたAPIキーを、$filePath は文字起こししたい音声データを配置してください。音声データは.mp3を以下よりダウンロードして使っています。
※今回使った音声データがあるサイト
https://pro-video.jp/voice/announce/
このサイトの以下「G-01」の音声をダウンロードして使っています。

各ファイルは以下のように設置しています。

挙動確認
実行し挙動確認しようと思います。
まず、先ほどの「今回使った音声データがあるサイト」で「G-01」を再生してみてください。
石鹸のCMのようなナレーションだったと思います。
そして、excute.phpを実行します。
(すみません、ファイル名のスペルが違いました(笑))
$ php excute.php
結果確認すると…

期待通り文字お起こしに成功しています。
まとめ
いかがでしたでしょうか?
ナレーションがプロの方なので精度高く文字お起こしができていますが、ぼそぼそ声だったりするとどの程度の精度になるか気になります。
なので次回は恐らくですが、、、
①マイクから任意の音声入力(何かしら質問する)
②WhisperAPIを経由してChatGPTに回答してもらう
③返却値をWhisperAPIで実際の音声で読み上げてもらう
を他のサイトを参考に試してみたいと思います。