在與各類(lèi)ASR等做對接時(shí),總避免不了有些ASR沒(méi)有一個(gè)更為標準的對接方式,有時(shí)就需要自己按mrcp協(xié)議去處理這些ASR識別引擎。
在這里我們采用unimrcp這個(gè)開(kāi)源項目來(lái)作為識別中間件,對FreeSWITCH的語(yǔ)音部分通過(guò)unimrcp送給ASR識別引擎,然后識別引擎再把結果送到unimrcp后,由unimrcp再回送到FreeSWITCH結構大致如下:

在以上的開(kāi)發(fā)流程中,我們結合了第三方語(yǔ)音機器人開(kāi)發(fā)公司上海寧衛的檢測模塊的業(yè)務(wù)流程處理,結合unimrcp和第三方的MRCP服務(wù)器進(jìn)行對接,ASR 服務(wù)器進(jìn)行識別處理。
本之間我們先介紹下unimrcp這個(gè)開(kāi)源項目。
這是一個(gè)基于RFC6787和RFC4463的跨平臺mrcp的輕量實(shí)現,其跨平臺是依賴(lài)apache apr庫,而FreeSwitch的跨平臺也是依賴(lài)于這一c實(shí)現庫。在unimrcp中,還有以下一些第三方庫:
- mpf - Media processing framework.
- mrcp - Implementation of MRCP basics (message, parser, resources).
- mrcpv2-transport - Implementation of the MRCPv2 transport layer.
- mrcp-signaling - Abstract MRCP signaling (session management) interface.
- mrcp-engine - Abstract resource engine interface.
- mrcp-client - Implementation of an MRCP client stack based on the abstract signaling interface.
- mrcp-server - Implementation of an MRCP server stack based on the abstract signaling and engine interfaces.
- uni-rtsp - Implementation of a minimal RTSP stack required for MRCPv1.
- Mrcp-sofia - Implementation of the abstract signaling interface using the SofiaSIP library.
以上的介紹都算是一些基本的知識要求,而在unimrcp如果要按我們的想法去實(shí)現相關(guān)的對接,則是去實(shí)現一個(gè)個(gè)的插件(plugin).在unimrcp中現在默認支持以下四種plugin:
- demo-synth - Implementation of a TTS plugin which simulates synthesis.
- demo-recog - Implementation of an ASR plugin which simulates recognition.
- demo-verif - Implementation of an SVI plugin which simulates speaker verification.
- mrcp-recorder - Implementation of a recorder plugin.
在我們現在的語(yǔ)音機器人開(kāi)發(fā)中,我們僅使用了語(yǔ)音識別功能和語(yǔ)音合成功能。當然,語(yǔ)音合成或TTS也可以使用其他第三方的模塊來(lái)進(jìn)行處理。在這里recorder(錄音)或verif(驗證)對我們暫時(shí)不需要,因為我們供助FreeSwitch來(lái)實(shí)現recorder更容易,而verif對我們來(lái)說(shuō),基本沒(méi)什么需求,都可以略過(guò)。那么我們講講如何實(shí)現和ASR進(jìn)行編程進(jìn)行對接。
在實(shí)現unimrcp的ASR插件時(shí),要按它的標準去實(shí)現一些接口或方法。
定義的結構體
MRCP引擎維護的方法:
static const struct mrcp_engine_method_vtable_t engine_vtable = {
demo_recog_engine_destroy,
demo_recog_engine_open,
demo_recog_engine_close,
demo_recog_engine_channel_create
};
這里其實(shí)就是聲明為函數的指針,其定義如下:
/** Table of MRCP engine virtual methods */
struct mrcp_engine_method_vtable_t {
apt_bool_t (*destroy)(mrcp_engine_t *engine);
apt_bool_t (*open)(mrcp_engine_t *engine);
apt_bool_t (*close)(mrcp_engine_t *engine);
mrcp_engine_channel_t* (*create_channel)(mrcp_engine_t *engine, apr_pool_t *pool);
};
按以上兩個(gè)定義,我們可以看到,實(shí)際上就是針對mrcp的通道建立、數據傳輸、關(guān)閉、釋放做對應的回調。
2. MRCP通道的維護方法:
static const struct mrcp_engine_channel_method_vtable_t channel_vtable = {
demo_recog_channel_destroy,
demo_recog_channel_open,
demo_recog_channel_close,
demo_recog_channel_request_process
};
同樣需要考慮這個(gè)mrcp_engine_channel_method_vtable_t結構的具體實(shí)現,其定義如下:
/** Table of channel virtual methods */
struct mrcp_engine_channel_method_vtable_t {
apt_bool_t (*destroy)(mrcp_engine_channel_t *channel);
apt_bool_t (*open)(mrcp_engine_channel_t *channel);
apt_bool_t (*close)(mrcp_engine_channel_t *channel);
apt_bool_t (*process_request)(mrcp_engine_channel_t *channel, mrcp_message_t *request);
};
通過(guò)以上這個(gè)結構體實(shí)現的方法,來(lái)完成對于識別通道的維護。
3. 針對音頻流的維護方法:
static const mpf_audio_stream_vtable_t audio_stream_vtable = {
demo_recog_stream_destroy,
NULL,
NULL,
NULL,
demo_recog_stream_open,
demo_recog_stream_close,
demo_recog_stream_write,
NULL
};
這是在mpf(media process framework)中定義的對于流媒體的處理接口要求,原結構:
/** Table of audio stream virtual methods */
struct mpf_audio_stream_vtable_t {
apt_bool_t (*destroy)(mpf_audio_stream_t *stream);
apt_bool_t (*open_rx)(mpf_audio_stream_t *stream, mpf_codec_t *codec);
apt_bool_t (*close_rx)(mpf_audio_stream_t *stream);
apt_bool_t (*read_frame)(mpf_audio_stream_t *stream, mpf_frame_t *frame);
apt_bool_t (*open_tx)(mpf_audio_stream_t *stream, mpf_codec_t *codec);
apt_bool_t (*close_tx)(mpf_audio_stream_t *stream);
apt_bool_t (*write_frame)(mpf_audio_stream_t *stream, const mpf_frame_t *frame);
void (*trace)(mpf_audio_stream_t *stream, mpf_stream_direction_e direction, apt_text_stream_t *output);
};
4. 接下來(lái)要實(shí)現一個(gè)引擎隊列維護對象
struct demo_recog_engine_t {
apt_consumer_task_t *task;
};
5. 需要明確聲明一個(gè)對通道進(jìn)行識別的一個(gè)具體的對象
struct demo_recog_channel_t {
demo_recog_engine_t *demo_engine;
mrcp_engine_channel_t *channel;
mrcp_message_t *recog_request;
mrcp_message_t *stop_response;
apt_bool_t timers_started;
mpf_activity_detector_t *detector;
FILE *audio_out;
};
這里需要注意的是這里可以定義定時(shí)器timers_started,用來(lái)配合detector這個(gè)mpf的特性來(lái)完成語(yǔ)音的有效或者說(shuō)活動(dòng)性檢測。
而audio_out可以完成錄音性的東西。
需要完成的方法
- demo_recog_engine_channel_create 用來(lái)創(chuàng )建一個(gè)要進(jìn)行識別的通道,基本以sip為主,通過(guò)信令來(lái)管理。
- demo_recog_stream_write 對于通過(guò)rtp送過(guò)來(lái)的數據,送給識別引擎進(jìn)行處理,更為大量的工作是在這里進(jìn)行處理。
- 通過(guò)業(yè)務(wù)邏輯對話(huà)術(shù)進(jìn)行處理和邏輯判斷。此部分的內容我們在后續的增加中會(huì )通過(guò)簡(jiǎn)單示例來(lái)演示如何使用MRCP協(xié)議實(shí)現外呼,通過(guò)語(yǔ)音識別結合語(yǔ)義匹配實(shí)現銀行催收業(yè)務(wù)和教育培訓業(yè)務(wù)的處理



unimrcp-MRCP協(xié)議學(xué)習分享,QQ群號:208136295
關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
freepbx 技術(shù)論壇:www.ippbx.org.cn
Asterisk, freepbx技術(shù)文檔: www.freepbx.org.cn
歐米(Omni)智能客服解決方案
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
Asterisk/FreePBX唯一中國官方合作伙伴