“Let’s go”
plugin函数流程
启动unimrcp服务,会执行
mrcp_plugin_create -->做认证操作
xxx_recog_engine_open
调用识别时,会执行
1. mrcp_plugin_create ----> 创建mrcp_engine, xxx_recog_engine对象;并设置处理消息的回调函数vtable->process_msg = recog_msg_process
2. recog_engine_open ----> 打开engine
-------------------------------------------------------------------------------
1. engine_channel_create ----> 初始化channel相关数据
2. recog_channel_open ----> 发布RECOG_MSG_OPEN_CHANNEL消息,进入recog_msg_process;
3. recog_msg_process ----> 这里会收到消息(OPEN_CHANNEL, CLOSE_CHANNEL, REQUEST_PROCESS);REQUEST_PROCESS消息会进入recog_channel_request_dispatch
a. OPEN_CHANNEL
b. CLOSE_CHANNEL
c. REQUEST_PROCESS : 由channel_request_process发布这个消息,收到识别请求
4. recog_channel_request_dispatch ---> 根据mrcp_message.start_line.method.id处理任务;
a. RECOGNIZER_START_INPUT_TIMERS : recog_channel_timers_start()
b. RECOGNIZER_STOP : recog_channel_stop() --> 做一些与识别服务之间的连接释放
c. RECOGNIZER_RECOGNIZE: recog_channel_recognize() -->收到识别请求,设置recog_channel->recog_request;初始化识别任务,比如websocket连接,文本帧发送;
-------------------------------------------------------------------------------
音频流交互
1. recog_stream_write ---->收到音频流,发送给识别服务,并根据vad状态调用不同接口
a. MPF_DETECTOR_EVENT_ACTIVITY ---->检测有效音频, 调用recog_start_of_input,封装mrcp消息发送;
b. MPF_DETECTOR_EVENT_INACTIVITY ---->未检测到有效音频,调用demo_recog_recognition_complete(RECOGNIZER_COMPLETION_CAUSE_SUCCESS),认为一次识别请求结束,调用result_load,封装识别结果返回给调用者;
c. MPF_DETECTOR_EVENT_NOINPUT ---->检测到没有输入,调用demo_recog_recognition_complete(RECOGNIZER_COMPLETION_CAUSE_NO_INPUT_TIMEOUT);
xxx_recog_engine_channel_create --> 需要给自己定义的channel分配内存
xxx_recog_stream_open --> 略
xxx_recog_channel_open --> 略
xxx_recog_stream_write --> 需要自定义,请求访问你的识别服务的逻辑;
xxx_recog_stream_recog --> 这是访问你的识别服务的逻辑
xxx_recog_msg_signal --> 略
xxx_recog_msg_process --> 略
xxx_recog_channel_request_process --> 略
xxx_recog_msg_signal
xxx_recog_msg_process
xxx_recog_channel_request_dispatch --> 略
xxx_recog_channel_request_process
xxx_recog_msg_signal
xxx_recog_msg_process
xxx_recog_channel_request_dispatch
xxx_recog_channel_recognize -->略,可以定制,处理一些请求头
xxx_recog_stream_write
xxx_recog_stream_recog
...
xxx_recog_stream_write
xxx_recog_stream_recog
xxx_recog_start_of_input -->略
xxx_recog_stream_write
xxx_recog_stream_recog
...
xxx_recog_stream_write
xxx_recog_stream_recog
xxx_recog_recognition_complete -->识别音频结束,在该方法里发送空帧通知识别服务,并等待识别结果,最后释放识别资源
xxx_recog_stream_recog
xxx_recog_end_session
xxx_recog_result_load -->封装识别结果
xxx_recog_stream_close -->略
xxx_recog_channel_close -->略
xxx_recog_msg_signal
xxx_recog_msg_process
xxx_recog_channel_destroy -->略
流程概述
- unimrcp服务启动,为每个pluginj创建一个APR线程运行,执行mrcp_plugin_create,xxx_recog_engine_open;
- 在mrcp_plugin_create设置task的vtable->process_msg = xxx_recog_msg_process;
- 当有请求过来,会回调xxx_recog_msg_process,判断消息类型是打开channel, 处理请求,关闭channel;如果是处理请求,进入xxx_recog_channel_request_dispatch,根据method_id进行处理;处理完毕后,会根据语音流回调unimrcp的流接口
- 在流接口中实现自己的语音识别请求任务;
##
struct mrcp_engine_channel_event_vtable_t {
/** Open event handler */
apt_bool_t (*on_open)(mrcp_engine_channel_t *channel, apt_bool_t status);
/** Close event handler */
apt_bool_t (*on_close)(mrcp_engine_channel_t *channel);
/** Message event handler */
apt_bool_t (*on_message)(mrcp_engine_channel_t *channel, mrcp_message_t *message);
};
mrcp_engine_channel_message_send(channel,response)
1. mrcp_engine_channel_t->event_vtable->on_message(mrcp_engine_channel_t,message);
2. mrcp_server_channel_task_msg_signal()
aispeech_recog_msg_signal(AISPEECH_RECOG_MSG_OPEN_CHANNEL,channel,NULL) --> apt_task_msg_signal