Smart Homeの作成での使用など、Google Speech APIの使用に関するいくつかの記事が既にhabrで書かれています。
この記事では、コンピューターの音声制御用の小さなプログラムを作成する方法を説明します。
猫の下で誰が気にしてください。
開発には、Embarcadero RAD Studio XEといくつかの無料の補助コンポーネント(JEDI Core、JEDI VCL、Delphiの新しいオーディオコンポーネント、Synapse、uJSON、CoolTrayIcon)を使用します
「.NETアプリケーションでのGoogle Voice Searchの使用」という記事では、Google Speech APIの仕組みと微妙な点について説明しました。
プログラムのアルゴリズムと、補助コンポーネントを使用する際の微妙な違いについて説明します。
1. FLAC形式の録音
このために、Delphiコンポーネント用の新しいオーディオコンポーネントを使用します。 音は、周波数8 kHzのFLAC形式で記録され、ファイルに保存されます。
VCLコンポーネントDXAudioIn1は録音を担当し、録音設定(1チャンネルと8 kHzの周波数)も含みます
さらに、DXAudioIn1からのデータは、OnGainDataレベル処理を持つFastGainIndicator1に送られます。レベルが設定レベル(赤いポインター)のN倍下がった場合、記録は停止され、データがGoogleに送信されます。
また、レベルがしきい値をM回超えたときに自動記録を開始できるようにしました(青いポインター)。
もちろん、このようなアルゴリズムはあまり信頼できませんが、開始ボタンと停止ボタンを押す必要はありません。 レベルと操作数の適切な設定により、プログラムはマイクから有用なコンポーネントの存在の事実をキャッチします。
最後に、FastGainIndicator1からのデータはFLACOut1コンポーネントに送られ、FLACOut1コンポーネントはFLAC形式でファイルに直接書き込みます。
StartRecordプロシージャは、記録の開始を担当します。
2.認識のためにGoogleにファイルを送信し、応答を受信する
記録されたファイルは、Synapseライブラリを使用した認識のためにGoogleに送信されます。
Synapseを使用することの微妙な点と、HTTPSを使用してデータを送信する必要があるという事実は何ですか?
a)Libeay32.dllおよびssleay32.dllライブラリが必要です
b)使用時には、SSL_OpenSSLファイルを接続する必要があります
HTTPPostFile関数は、ファイルを送信します。
単純に呼ばれます:
HTTPPostFile( 'https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=en-RU'、 'userfile'、ExtractFilename(OutFileName)、Stream、StrList);
どこで
ストリームは、FLAC形式で記録されたファイルを読み込むTFileStreamストリームです。
StrListは、Googleからの応答を持つTStringListです。
HTTPPostFile関数自体は非常に単純ですが、微妙な点があります。
function TMainForm.HTTPPostFile(Const URL, FieldName, FileName: String; Const Data: TStream; Const ResultData: TStrings): Boolean; const CRLF = #$0D + #$0A; var HTTP: THTTPSend; Bound, Str: String; begin Bound := IntToHex(Random(MaxInt), 8) + '_Synapse_boundary'; HTTP := THTTPSend.Create; try Str := '--' + Bound + CRLF; Str := Str + 'content-disposition: form-data; name="' + FieldName + '";'; Str := Str + ' filename="' + FileName + '"' + CRLF; Str := Str + 'Content-Type: audio/x-flac; rate=8000' + CRLF + CRLF; HTTP.Document.Write(Pointer(Str)^, Length(Str)); HTTP.Document.CopyFrom(Data, 0); Str := CRLF + '--' + Bound + '--' + CRLF; HTTP.Document.Write(Pointer(Str)^, Length(Str)); HTTP.MimeType := 'audio/x-flac; rate=8000, boundary=' + Bound; Result := HTTP.HTTPMethod('POST', URL); ResultData.LoadFromStream(HTTP.Document); finally HTTP.Free; end; end;
3. Googleからの応答文字列を解析し、コマンドを実行します
Googleからの応答行は、たとえば次のようなJSON形式で提供されます。
{「ステータス」:0、「id」:「5e34348f2887c7a3cc27dc3695ab4575-1」、「仮説」:[{"発言": "メモ帳"、 "信頼":0.7581704}]}
解析には、uJSONライブラリを使用します。
応答フィールドの意味:
フィールドステータス= 0-レコードは正常に認識されました
フィールドステータス= 5-レコードは認識されません
idフィールドは一意のリクエスト識別子です
仮説フィールドは認識の結果であり、2つのサブフィールドが含まれています。
発話-認識されたフレーズ
自信-認識の自信
ファイルを送信し、応答を解析し、コマンドを検索して実行し、別のJvThreadRecognizeスレッドに入れました。
コマンドのリストは、サンプルファイルであるMSpeechCommand.iniファイルに保存されます。
;notepad.exe
;script\Show_Desktop.scf
;script\Lock_Workstation.cmd
;script\Halt_Workstation.cmd
;script\Reboot_Workstation.cmd
;script\Logoff_Workstation.cmd
qip;C:\Program Files\QIP Infium\infium.exe
;firefox.exe
結果:このプログラムは完了したふりをしません。これは、Google Speech APIを使用してコンピューター上でいくつかのコマンドを実行する例です(これまでは、アプリケーションの起動とシステムコマンドの実行のみです)。 しかし、それを完成させて、マウスの移動方法、テキストエディタでのテキストの入力方法などを教えてくれる人はいません。
既製のビルドプログラムとソース(GPLv3)はcode.google.com/p/mspeechで入手できます。
建設的な批判や希望を聞いてうれしいです。 ありがとう