アスタリスク+ UniMRCP + VoiceNavigator。 アスタリスクの音声合成と認識。 パート4

VoiceNavigatorアスタリスクUniMRCP



パート1

パート2

パート3



約束したように、第4部では、音声プラットフォームとしてのアスタリスクの制限と欠点、およびVoiceNavigatorとの相互作用の機能について検討します。

音声プラットフォームは、音声合成および認識機能を備えたハードウェアとソフトウェアの複合体であり、コンタクトセンターの最適化、顧客サービスの向上、音声セルフサービスシステムの構築を目的としたソリューションを作成できます。



アスタリスクは、純粋な音声プラットフォームではありません。 合成および認識サーバーでの作業はその主なタスクではなく、 UniMRCPを介して実装されます 。 したがって、欠点と制限の一部は、UniMRCPでの作業の実装に関連しています。



GHSを構築するためにコールセンターで使用される広く有名な音声プラットフォームの中で、Avaya Voice Portal、Genesys Voice Platform、Siemens OpenScape CCVP、Cisco Unified CCX、Voxeo、Voxpilotに注目する価値があります。

RuNetにはあまり情報がなく、これらの製品の専門家は適切なレベルの能力を備えています。 大規模なコールセンターで使用される場合、コストは適切であり、大企業でのみ利用可能です。

いずれかのプラットフォームに関心がある場合は、それらについて個別に書きます。



Asterisk + UniMRCPに存在する2つの主な欠点は、VoiceXMLのサポートの欠如と音声合成のための壊れた割り込みです。





VoiceXMLサポートの欠如


音声アプリケーションを作成するための業界標準は、 VoiceXMLの使用です。これは、UniMRCPおよびAsteriskではサポートされていません。



VoiceXML (Voice Extensible Markup Language)は、音声ダイアログの合成、音声のデジタル化、DTMF、SGRS文法の認識が可能なオーディオダイアログのスクリプト用に設計された言語です。

VXMLはHTMLによく似ています。 VoiceXMLページに含まれている必要があるテキスト

合成音声、事前に録音されたサウンドファイル、フォーム、

音声情報を知覚および認識できるようにします。 話し言葉に応じて

コマンドまたはDTMF入力のユーザーによって、他のVoiceXMLページへの移行が発生する場合があります。



VXMLは、すべての音声プラットフォームで使用されるものであり、アプリケーションの作成を大幅に促進します。

以下に、0から10までの数字を要求し、名前付きの数字を繰り返すアプリケーションの例を示します。 アスタリスクで同じことをして、比較してみてください)

  <?xml version = "1.0" encoding = "UTF-8"?>
 <vxmlバージョン= "2.0" xmlns = "http://www.w3.org/2001/vxml" xml:lang = "ru-RU">
        <form id = "digits">
            <プロパティ名= "bargein"値= "false" />
              <フィールド名= "digitfield">
                 <prompt bargein = "false"> 0〜10の数字を指定してください。</ prompt>
                 <noinput>番号を指定しませんでした。  0から10までの数を指定してください。</ noinput>
                 <nomatch>申し訳ありませんが、上記の番号を認識できませんでした。繰り返してください。</ nomatch>
                 <grammar type = "application / srgs + xml" version = "1.0" mode = "voice" root = "boolean" xml:lang = "ru-RU">
                    <rule id = "boolean" scope = "public">
                       <one-of>
                          <item>ゼロ</ item>
                          <item> 1つ</ item>
                          <item> 2 </ item>
                          <item> 3 </ item>
                          <item> 4 </ item>
                          <item> 5 </ item>
                          <item> 6 </ item>
                          <item> seven </ item>
                          <item> 8 </ item>
                          <item>ナイン</ item>
                          <item> 10 </ item>
                          <item> <ruleref special = "GARBAGE" /> </ item>
                       </ one-of>
                    </ rule>
                 </ grammar>
                 <記入済み>
                    <prompt>数値に<value expr = "digitfield" />という名前を付けました。</ prompt>
                    <goto next = "#digits" />
                 </ filled>
              </ field>
        </ form>
 </ vxml> 


アスタリスクには、 i6netの VXI *プロジェクトがあります。 これは、VoiceXML Browser- OpenVXIに基づくアスタリスク用のVoiceXMLインタープリターです。

彼を働かせようとする私の試みは失敗しました。 認識には、特定のエンジンごとに開発された、ある種のネイティブHTTP-TTSコネクタの合成にUniMRCPが使用されます。

さらに、製品は支払われます。

VXI *またはOpenVXIの経験がある人は、コメントをいただければ幸いです。



合成のための割り込みなし


前の記事で、割り込みとMRCPRecog関数のfパラメーターについて説明しました。 このパラメーターとして、グリーティングとして再生されるサウンドファイルを転送できます。 b = 1も同時に設定されている場合、ファイルの音声は音声の開始時に中断され、認識セッションが開始されます。

割り込みのサポートは、音声アプリケーションを構築する際に必要な必須機能です。 たとえば、長いメッセージの場合、またはサブスクライバーが複数回呼び出してシステムメッセージを知っている場合、メッセージを最後まで聞くように強制する必要はありません。 とにかく、私たちは他の人、特にロボットを中断するのが大好きです))



MRCPSynthは割り込みをサポートしていません。 つまり 動的に生成されたメッセージ、たとえば、前のサブスクライバー選択に対するシステム応答は中断できません。

合成はDTMFによって中断できますが、この場合は解決策ではありません。



ご覧のとおり、UniMRCPで選択された実装では、異なるセッションで合成と認識が開始されると、合成のための割り込みの存在は問題を完全には解決しません。 合成後の認識セッションの後続の開始のために音声で合成を中断しても、時間がかかります。 また、この時点で、加入者が話すフレーズの2分の1の最初の部分は落ちません。これは、認識の品質を低下させる可能性があります。 VoiceXMLにはこのような問題はありません。事前に記録されたフレーズと合成の両方で割り込みが機能します。 認識セッションは合成セッションと同時に、またはそれよりも早く開始され、音声プラットフォームは音声データをMRCPサーバーと送受信できる状態になります(上記の例を参照)。



前のアプリケーションでは、 bargein =“ false”bargein =“ true”に変更するだけで、合成された音声を中断できます。



この欠陥を少し回避し、割り込みを仕掛ける方法


この欠点を回避する主な方法は、合成の量を最小限に抑えることです。静的フレーズを使用する場合は、特にフレーズの最後で、事前に記録されたファイルを使用します。

なぜなら 人々はフレーズを最後まで聞かずに話し始めることが多いので、最後の部分を事前に録音して中断できるようにフレーズを作成する必要があります。 たとえ一言であっても。

たとえば、人が話したフレーズを明確にした場合(引用符内の値は、前のステップで認識されたフレーズです)。

-あなたは「営業部」と言った? (合成)

-そうですか? (録音フレーズ)



-「アカウント操作」(合成)を選択しました。

-確認しますか?(録音されたフレーズ)



運賃とポイントAからポイントBを報告するアプリケーションの例

  ;事前に記録されたファイルを使用します。 出発都市を発声してください。
 exten => app、n(level1)、MRCPRecog($ {GRAMMARS_PATH} /towns.xml,ct=0.1&b=1&f = $ {SND_PATH} / level1)
 exten => app、n、SET(RECOG_HYP_NUM = 0)
 exten => app、n、SET(RECOG_UTR0 =エラー)

 exten => app、n、AGI($ {AGI_PATH} /NLSML.agi、$ {QUOTE($ {RECOG_RESULT})})

 ;都市が認識されない場合は、error_start優先順位に進み、そうでない場合はcheck_startに進みます
 exten => app、n、GotoIf($ ["$ {RECOG_UTR0}" = "エラー"]?error_start:check_start)

 ; AGIスクリプトを実行します。ここでは、都市の確認、何かの検討などを行います。
 exten => app、n(check_start)、AGI($ {AGI_PATH} /check_start.agi)

 ;フレーズの最初の部分は、認識の結果と合成を使用します 
 exten => app、n、MRCPSynth(<?xml version = \ "1.0 \"?> <speak version = \ "1.0 \" xml:lang = \ "ru-ru \" xmlns = \ "http:// www .w3.org / 2001/10 / Synthesis \ "> <voice name = \" Maria8000 \ "> <p> $ {Start_Town}を選択しました。</ p> </ voice> </ speak>)

 ; 2番目の部分-事前に記録されたファイル:宛先
 exten => app、n(level2)、MRCPRecog($ {GRAMMARS_PATH} /towns.xml,ct=0.1&b=1&f = $ {SND_PATH} / level2)
 exten => app、n、SET(RECOG_HYP_NUM = 0)
 exten => app、n、SET(RECOG_UTR0 =エラー)

 exten => app、n、AGI($ {AGI_PATH} /NLSML.agi、$ {QUOTE($ {RECOG_RESULT})})

 ;都市が認識されない場合は、error_finish優先度に進み、そうでない場合はcheck_finishに進みます
 exten => app、n、GotoIf($ ["$ {RECOG_UTR0}" = "エラー"]?error_start:check_finish)

 ; AGIスクリプトを実行します。ここで都市をチェックし、運賃を検討します
 exten => app、n(check_finish)、AGI($ {AGI_PATH} /check_finish.agi)

 ;計算結果を報告します 
 exten => app、n、MRCPSynth(<?xml version = \ "1.0 \"?> <speak version = \ "1.0 \" xml:lang = \ "ru-ru \" xmlns = \ "http:// www .w3.org / 2001/10 / Synthesis \ "> <voice name = \" Maria8000 \ "> <p> $ {Start_Town}から$ {Finish_Town}までの運賃は$ {Price}です。</ p> </ voice> </ speak>) 


256文字の可変長制限


アスタリスクには、256文字の可変長制限があります。 変数が指定されたサイズよりも大きい場合、余分な部分は単に破棄されます。

これまでのところ、2つのケースでこの制限に遭遇しました。



1)256文字を超える文字列をVoiceNavigator合成に転送する必要があります。

音声メニューでは、すべてのフレーズを短く簡潔にする必要がありますが、たとえば、この制限を超える可能性のあるヘルプ情報を音声で伝える必要がある場合があります。 この場合、テキストを256文字以下の部分に分割し、部分的に音を出す必要があります。



このパラメーターに大きな値を指定して、アスタリスクを見つけて再コンパイルすることができます。

これまでのところ、呼び出しファイルで渡される変数のサイズを変更する方法のみをソースで見つけることができましたが、アスタリスク全体ではできませんでした。 職人がいらっしゃったら、もう一度、あなたの経験を聞いてうれしいです。



2)N-Bestを2つ以上処理する必要があります。

N-Bestは、返される認識結果の数です。 デフォルトでは、N-Best = 1。 これを増やすと、VocieNavigatorは最高の信頼レベル(認識信頼度)で複数の認識結果を返します。

たとえば、最も信頼性の高い2つの認識結果を取得し、それらの信頼レベルの差が非常に低い場合は、サブスクライバーに正確に言ったことを明確にしてもらいます。

-すみません、営業部ですか、それとも宇宙調査部ですか?



N-Best> 2で、MRCPサーバーが3つ以上の応答を返す場合、NLSML応答は256文字を超え、その端は切り捨てられ、その結果、パーサーはNLSMLを解析できません 無効になります。



このケースは非常にまれで、通常はN-Best = 2で十分ですが、この問題を覚えておく価値があります。



DTMF認識が機能しない


今日、VoiceNavigatorはUniMRCPからのDTMF信号を理解できないため、DTMF文法を処理します。 開発者は、近い将来に問題を解決することを約束します。



DTMFはアスタリスク自体によって直接認識されます(これは標準機能です)が、フレーズを言うようにユーザーにプロンプ​​トを表示したり、内線番号を入力したりすることはできません。 メニューの同じブランチでDTMFと音声を認識することは現在不可能です。

これは重大な制限であり、音声メニューを作成するときに考慮する必要があります。

VoiceNavigatorの他のプラットフォームと組み合わせて、この問題はありません。



Asterisk + UniMRCP + VoiceNavigatorを使用する際に対処しなければならなかった主な問題と制限を以下に示します。



質問に答える準備ができました。



PS: MDGには、インターネットで検索するテストVoiceNavigatorがあります。 記事で説明されている技術に関心がある場合は、個人的な手紙を書いてください。テストのためにアクセスできるように、どこで何を書くべきかについて連絡先と指示を差し上げます。



All Articles