フリーフォームのリアルタイム音声認識および通話録音認識







音声認識を使用してスクリプトを作成する可能性については既に説明しました 、このシステムの機能は多少制限されていました。 少し前、Googleは音声認識システムへのアクセスを開始しました。 そしてもちろん、私たちはこれを利用しました。 多くの企業は、Voximplantを使用して顧客と対話するさまざまなシナリオを実装しています。 音声認識を使用した自動化とすでに認識されているものの検索により、ビジネスは手作業に費やす労力を減らし、本当に重要なことに労力を費やすことができます。 次に、統合を行ったいくつかの重要なケース、プロセスで発生した問題、および新しい機能の使用例について詳しく説明します。



フリーフォームは難しい



そもそも、自由形式の認識は非常に難しい技術的課題です。 限られた辞書(住所など)で90 +%の認識品質を得ることが現実的である場合、フリーフォームの場合、これはすでにほとんど達成不可能なバーです。 人が何かを口述するとき、それは一つのことです。つまり、出力は構造化されたテキストです。 そして、もう1つのことは電話での会話です。通信中に、認識の質を悪化させる100万の追加の瞬間が発生します。 さらに、リアルタイム認識には十分な計算能力が必要であり、これらすべてを適切に拡張してクラウドからアクセスできるようにする必要があります。 自由形式の認識のためのさまざまなソリューションを長い間テストしてきました。 どこかで何かが欠けているたびに、Googleの同僚が彼らの認識を発表したとき、私たちは喜んでそれをテストするために走りました。



Google Cloud Speech APIの機能



Google Cloud Speech APIは現在、オープンベータ版です。 フィードできるリクエストの数と速度には多くの制限があります。 APIの操作には、同期モード、非同期モード、ストリーミングのオプションがいくつかあります。 同期モードを使用すると、最大1分間続くオーディオデータを送信し、認識結果を含む応答を要求に返すことができます。 非同期モードでは大きなファイルを処理できますが、そのためにはGoogle Cloud Storageにアップロードする必要があります。 ストリーミングを使用すると、データを部分的に転送し、リアルタイムで認識結果を取得できます。つまり、ディクテーションおよびIVRに適しています。 オーディオ形式によると-8/16 KHz。 モードに応じて、多数の異なるコーデックがサポートされています:ulaw、flac、amr、または単なるPCM。 ベンダーは、追加の信号処理を使用せずに16 KHzを使用することを推奨しています-これは認識の品質を低下させるだけです。 私たちの経験は、実際にははるかに多くのニュアンスがあることを示しています。 たとえば、20秒以上続くピースを認識しようとしない方が良いです。ピースが小さすぎる場合、結果を取得できないなどです。 これらの問題の多くは、ベータ版の結果です。 それらはリリースのために修正されると思います。



ケース1:転写



最も人気のあるケースの1つは、会話レコードの認識です。 おそらく、これがこのような便利な機能である理由を長い間説明する必要はないでしょう。 テキストでの検索は音声での検索よりもはるかに簡単です。したがって、テキストへの変換後、あらゆる種類の分析が高速化および簡素化されます。 転写を有効にするには、追加の転写パラメーターを記録機能に転送する必要があります。



require(Modules.ASR); //.. call.record({language: ASRLanguage.RUSSIAN_RU, transcribe: true, stereo: true}); //...
      
      





Voximplantのすべてのコール処理スクリプトはJavaScriptで記述されているため、ここではすべてが非常に透過的です。 このコードは、録音が完了した後、Google Speech APIを処理する特別なサブシステムにデータを送信する必要があることを示しています。 そして、通話履歴の一定時間後、録音に加えて、認識結果を含むテキストファイルが表示されます。 結果は次のようになります。



 Left 00:00:00 - 00:00:03 : <Unrecognized> Right 00:00:00 - 00:00:35 :                               Philips  1      Philips  2          Philips  3       Philips  4 Right 00:00:38 - 00:01:18 :            Philips  1      Philips  2          Philips  3       Philips  4          Philips                  Left 00:01:05 - 00:01:44 :       nanosuit  Saeco    -            .     -             Right 00:01:20 - 00:02:01 :        Philips                                 Left 00:01:49 - 00:02:33 :     x xxx xxxx Right 00:02:07 - 00:02:30 :                           125 Right 00:02:32 - 00:03:17 : 66 67  2                                         .             Left 00:02:34 - 00:03:14 :          Left 00:03:14 - 00:03:26 :      Right 00:03:17 - 00:03:25 :      Philips          
      
      





残念ながら、APIは認識時にタイムスタンプを発行しませんが、それがいつ何時に言われたかをできるだけ正確に破ることは不可能です。 しかし、それでもとても良いです。



ケース番号2。 IVR



キーワードは自動化です。 今では、怠zyな人だけが、機械学習やAIなどのおかげで世界がどのように変化するかについて書いたり、話したりしません。 おそらく、これらの物語のすべてに同意するわけではありません。 特にAIについて。 しかし、以前は高価なスタッフの時間を必要としていた顧客とのやり取りのプロセスを自動化するために顧客に積極的に提供しているため、自動化により多くのプロセスを高速化および改善できることをよく知っています。 機械学習と音声認識の進歩により、音声認識を備えたインテリジェントIVRは近い将来に雪崩のように広がります。 アメリカでは、自動車部門に電話すると、IVRと長く魅力的な会話が交わされます。そこでは、生きている人に乗ることはほとんど不可能です。 最大-後で折り返し電話するように依頼できます。 運が良ければ、来週中に。 このような極端なオプションが正しいとは思いません。 それでも、コミュニケーションがうまくいかない場合は、生きている人に乗る機会を人々に与える必要があります。 しかし、その傾向は長い間明らかでした。



Voximplantの場合、このようなシナリオを実装する機会が長くありました。 以前は、場合によっては認識精度が不十分でした。 Google APIの場合、 speech_contextを設定できます。これにより、定義済みのフレーズとオプションのリストから選択してスクリプトを実装できます。 そして、人が文脈から外れた何かを言っても、認識は機能します。 しかし、彼が文脈から何かを言うと、それははるかに高い精度で機能します。 次のように、VoxEngineスクリプトでこの関数を使用できます。



 require(Modules.ASR); //.. mycall.say(" ", Language.RU_RUSSIAN_FEMALE); mycall.addEventListener(CallEvents.PlaybackFinished, function (e) { mycall.sendMediaTo(myasr); }); //... var myasr = VoxEngine.createASR( ASRLanguage.RUSSIAN_RU, ["", "", "", " ", " "]); myasr.addEventListener(ASREvents.Result, function (e) { if (e.confidence > 0) mycall.say(" " + e.text + "  " + e.confidence, Language.RU_RUSSIAN_FEMALE); else mycall.say("   ", Language.RU_RUSSIAN_FEMALE); }); myasr.addEventListener(ASREvents.SpeechCaptured, function (e) { mycall.stopMediaTo(myasr); }); //...
      
      





ケース番号3。 ストリーミング



Googleのバックエンドの作業に関連するいくつかの技術的な理由により、ストリーミングモードの実装を適切にデコイする必要がありました。 近い将来、そのような必要性がなくなることを願っています。 したがって、リアルタイムで会話全体(または音声の大部分)を認識するには、スクリプトを変更する必要があります。



 require(Modules.ASR); var full_result = "", ts; //.. mycall.say(" ", Language.RU_RUSSIAN_FEMALE); mycall.addEventListener(CallEvents.PlaybackFinished, function (e) { mycall.sendMediaTo(myasr); }); //... //   -    freeform (     ) var myasr = VoxEngine.createASR(ASRLanguage.RUSSIAN_RU); myasr.addEventListener(ASREvents.Result, function (e) { //         full_result += e.text + " "; //   5    CaptureStarted,    ts = setTimeout(recognitionEnded, 5000); }); myasr.addEventListener(ASREvents.SpeechCaptured, function (e) { //          /*mycall.stopMediaTo(myasr);*/ }); myasr.addEventListener(ASREvents.CaptureStarted, function() { //         clearTimeout(ts); }); function recognitionEnded() { //   myasr.stop(); } //...
      
      





1つのニュアンスに注目したいと思います。CaptureStartedイベントは、Google APIからのフィードバックに基づいて発生します。 そこでは、VADは十分に親切であり、これらのイベントは音声だけでなく、バ​​ックグラウンドノイズに対しても発生する可能性があります。 サイレントモードでストリーミングモードで認識を停止するタイミングを正確に知るために、組み込みのVADを追加で使用できます。



 mycall.handleMicStatus(true); mycall.addEventListener(CallEvents.MicStatusChange, function(e) { if (e.active) { //   } else { //   } });
      
      





デモ





このファーム全体を不必要なジェスチャーなしでテストしないのは不思議です(もちろん、Voximplantを使用して開発を開始することを強くお勧めしますが:)デモはhttps://demos02.voximplant.com/asrdemo/で入手できます 。 WebRTC / ORTCサポート(Chrome / Firefox / Edge)とマイクを備えたブラウザーが必要です。 この奇跡のデモのソースはGistで入手できます。



All Articles