音声認識APIの選択
apiオプションのみを検討しました。リソースを必要とし、認識データはビジネスにとって重要ではなく、それらの使用ははるかに複雑で、より多くの工数を必要とするため、ボックスソリューションは不要です。
最初はYandex SpeechKit Cloudでした。 私はすぐに使いやすさが気に入りました:
curl -X POST -H "Content-Type: audio/x-wav" --data-binary "@speech.wav" "https://asr.yandex.net/asr_xml?uuid=< >&key=<API->&topic=queries"
価格設定ポリシー1000リクエストあたり400ルーブル。 最初の月は無料です。 しかし、その後、失望だけが起こった:
-大きな文を送信すると、2〜3単語の回答が来ました。
-これらの単語は奇妙な順序で認識されました
-肯定的な結果のトピックを変更する試みはもたらしませんでした
おそらくこれは平均的な録音品質によるものであり、私たちはすべて音声ゲートウェイと古代のパナソニック電話でテストしました。 これまでのところ、IVRを構築するために将来使用する予定です。
次はGoogleのサービスです。 インターネットには、Chromium開発者向けのAPIの使用を提案する記事が多数あります。 現在、このAPIのキーはそれほど簡単に取得できません。 したがって、商用プラットフォームを使用します。
価格設定ポリシー-無料で1か月あたり0〜60分。 次に、15秒間の音声に対して0.006ドル。 各リクエストは15の倍数に丸められます。最初の2か月は無料です。プロジェクトを作成するにはクレジットカードが必要です。 基礎となるドキュメントでAPIを使用するためのオプションはさまざまです。 Pythonスクリプトを使用します。
ドキュメントのスクリプト
"""Google Cloud Speech API sample application using the REST API for batch processing.""" import argparse import base64 import json from googleapiclient import discovery import httplib2 from oauth2client.client import GoogleCredentials DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest?' 'version={apiVersion}') def get_speech_service(): credentials = GoogleCredentials.get_application_default().create_scoped( ['https://www.googleapis.com/auth/cloud-platform']) http = httplib2.Http() credentials.authorize(http) return discovery.build( 'speech', 'v1beta1', http=http, discoveryServiceUrl=DISCOVERY_URL) def main(speech_file): """Transcribe the given audio file. Args: speech_file: the name of the audio file. """ with open(speech_file, 'rb') as speech: speech_content = base64.b64encode(speech.read()) service = get_speech_service() service_request = service.speech().syncrecognize( body={ 'config': { 'encoding': 'LINEAR16', # raw 16-bit signed LE samples 'sampleRate': 16000, # 16 khz 'languageCode': 'en-US', # a BCP-47 language tag }, 'audio': { 'content': speech_content.decode('UTF-8') } }) response = service_request.execute() print(json.dumps(response)) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument( 'speech_file', help='Full path of audio file to be recognized') args = parser.parse_args() main(args.speech_file)
Google Cloud Speech APIを使用する準備
プロジェクトを登録し、認証用のサービスアカウントキーを作成する必要があります。 こちらが試用版を入手するためのリンクです。Googleアカウントが必要です。 登録後、 APIをアクティブにし、認証用のキーを作成する必要があります。 キーをサーバーにコピーする必要がある場合。
サーバー自体のセットアップに移りましょう。必要なものは次のとおりです。
-python
-python-pip
-Python Google APIクライアント
sudo apt-get install -y python python-pip pip install --upgrade google-api-python-client
ここで、apiを正常に動作させるために2つの環境変数をエクスポートする必要があります。 最初はサービスキーへのパス、2番目はプロジェクトの名前です。
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account_file.json export GCLOUD_PROJECT=your-project-id
テストオーディオファイルをダウンロードして、スクリプトを実行してみます。
wget https://cloud.google.com/speech/docs/samples/audio.raw python voice.py audio.raw {"results": [{"alternatives": [{"confidence": 0.98267895, "transcript": "how old is the Brooklyn Bridge"}]}]}
いいね! 最初のテストは成功です。 それでは、スクリプト内のテキスト認識言語を変更して、認識してみましょう。
nano voice.py service_request = service.speech().syncrecognize( body={ 'config': { 'encoding': 'LINEAR16', # raw 16-bit signed LE samples 'sampleRate': 16000, # 16 khz 'languageCode': 'ru-RU', # a BCP-47 language tag
.rawオーディオファイルが必要です。 このためにソックスを使用します
apt-get install -y sox sox test.wav -r 16000 -b 16 -c 1 test.raw python voice.py test.raw {"results": [{"alternatives": [{"confidence": 0.96161985, "transcript": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0412\u0430\u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f"}]}]}
Googleは、答えをUnicodeで返します。 しかし、私たちは普通の手紙を見たいです。 voice.pyを少し変更してみましょう。
代わりに
print(json.dumps(response))
使用します
s = simplejson.dumps({'var': response}, ensure_ascii=False) print s
import simplejsonを追加します。 猫の下の最後のスクリプト:
Voice.py
"""Google Cloud Speech API sample application using the REST API for batch processing.""" import argparse import base64 import json import simplejson from googleapiclient import discovery import httplib2 from oauth2client.client import GoogleCredentials DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest?' 'version={apiVersion}') def get_speech_service(): credentials = GoogleCredentials.get_application_default().create_scoped( ['https://www.googleapis.com/auth/cloud-platform']) http = httplib2.Http() credentials.authorize(http) return discovery.build( 'speech', 'v1beta1', http=http, discoveryServiceUrl=DISCOVERY_URL) def main(speech_file): """Transcribe the given audio file. Args: speech_file: the name of the audio file. """ with open(speech_file, 'rb') as speech: speech_content = base64.b64encode(speech.read()) service = get_speech_service() service_request = service.speech().syncrecognize( body={ 'config': { 'encoding': 'LINEAR16', # raw 16-bit signed LE samples 'sampleRate': 16000, # 16 khz 'languageCode': 'en-US', # a BCP-47 language tag }, 'audio': { 'content': speech_content.decode('UTF-8') } }) response = service_request.execute() s = simplejson.dumps({'var': response}, ensure_ascii=False) print s if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument( 'speech_file', help='Full path of audio file to be recognized') args = parser.parse_args() main(args.speech_file)
ただし、開始する前に、別の環境変数export PYTHONIOENCODING = UTF-8をエクスポートする必要があります。 それがないと、スクリプトで呼び出されたときにstdoutで問題が発生しました。
export PYTHONIOENCODING=UTF-8 python voice.py test.raw {"var": {"results": [{"alternatives": [{"confidence": 0.96161985, "transcript": " "}]}]}}
素晴らしい。 これで、ダイヤルプランでこのスクリプトを呼び出すことができます。
アスタリスクダイヤルプランの例
スクリプトを呼び出すには、簡単なダイヤルプランを使用します。
exten => 1234,1,Answer exten => 1234,n,wait(1) exten => 1234,n,Playback(howtomaketicket) exten => 1234,n,Playback(beep) exten => 1234,n,Set(FILE=${CALLERID(num)}--${EXTEN}--${STRFTIME(${EPOCH},,%d-%m-%Y--%H-%M-%S)}.wav) exten => 1234,n,MixMonitor(${FILE},,/opt/test/send.sh support@test.net "${CDR(src)}" "${CALLERID(name)}" "${FILE}") exten => 1234,n,wait(28) exten => 1234,n,Playback(beep) exten => 1234,n,Playback(Thankyou!) exten => 1234,n,Hangup()
mixmonitorを記録に使用し、終了後にスクリプトを実行します。 あなたはレコードを使用することができ、それはおそらくより良いでしょう。 送信用のsend.shの例-すでにmuttが設定されていることを前提としています:
#!/bin/bash # # # export GOOGLE_APPLICATION_CREDENTIALS=/opt/test/project.json # export GCLOUD_PROJECT=project-id # export PYTHONIOENCODING=UTF-8 # EMAIL=$1 CALLERIDNUM=$2 CALLERIDNAME=$3 FILE=$4 # raw , sox /var/spool/asterisk/monitor/$FILE -r 16000 -b 16 -c 1 /var/spool/asterisk/monitor/$FILE.raw # TEXT=`python /opt/test/voice.py /var/spool/asterisk/monitor/$FILE.raw | sed -e 's/.*transcript"://' -e 's/}]}]}}//'` # , echo " : $CALLERIDNUM $CALLERIDNAME $TEXT " | mutt -s " " -e 'set from=test@test.net realname=" "' -a "/var/spool/asterisk/monitor/$FILE" -- $EMAIL
おわりに
したがって、タスクを解決しました。 誰かが私の経験から利益を得ることを願っています。 私はコメントするのがうれしいです(おそらくこれのためだけに、Habrを読む価値があります!)。 将来的には、このIVRに基づいて音声制御要素を実装する予定です。