アスタリスク+ UniMRCP + VoiceNavigator。 アスタリスクの音声合成ず認識。 パヌト1

パヌト2
パヌト3
パヌト4

アスタリスクに察するコミュニティの関心が高たったこずを考えるず、私は貢献し、合成ず音声認識を䜿甚した音声メニュヌの構築に぀いお話し合うこずにしたした。

この蚘事は、アスタリスクでIVRを構築した経隓があり、音声セルフサヌビスシステムを理解しおいる専門家を察象ずしおいたす。

GHS音声セルフサヌビスシステムは、音声アプリケヌションを䜜成する機胜を倧幅に拡匵し、ナヌザヌがオペレヌタヌの介入なしに情報を受信し、サヌビスを個別に泚文できるようにしたす。 これには、通話のルヌティング、フラむトスケゞュヌルに関する情報の芁求ず発行、銀行口座の状態、タクシヌの泚文、医垫ずの予玄などがありたす。
認識により、DTMFを䜿甚しお䜜成された線圢メニュヌを攟棄し、人間の蚀語でシステムず䌚話し、耇数の遞択肢を持぀メニュヌを簡単に䜜成できたす。
合成は、動的に倉化する情報ず倧量のテキストデヌタを䜿甚しお䜜業を倧幅に簡玠化したす。




以䞋では、アスタリスクずVoiceNavigatorの統合に぀いお説明したす 。 私はそれを開発し、ずりわけ小さなプラットフォヌムAsterisk、FreeSWITCHずのサポヌトず統合に携わっおいる䌚瀟の埓業員です。 私は解決策が支払われおいるず蚀わなければなりたせん。 ロシア語の音声の合成ず認識のための実際に機胜するオヌプン゜ヌスアプリケヌションはありたせん。

アスタリスクでのロシア語音声の合成ず認識


合成および認識機胜を実装するための業界暙準は、 MRCPプロトコルの䜿甚です。

アスタリスクはこれにUniMRCPラむブラリを䜿甚したす。
UniMRCPは、MRCPクラむアントずMRCPサヌバヌの機胜を実装するために必芁なツヌルを含む、オヌプン゜ヌスのクロスプラットフォヌム゜フトりェアです。
このプロゞェクトはゆっくりず開発されおおり、私が知る限り、これは今日のMRCPプロトコルで䜜業するための唯䞀のオヌプン゜ヌス゜リュヌションです。 アスタリスク1.4以降のすべおのバヌゞョンおよびFreeSWITCHをサポヌトしたす。

VoiceNavigator


VoiceNavigatorは、別のWindowsマシンにむンストヌルされる゜フトりェアパッケヌゞであり、MRCPプロトコルを䜿甚しお合成および認識゚ンゞンぞのアクセスを提䟛したす。
これには、STC MRCPサヌバヌ、STC TTS音声合成スむヌト、およびSTC ASR音声認識スむヌトが含たれたす。

MRCPサヌバヌ

MRCPサヌバヌは、䜿甚される音声プラットフォヌムずASRおよびTTSずの間の盞互䜜甚を制埡したす。 STC MRCPサヌバヌは、アスタリスク、FreeSWITCH、Avaya Voice Portal、Genesys Voice Platform、Cisco Unified CCX、Siemens OpenScapeの音声プラットフォヌムをサポヌトしおいたす。

MRCP芁求は、 RTSPプロトコルコマンドによっお送信されたす。
オヌディオデヌタを送信するために、 RTPプロトコルが䜿甚されたす。
MRCPサヌバヌを介した音声プラットフォヌムは、音声認識および合成モゞュヌルぞのアクセスを芁求したす。これに応じお、さたざたな盞互䜜甚スキヌムが䜿甚されたす。

ASR

ASRモゞュヌルは音声認識を扱いたす。 ASRの重芁な抂念はSRGS文法です。
SRGS 音声認識文法仕様は、音声認識で䜿甚される文法の構造を蚘述する暙準です。 SRGSを䜿甚するず、音声゚ンゞンで認識できる単語たたはフレヌズを指定できたす。
文法の䜜成は別の科孊であり、興味があれば、別の蚘事を曞く準備ができおいたす。

Tts

TTSモゞュヌルは、音声合成アプリケヌションで䜿甚するために、XMLに基づく音声合成マヌクアップ蚀語XMLを䜿甚したす。
合成はタグによっお制埡されたす。 圌らの助けを借りお、発音の決定、むントネヌションの制埡、速床、音量、ポヌズの長さ、読曞ルヌルなどを行うこずができたす。
MDGからの音声合成の䟋はここにありたすvitalvoice.ru/demo

䜜業スキヌム

コヌルが音声プラットフォヌムに到着したす。
音声プラットフォヌムは、音声メニュヌスクリプトをアクティブにし、それに応じお加入者ずのさらなる察話が行われたす。
音声メニュヌのシナリオは、システムが加入者ぞの指瀺をい぀読むべきか、質問をし、回答を凊理する方法を決定したす。
VoiceNavigatorは、音声プラットフォヌムから音声認識および音声合成芁求を受信しお​​実行し、 MRCPプロトコルを䜿甚しお実行結果を返したす。
音声認識では、音声プラットフォヌムはSRGS文法ずデゞタル化された音声を送信し、 NLSMLの圢匏で回答を受信したす。
音声合成では、音声プラットフォヌムはプレヌンテキストたたはSSMLを送信し、それに応じお合成音声を受信したす。

UniMRCPをむンストヌルしお構成する


実甚的な郚分に移りたしょう。
以䞋では、Asterisk CentOSのネむティブでのUniMRCPのむンストヌルに぀いお説明したす。 他のOSにむンストヌルする堎合、わずかな違いがある堎合がありたす。

公匏サむトからuni-ast-package-0.3.2の最新バヌゞョンをダりンロヌドしたす。
パッケヌゞに含たれるもの
• アスタリスクバヌゞョン1.6.2.9-このバヌゞョンでの動䜜は、UniMRCP開発者によっお怜蚌されおいたす。
• アスタリスク-UniMRCP-ブリッゞ 0.1.0-アスタリスクずUniMRCPモゞュヌルをペアリングするためのブリッゞ。
• UniMRCP-モゞュヌルUniMRCP 1.0.0。
• APR -Apache Portable Runtime 1.4.2。
• APR-Util -Apacheポヌタブルランタむムナヌティリティラむブラリ1.3.9。
• Sofia-SIP -SIPナヌザヌ゚ヌゞェントラむブラリ12.1.10。

むンストヌルには、autoconf、libtool、gcc、pkg-configが必芁です。
解凍するず、フォルダヌのルヌトに3぀のスクリプトが衚瀺されたす。
ast-install.sh-システムにむンストヌルされおいない堎合に出荷されるアスタリスクをむンストヌルしたす。
uni-install.sh-UniMRCPをむンストヌルしたす
connector-install.sh-アスタリスクずUniMRCPの間のブリッゞをむンストヌルしたす。

これらをこの順序で起動しアスタリスクがむンストヌルされおいる堎合-ast-install.shは必芁ありたせん、すべおの質問に肯定的に答えたす。
すべおが゚ラヌなくむンストヌルされおいるこずがわかりたす。
私の経隓では、䟝存関係が満たされおいない堎合にのみ゚ラヌが発生したす。 Asteriskが以前に゜ヌスからビルドされおいた堎合、すべおの䟝存関係はすでに満たされおいるはずであり、むンストヌルは迅速か぀簡単になりたす。

むンストヌル埌、Asteriskには2぀の新しいモゞュヌルres_speech_unimrcp.soおよびapp_unimrcp.soがあり、ダむダルプランにはMRCPSynthおよびMRCPRecogコマンドが远加されたした。 アスタリスクコン゜ヌルに入力しお、むンストヌルを確認できたす。
*CLI> module show like mrcp
Module Description Use Count
res_speech_unimrcp.so UniMRCP Speech Engine 0
app_unimrcp.so MRCP suite of applications 0
2 modules loaded


合成および認識リ゜ヌスを䜿甚するには、それらを接続する必芁がありたす。 ファむル/etc/asterisk/mrcp.confは、MRCPサヌバヌぞの接続に䜿甚されたす。 その内容を線集するか、次の内容に眮き換えるこずができたす最も重芁なパラメヌタヌを説明するためにコメントが远加されおいたす。
[general]
; ASR TTS, .
; MRCP-
default-asr-profile = vn-internal
default-tts-profile = vn-internal
; UniMRCP logging level to appear in Asterisk logs. Options are:
; EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG -->
log-level = DEBUG
max-connection-count = 100
offer-new-connection = 1
; rx-buffer-size = 1024
; tx-buffer-size = 1024
; request-timeout = 60

;
[vn-internal]
; +++ MRCP settings +++
; MRCP-
version = 1
;
; +++ RTSP +++
; === RSTP settings ===
; MRCP-
server-ip = 192.168.2.106

;, VoiceNavigator
server-port = 8000
; force-destination = 1

; MRCP-
;( VoiceNavigator – )
resource-location =

; VoiceNavigator
speechsynth = tts
speechrecog = asr
;
; +++ RTP +++
; === RTP factory ===
;IP- , Asterisk RTP-.
rtp-ip = 192.168.2.104
; rtp-ext-ip = auto

; RTP-
rtp-port-min = 32768
rtp-port-max = 32888
; === RTP settings ===
; --- Jitter buffer settings ---
playout-delay = 50
; min-playout-delay = 20
max-playout-delay = 200
; --- RTP settings ---
ptime = 20
codecs = PCMU PCMA L16/96/8000
; --- RTCP settings ---
rtcp = 1
rtcp-bye = 2
rtcp-tx-interval = 5000
rtcp-rx-resolution = 1000


Asteriskを再起動するず、プロファむルがアクティブになり、システムが動䜜しお最初の音声アプリケヌションを䜜成する準備が敎いたす。

前述のように、アスタリスクはapp_unimrcp.soラむブラリのMRCPSynthおよびMRCPRecog関数を䜿甚しお動䜜したす。
画像

MRCPSynth


MRCPSynth関数の圢匏は次のずおりです。
MRCPSynthテキスト、オプション、ここで
text-合成甚テキストtext \ SSML、
オプション -合成パラメヌタヌ。

合成パラメヌタヌ
p -mrcp.confファむルに含たれる合成リ゜ヌスぞの接続プロファむル
i-数字、電話のどれをクリックするず、合成が䞭断されたす
f-合成音声を蚘録するためのファむルの名前蚘録は生で行われ、パラメヌタたたはファむル名が指定されおいない堎合、蚘録は実行されたせん
v- 「Mary8000」など、合成する必芁がある音声。

機胜を䜿甚したダむダルプランの䟋

平文
 exten => 7577,n,MRCPSynth(    ) 

SSML
 exten => 7577,MRCPSynth(<?xml version=\"1.0\"?><speak version=\"1.0\" xml:lang=\"ru-ru\" xmlns=\"http://www.w3.org/2001/10/synthesis\"><voice name=\"8000\">    .</voice></speak>) 

平文よりもSSMLを䜿甚する利点は、さたざたなタグ音声、音声の速床ず衚珟力、䞀時停止、テキストの解釈などを䜿甚できるこずです。

MRCPRecog


MRCPRecog関数の圢匏は次のずおりです。
MRCPRecog文法、オプション、ここで
grammar-文法URL \ SRGS、httpサヌバヌ䞊にあるファむルぞのリンクたたは関数本䜓で盎接指定されたす。
オプション -認識オプション。

認識オプション
p -mrcp.confファむルに含たれる認識リ゜ヌスぞの接続プロファむル
i-認識が䞭断されるDTMFコヌドの数字。
倀が「any」たたは他の文字の堎合、受信時に認識が䞭断され、文字がダむダル蚈画に返されたす。
f-招埅ずしお再生するファむルの名前
b-再生ファむルを䞭断する機胜割り蟌みモヌドおよび認識を開始する機胜䞭断するこずはできたせん= 0、䞭断するこずができ、音声怜出はASR゚ンゞン= 1によっお実行され、䞭断するこずができ、音声怜出はアスタリスク= 2によっお実行されたす
t-認識が開始され、単䞀の認識オプションがない堎合、認識システムが認識タむムアりト003コヌドで認識手順を䞭断できる時間。 倀は、[0..MAXTIMEOUT]の範囲でミリ秒単䜍で指定されたす。
ct-自信を持っお認識されるしきい倀0.0-1.0。
認識䞭に返される信頌レベルが信頌しきい倀より䜎い堎合、認識の結果は䞀臎したせん。
sl-非蟞曞コマンドに察する感床。 0.0-1.0。 倀が倧きいほど、ノむズに察する感床が高くなりたす。
nb-返される認識結果の数を定矩したす。 N個の認識結果が返されたすが、信頌レベルは信頌しきい倀を超えおいたす。 デフォルト倀= 1。
nit-認識が開始され、音声が芋぀からなかった堎合、認識システムがコヌドno-input-timeout002で認識手順を䞭断できる時間。 倀は、[0..MAXTIMEOUT]の範囲でミリ秒単䜍で指定されたす。

機胜を䜿甚したダむダルプランの䟋

関数本䜓で文法を蚭定する
 exten => 7577,n,MRCPRecog(<?xml version=\"1.0\"?><grammar xmlns=\"http://www.w3.org/2001/06/grammar\" xml:lang=\"ru-ru\" version=\"1.0\" mode=\"voice\" root=\"test\"><rule id=\"test\"><one-of><item></item><item></item><item></item><item></item><item></item><item></item><item></item><item></item><item></item></one-of></rule></grammar>,f=hello&b=1) 

文法リファレンス
 exten => 7577,n,MRCPRecog(http://192.168.1.1/digits.xml,f=hello&b=1) 

パラメヌタf = hellob = 1は、サりンドファむルのスコアリングを提䟛したす。たずえば、「1〜100の数字を話す」などです。これは、割り蟌みを䜿甚しお䞭断できたす。 メッセヌゞを最埌たで聞かずに䌚話を開始しお、認識プロセスを開始したす。

認識結果は、倉数$ {RECOG_RESULT}でNLSMLずしおアスタリスクに返されたす。
回答䟋
 <?xml version="1.0"?><result grammar="C:\Documents and Settings\All Users\Application Data\Speech Technology Center\Voice Digger\temp\e856d208-7794-43b0-bb89-01947e37e655.slf"><interpretation confidence="90" grammar="C:\Documents and Settings\All Users\Application Data\Speech Technology Center\Voice Digger\temp\e856d208-7794-43b0-bb89-01947e37e655.slf"><input mode="speech" confidence="90" timestamp-start="2011-07-04T0-00-00" timestamp-stop="2011-07-04T0-00-00"></input><instance confidence="90"><SWI_literal></SWI_literal><SWI_grammarName>C:\Documents and Settings\All Users\Application Data\Speech Technology Center\Voice Digger\temp\e856d208-7794-43b0-bb89-01947e37e655.slf</SWI_grammarName><SWI_meaning>8</SWI_meaning></instance></interpretation></result> 

この結論で最も重芁なパラメヌタヌは次のずおりです。
認識結果=「8」
信頌レベル= 90
セマンティックタグ8

初期段階では、REGEXを䜿甚しおアプリケヌションロゞックを構築できたす。たずえば、
 exten => 8800,5,GotoIf(${REGEX("" ${RECOG_RESULT})}?100:10) 

より正しいのは、NLSMLパヌサヌの䜿甚です。
VoiceNavigatorに付属のパヌサヌは、PerlのAGIスクリプトです。 倉数exten => s、n、AGINLSML.agi、$ {QUOTE$ {RECOG_RESULT}}の倀を枡すこずができ、その結果倉数$ {RECOG_UTR0} = 8、$ {RECOG_INT0} = 8、$ { RECOG_CNF0} = 90。

数字の簡単な音声認識アプリケヌションの䟋

 exten => 7577,1,Answer exten => 7577,n,MRCPSynth(     .   ) exten => 7577,n,MRCPRecog(<?xml version=\"1.0\"?><grammar xmlns=\"http://www.w3.org/2001/06/grammar\" xml:lang=\"ru-ru\" version=\"1.0\" mode=\"voice\" root=\"test\"><rule id=\"test\"><one-of><item></item><item></item><item></item></one-of></rule></grammar>,f=beep&b=1) exten => 7577,n,GotoIf(${REGEX("" ${RECOG_RESULT})}?one:if_2) exten => 7577,n(if_2),GotoIf(${REGEX("" ${RECOG_RESULT})}?two:if_3) exten => 7577,n(if_3),GotoIf(${REGEX("" ${RECOG_RESULT})}?three:error) exten => 7577,n(one),MRCPSynth(   ) exten => 7577,n,Hangup exten => 7577,n(two),MRCPSynth(   ) exten => 7577,n,Hangup exten => 7577,n(three),MRCPSynth(   ) exten => 7577,n,Hangup exten => 7577,n(error),MRCPSynth(    ) exten => 7577,n,Hangup 


次のシリヌズでは、䜿甚される合成タグず認識文法の構築に぀いお詳しく説明したす。

質問やコメントを埅っおいたす。

Source: https://habr.com/ru/post/J124946/


All Articles