1、在討論媒體處理類型時(shí),我們以前也討論了SSML的描述語法。這些語法可以支持不同的媒體處理類型和能力。首先,我們介紹一下兩個(gè)媒體資源類型所支持的SSML語法格式,請求方法,事件消息,狀態(tài)機(jī)和一些特別的頭域。
下面的列表中列出了兩種媒體資源類型所支持的相應(yīng)的SSML要素以及輸入格式。
語音合成的媒體資源類型支持七個(gè)請求消息和兩個(gè)事件消息。七個(gè)請求的method分別是:
兩個(gè)事件消息分別是:
語音合成媒體資源支持一個(gè)狀態(tài)機(jī)。狀態(tài)機(jī)是由MRCP的客戶端來發(fā)起驅(qū)動(dòng),媒體資源自己本身則產(chǎn)生事件消息。
支持的各種特別的頭域列表:
2、現(xiàn)在,我們討論一下經(jīng)常使用的具體的method方法。SPEAK method 有兩個(gè)目的: 提供語音合成的輸入,然后快速發(fā)起語音合成和媒體流數(shù)據(jù)。在SPEAK請求消息體中可包含:
- inline 的SSML描述語法(application/ssml+xml);
- 外部SSML的URL或文本列表;
- inline的文本或多外部的消息;
3、合成媒體資源使用的是先進(jìn)先出的隊(duì)列處理機(jī)制,因此處理過程是按照順序執(zhí)行,接收順序也是如此。當(dāng)媒體資源接收到SPEAK請求時(shí),如果媒體資源在空閑狀態(tài),回復(fù)的響應(yīng)請求狀態(tài)則是IN-PROGRESS 的消息;如果媒體資源是在講話狀態(tài)或暫停狀態(tài)時(shí),響應(yīng)的請求返回消息則是PENDING,表示此請求正在隊(duì)列中。這里讀者要注意,在合成請求中使用的一些語音參數(shù)是具有一定優(yōu)先級的。最高優(yōu)先級的是SSML描述語言,其次是SEPAK 請求中的相關(guān)語音參數(shù):Voice-,Prosody-,Speaker-Profile 和 Speech-Language 頭;最低優(yōu)先級是會(huì)話默認(rèn)值,它們使用SET-PARAMS和其接下來的后續(xù)method請求。以下是一個(gè)SPEAK請求示例圖:
其相應(yīng)的客戶端到服務(wù)器端響應(yīng)消息如下:
F1(client→speechsynth):
- MRCP/2.0338 SPEAK 3214
- Channel-Identifier:23eb10a@speechsynth
- Content-Type: application/ssml+xml
- Content-Length: 213
- <?xml version="1.0" encoding="UTF-8"?>
- <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
- xml:lang="en-US">
- Please leave a message after the beep.
- <audio src="beep.wav"/>
- </speak>
F2 (speechsynth → client)的回復(fù)消息如下:
- MRCP/2.0 119 3214 200 IN-PROGRESS
- Channel-Identifier: 23eb10a@speechsynth
- Speech-Marker: timestamp=857206027059
- MRCP/2.0 156 SPEAK-COMPLETE 3214 COMPLETE
- Channel-Identifier: 23eb10a@speechsynth
- Speech-Marker: timestamp=861500994355
- Completion-Cause: 000 normal
4。如果MRCP客戶端對語音資源媒體講話表示一些內(nèi)容命令時(shí),PAUSE請求method可以用來支持對合成媒體資源發(fā)出暫停語音輸出的請求。當(dāng)語音輸出暫停以后,媒體資源會(huì)響應(yīng)一個(gè)帶200 OK的狀態(tài)碼。如果在一個(gè)會(huì)話中,發(fā)出PAUSE 請求后,SPEAK不是一個(gè)活動(dòng)的狀態(tài),媒體資源服務(wù)器端必須對客戶端返回一個(gè)帶“Method not valid in this state” 的402 錯(cuò)誤狀態(tài)碼。如果SPEAK請求是在活動(dòng)狀態(tài)時(shí),服務(wù)器端則必須返回一個(gè)Active-Request-Id-List,這個(gè)頭包含已被暫停的SPEAK 請求ID(注意,F(xiàn)4)。以下是一個(gè)暫停的示例圖:
相應(yīng)的PAUSE 請求消息流程圖如下:
F1 (client → speechsynth):
- MRCP/2.0 187 SPEAK 3215
- Channel-Identifier: 23eb10a@speechsynth
- Content-Type: text/uri-list
- Content-Length: 70
- http://www.example.com/file01.ssml
- http://www.example.com/file02.ssml
F2 (speechsynth → client):
- MRCP/2.0 118 3215 200 IN-PROGRESS
- Channel-Identifier: 23eb10a@speechsynth
- Speech-Marker: timestamp=857206027059
F3 (client → speechsynth):
- MRCP/2.0 67 PAUSE 3216
- Channel-Identifier: 23eb10a@speechsynth
F4 (speechsynth → client):
- MRCP/2.0 105 3216 200 COMPLETE
- Channel-Identifier: 23eb10a@speechsynth
- Active-Request-Id-List: 3215
5、RESUME請求是對暫停的請求重啟。當(dāng)語音生產(chǎn)重啟后,服務(wù)器端會(huì)對客戶端返回一個(gè)200 消息。Active-Request-Id-List 頭中會(huì)說明重啟的請求ID(注意 F6)。當(dāng)服務(wù)器端處于空閑狀態(tài)時(shí),服務(wù)器收到RESUME 請求時(shí),它必須返回一個(gè)“402 Method not valid in this state” 消息。以下是一個(gè)重啟的示例圖:
這里,我們借用了前面的暫停消息流程,所以忽略了前面暫停的部分消息,僅展示重啟的消息流程(F5->F7)。
F5(client→speechsynth):
- MRCP/2.068 RESUME 3217
- Channel-Identifier:23eb10a@speechsynth
F6(speechsynth→client):
- MRCP/2.01053217200 COMPLETE
- Channel-Identifier:23eb10a@speechsynth
- Active-Request-Id-List:3215
F7(speechsynth→client):
- MRCP/2.0155SPEAK-COMPLETE 3215 COMPLETE
- Channel-Identifier:23eb10a@speechsynth
- Speech-Marker:timestamp=861500994355
- Completion-Cause:000 normal
6、STOP請求是對服務(wù)器端發(fā)出停止請求,通知服務(wù)器端停止處理語音輸出。如果在請求的消息中沒有攜帶Active-Request-Id-List,它說明在處理過程中的SPEAK請求已經(jīng)停止,任何在等待隊(duì)列中SPEAK請求已經(jīng)從隊(duì)列中移除。如果一個(gè)STOP請求成功停止了一個(gè)或多個(gè)PENDING 或IN-PROGRESS SPEAK 請求,則返回一個(gè)200 Success,并且在返回的200 消息中包含通過Active-Request-Id-List列出已經(jīng)成功停止的請求ID。以下是一個(gè)STOP 請求的示例圖:
F1(client→speechsynth):
MRCP/2.0143 SPEAK 4000
Channel-Identifier:23eb10a@speechsynth
Content-Type:text/plain
Content-Length:28
Thankyou.Pleasecallagain.
F2(speechsynth→client):
MRCP/2.0122 4000 200 IN-PROGRESS
Channel-Identifier:23eb10a@speechsynth
Speech-Marker:timestamp=857206027059
F3(client→speechsynth):
MRCP/2.066 STOP 4001
Channel-Identifier:23eb10a@speechsynth
F4(speechsynth→client):
MRCP/2.0145 4001 200 COMPLETE
Channel-Identifier:23eb10a@speechsynth
Speech-Marker:timestamp=861500994355
Active-Request-Id-List:4000
7、如果當(dāng)一個(gè)活動(dòng)的SPEAK請求中攜帶了頭Kill-On-Barge-In, 并且這個(gè)值設(shè)置為true的時(shí)候,BARGE-IN-OCCURRED請求會(huì)明確執(zhí)行一個(gè)對STOP 請求的操作。BARGE-IN-OCCURRED的目的是MRCP 客戶端對媒體資源服務(wù)器端通信時(shí),對服務(wù)器端發(fā)出的一個(gè)輸入事件,例如摁了DTMF按鍵或說話輸入觸發(fā)了收入的事件。語音合成資源服務(wù)器則根據(jù)輸入的數(shù)據(jù)來決定是否執(zhí)行結(jié)束輸入的流程。BARGE-IN-OCCURRED 打斷可以使用在以下兩種場景中:
- 語音識別引擎和語音合成資源是各自獨(dú)立的。
- 語音識別引擎和語音合成資源耦合度非常高,它們之間需要緊密配合。通?赡苁峭粡S家的產(chǎn)品。
在以上的使用場景中,MRCP客戶端的工作方式類似于一個(gè)proxy 代理的方式。它從服務(wù)器端接收到一個(gè)START-OF-INPUT事件,然后馬上對服務(wù)器端發(fā)送一個(gè)BARGE-IN-OCCURRED 打斷事件。如果是兩個(gè)服務(wù)器耦合度非常高的話,在接下來的由客戶端發(fā)出的BARGE-IN-OCCURRED請求中,MRCP客戶端會(huì)添加一個(gè)Proxy-Sync-Id 頭。如果服務(wù)器端已經(jīng)開始處理打斷事件的話,這個(gè)頭會(huì)支持服務(wù)器端來決定進(jìn)一步的處理流程。在MRCP這樣的設(shè)計(jì)的目的就是MRCP客戶端無需獲悉MRCP服務(wù)器端是否直接在服務(wù)器使用了打斷的流程。
如果BARGE-IN-OCCURRED請求導(dǎo)致一個(gè)或多個(gè)SPEAK請求結(jié)束時(shí),服務(wù)器端會(huì)返回一個(gè) 200 Success, 并且包含一個(gè)Active-Request-Id-List頭來通知結(jié)束的請求ID。如果沒有結(jié)束SPEAK 請求的話,服務(wù)器端仍然返回200 Success,當(dāng)然不會(huì)包含任何Active-Request-Id-List頭值。以下示例是一個(gè)打斷過示例圖:
這里,我們假設(shè)語音識別已經(jīng)通過RECOGNIZE 開啟了識別的請求狀態(tài),這里沒有顯示。“internal barge-in message”使用在語音識別和合成服務(wù)器耦合工作的狀態(tài)中,F(xiàn)在讓我們看一下具體的消息發(fā)送流程:
F1 (client → speechsynth):
MRCP/2.0 376 SPEAK 9200
Channel-Identifier: 23eb10a@speechsynth
Content-Type: application/ssml+xml
Content-Length: 251
<?xml version="1.0" encoding="UTF-8"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xml:lang="en-US">
Here is your track. You may pause at anytime by simply
saying pause.
<audio src="track01.wav"/>
</speak>
F2 (speechsynth → client):
MRCP/2.0 118 9200 200 IN-PROGRESS
Channel-Identifier: 23eb10a@speechsynth
Speech-Marker: timestamp=857206027059
F3 (speechrecog → client):
MRCP/2.0 134 START-OF-INPUT 10001 IN-PROGRESS
Channel-Identifier:a123c31f@speechrecog
Input-Type:speechProxy-Sync-Id:392812
F4(client→speechsynth):
MRCP/2.0103 BARGE-IN-OCCURRED 9201
Channel-Identifier:23eb10a@speechsynth
Proxy-Sync-Id:392812
F5(speechsynth→client):
MRCP/2.01449201 200 COMPLETE
Channel-Identifier:23eb10a@speechsynth
Speech-Marker:timestamp=861500994355
Active-Request-Id-List:9200
8、CONTROL請求是從客戶端發(fā)出的命令,通知語音合成資源服務(wù)器客戶端需要對客戶端說出的說話語音數(shù)據(jù)進(jìn)行修改。簡單來說,就是客戶端通知語音合成服務(wù)器對剛才已說語音修改通知,可能客戶端對前面講話需要調(diào)整相關(guān)數(shù)據(jù),例如可能調(diào)整說話人速度,說話人其他參數(shù)(Voice-或者Prosody-)等。這個(gè)調(diào)整可能完全取決于語音合成服務(wù)器端的功能支持,調(diào)整參數(shù)的設(shè)置通過CONTROL請求中添加頭值Jump-Size 來實(shí)現(xiàn)。注意,它僅能支持IN-PROGRESS SPEAK 請求。
如果CONTROL應(yīng)用到了SPEAK請求中,服務(wù)器端回復(fù)一個(gè)200 Success消息,消息中包含Active-Request-Id-List 頭,而且?guī)б粋(gè)活動(dòng)的SPEAK 請求的ID。這個(gè)ID表示應(yīng)用了CONTROL的ID。如果CONTROL發(fā)出以后,沒有任何SPEAK請求是在IN-PROGRESS 狀態(tài)的話,服務(wù)器端返回一個(gè)“402 Method not valid in this state”。
這里有一個(gè)比較特別的情況需要大家注意。當(dāng)MRCP 客戶端在CONTROL請求中設(shè)定了Jump-Size 頭時(shí),此跳轉(zhuǎn)超過了當(dāng)前SPEAK請求起始值時(shí),這個(gè)活動(dòng)的請求會(huì)重新從起始值啟動(dòng),并且在響應(yīng)中包含一個(gè)Speak-Restart 為true的頭。同樣,當(dāng)MRCP 客戶端在CONTROL請求中設(shè)定了Jump-Size 頭時(shí),此跳轉(zhuǎn)超過了當(dāng)前SPEAK請求結(jié)束值時(shí),這個(gè)活動(dòng)的請求會(huì)馬上結(jié)束,攜帶了一個(gè)SPEAK-COMPLETE事件。以下是一個(gè)CONTROL的示例圖:
具體的CONTROL的消息流程如下:
F1(client→speechsynth):
MRCP/2.0529 SPEAK 5000
Channel-Identifier:23eb10a@speechsynth
Content-Type:multipart/mixed;
boundary=0a23bf1020
Content-Length:388--0a23bf1020
Content-Type: text/uri-list
Content-Length: 32
http://www.example.com/menu.ssml
--0a23bf1020
Content-Type: application/ssml+xml
Content-Length: 198
<?xml version="1.0" encoding="UTF-8"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xml:lang="en-US">
Say operator to speak with a customer representative
</speak>
--0a23bf1020--
F2 (speechsynth → client):
MRCP/2.0 118 5000 200 IN-PROGRESS
Channel-Identifier: 23eb10a@speechsynth
Speech-Marker: timestamp=857206027059
F3 (client → speechsynth):
MRCP/2.0 114 CONTROL 5001
Channel-Identifier: 23eb10a@speechsynth
Jump-Size: +3 Second
Prosody-volume:+20%
F4(speechsynth→client):
MRCP/2.01455001 200 COMPLETE
Channel-Identifier:23eb10a@speechsynth
Active-Request-Id-List:5000
Speech-Marker:timestamp=861500994355
F5(speechsynth→client):
MRCP/2.0156 SPEAK-COMPLETE 5000 CO MPLETE
Channel-Identifier:23eb10a@speechsynthSpeech-Marker:timestamp=865795961651
Completion-Cause:000normal
9、DEFINE-LEXICON 請求是客戶端要求語音合成資源服務(wù)器加載或卸載此會(huì)話中的語法文件。DEFINE-LEXICON請求發(fā)出后,它要求當(dāng)語音合成資源服務(wù)器在空閑狀態(tài)時(shí),加載一些可能出現(xiàn)的大容量的語法文件。在請求中使用Load-Lexicon 頭來表示加載語法文件,這里默認(rèn)設(shè)置問true,表示默認(rèn)加載;如果是false,則表示下載語法文件。語法文件的數(shù)據(jù)格式可以支持在消息體中的inline的消息數(shù)據(jù),也可以使用外部的URL(text/uri-list)支持外部的數(shù)據(jù)格式。如果DEFINE-LEXICON 請求失敗的話,例如,因?yàn)槠脚_(tái)的不同導(dǎo)致的語法格式不支持或者訪問出現(xiàn)問題的話,則會(huì)返回一個(gè)407 錯(cuò)誤狀態(tài)碼(407 Method or operation failed)。
如果MRCP客戶端需要加載多個(gè)語法文件的話,可以通過SPEAK請求,在請求中通過Lexicon-Search-Order頭來設(shè)定。頭值中可以包含外部URL或session:URIs(引入inline 數(shù)據(jù))。注意,加載語法文件時(shí),SSML語法文件的優(yōu)先級會(huì)高于Lexicon-Search-Order 設(shè)定的優(yōu)先級。以下是一個(gè)DEFINE-LEXICON的示例圖:
我們通過一個(gè)DEFINE-LEXICON的請求響應(yīng)流程來整個(gè)說明消息流程:
F1(client→speechsynth):
MRCP/2.0468 DEFINE-LEXICON 6999
Channel-Identifier:23eb10a@speechsynth
Content-ID:names@example.com
Content-Type:application/pls+xml
Content-Length:302<?xmlversion="1.0"encoding="UTF-8"?>
F2 (speechsynth → client):
MRCP/2.0 74 6999 200 COMPLETE
Channel-Identifier: 23eb10a@speechsynth
F3 (client → speechsynth):
MRCP/2.0 362 SPEAK 7000
Channel-Identifier: 23eb10a@speechsynth
Lexicon-Search-Order: <session:names@example.com>
Content-Type: application/ssml+xml
Content-Length: 184
<?xml version="1.0" encoding="UTF-8"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xml:lang="en-US">
You have a new message from Francesca.
</speak>
F4(speechsynth→client):
MRCP/2.01187000 200 IN-PROGRESS
Channel-Identifier:23eb10a@speechsynth
Speech-Marker:timestamp=857206027059
F5(speechsynth→client):
MRCP/2.0156 SPEAK-COMPLETE 7000 COMPLETE
Channel-Identifier:23eb10a@speechsynth
Speech-Marker:timestamp=861500994355
Completion-Cause:000 normal
在今天的章節(jié)中,我們主要介紹了媒體資源請求的處理流程。MRCP 請求處理包含了七個(gè)主要的請求方式,我們針對這七個(gè)請求方式通過每個(gè)請求的基本介紹,錯(cuò)誤碼,并且結(jié)合示例圖和請求的流程消息來加以完整的說明。
在接下來的部分章節(jié)中,我們繼續(xù)介紹媒體資源的事件和一些頭域值參數(shù)設(shè)置。
unimrcp-MRCP協(xié)議學(xué)習(xí)分享,QQ群號:208136295
關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的行業(yè)分享
freepbx 技術(shù)論壇:www.ippbx.org.cn
Asterisk, freepbx技術(shù)文檔: www.freepbx.org.cn
歐米(Omni)智能客服解決方案
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
unimrcp-MRCP協(xié)議學(xué)習(xí)分享,QQ群號:208136295
關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的行業(yè)分享
freepbx 技術(shù)論壇:www.ippbx.org.cn
Asterisk, freepbx技術(shù)文檔: www.freepbx.org.cn
歐米(Omni)智能客服解決方案
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com