Yandex SpeechKit HTTP APIを使用したアスタリスクでの音声認識





この記事は、Asterisk向けのGoogleの統合と音声認識に基づいて書かれており、大きな変更はありません 。 音声認識には、Yandex SpeechKit HTTP APIプラットフォームが使用されます。



ダイヤルプランではすべてが変更されていません(私のAELのextensions.aelの例は、extensions.confより便利です):



s => { Answer(); Wait(1); Record(/tmp/${UNIQUEID}.wav,3,20); AGI(yandex_voice.php,/tmp/${UNIQUEID}); NoOp(${TEXT}); Hangup(); };
      
      







この例は非常に原始的です。呼び出しに応答し、1秒間待機します。音声を録音し、発言を認識し、認識されたテキストをアスタリスクコンソールに表示しますが、操作の原理は明確です。



次に、スクリプト自体について説明します。



最初に、使用される変数について少し説明します。



$ key = 'my_secret_key'-これはAPIキーです; speechkit@yandex-team.ruに手紙を書くことで取得できます。



$ topic = 'maps'-認識のためのトピック。次のオプションが可能です。



•フリーフォーム-フリーテキスト、メモなど。 アプリケーションのバリエーション:ボイスメールメッセージをテキストに変換し、電子メールまたはSMSで送信します。

•一般-Web検索クエリ。このコンテキストでこれを何に適用できるか考えられません。

•マップ-住所、GEOポイント(バー、ガソリンスタンド、ホテルなどの名前)など。

•音楽-曲の名前、音楽グループなど



$ lang = 'ru-RU'-認識が行われる言語。現在ロシア語の 'ru-RU'およびトルコ語の 'tr-TR'がサポートされており、トルコ語はこれらの「一般」および「マップ」でのみサポートされています。



$ uuid = '12345678123456781234567812345678' -32桁の文字列。リクエストごとに一意である必要があります。



APIは、キーとともに送信されるYandex_SpeechKit_HTTP_API_May [5] .pdfファイルで詳細に説明されていますが、短いAPIマニュアルを読むことはできませんでしたが、これは良い方法です。



私のバージョンのアスタリスク構成では、スクリプトファイルは次のフォルダーにあります:/ usr / share / asterisk / agi-bin /



そして実際にはyandex_voice.phpコード自体:



 #!/usr/bin/php -q <? $agivars = array(); while (!feof(STDIN)) { $agivar = trim(fgets(STDIN)); if ($agivar === '') break; $agivar = explode(':', $agivar); $agivars[$agivar[0]] = trim($agivar[1]); } extract($agivars); $filename = $_SERVER["argv"][1]; $key = 'my_secret_key'; $topic = "maps"; $lang = "ru-RU"; $uuid = "12345678123456781234567812345678"; system('sox '.$filename.'.wav -r 16000 -b 16 -c 1 '.$filename.'-pcm.wav'); $cmd = exec('curl --silent -F "Content-Type=audio/x-pcm;bit=16;rate=16000" -F "audio=@'.$filename.'-pcm.wav" asr.yandex.net/asr_xml\?key='.$key.'\&uuid='.$uuid .'\&topic='.$topic.'\&lang='.$lang, $xml); $res_xml = implode($xml); if (preg_match('!<variant .*?>(.*)</variant>!si', $res_xml, $arr)) $voice_text = $arr[1]; else $voice_text=''; echo 'SET VARIABLE TEXT "'.$voice_text.'"'."\n"; fgets(STDIN); echo 'VERBOSE ("'.$voice_text.'")'."\n"; fgets(STDIN); exit(0); ?>
      
      







はい、コードは完璧ではありません。改善できるし、改善すべきです。 オプションとして、ほとんどの変数に引数を渡すことで汎用性を高めるか、別のAGIまたはARIスクリプトで関数として使用します。 現在使用しているように、加入者がいる都市を認識するために。



All Articles