unimrcp

Posted by Deetch on May 18, 2020

“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               -->略

流程概述

  1. unimrcp服务启动,为每个pluginj创建一个APR线程运行,执行mrcp_plugin_create,xxx_recog_engine_open;
  2. 在mrcp_plugin_create设置task的vtable->process_msg = xxx_recog_msg_process;
  3. 当有请求过来,会回调xxx_recog_msg_process,判断消息类型是打开channel, 处理请求,关闭channel;如果是处理请求,进入xxx_recog_channel_request_dispatch,根据method_id进行处理;处理完毕后,会根据语音流回调unimrcp的流接口
  4. 在流接口中实现自己的语音识别请求任务;

##

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