アスタリスクでGoogle Cloud Speech API v2を使用してロシア語の音声を認識する

こんばんは、同僚。 最近、チケットシステムに音声チケットシステムを追加する必要がありました。 しかし、毎回音声ファイルを聞くのは必ずしも便利ではないので、これに自動音声認識システムを追加するというアイデアが浮上しました。さらに、将来的には他のプロジェクトでも役立ちます。 この作業中に、googleとyandexの最も人気のある音声認識システムの2つのAPIバージョンが試されました。 結局、選択は最初のオプションにかかった。 残念ながら、インターネットでこれに関する詳細な情報を見つけられなかったので、自分の経験を共有することにしました。 あなたがそれの由来に興味があるなら、猫へようこそ。



音声認識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に基づいて音声制御要素を実装する予定です。



All Articles