微服务即时通信系统---(六)语音识别子服务
目录
功能设计
模块划分
业务接口/功能示意图
服务实现流程思想
服务代码实现
编写proto文件
服务端创建子类(SpeechRecognitionServiceImpl)完成RPC服务调用函数重写
SpeechRecognize(语音识别)
服务端完成语音识别子服务类(SpeechRecognitionServer)
注意
实例化服务类对象,启动服务
工程系统构建配置文件(CMakeLists.txt)
服务测试
本章节,主要对项目中语音识别子服务模块进行分析、开发与测试。
功能设计
语音识别子服务,通过调用语音识别SDK,进行语音识别,将识别后的文字返还给入口网关子服务即可,因此,提供的功能性接口只有一个:
语音消息的文字转换:客户端进行语音消息的文字转换。
模块划分
参数/配置文件解析模块 | 基于gflags框架直接使用,进行参数/配置文件的解析。 |
日志模块 | 基于spdlog封装的logger 直接进行日志输出。 |
服务注册模块 | 基于etcd框架封装的注册模块 直接进行语音识别子服务模块的服务注册。 |
RPC服务模块 | 基于brpc框架 搭建语音识别子服务的RPC服务器。 |
语音识别SDK | 基于百度云的语音识别SDK框架封装的识别模块,进行语音识别文字。 |
业务接口/功能示意图
服务实现流程思想
1、编写服务所需的proto文件,利用protoc工具生成RPC服务器所需的.pb.h 和 .pb.cc 项目文件。 |
2、服务端 创建子类,继承于proto文件中RPC调用类,并进行功能性接口函数重写。 |
3、服务端 完成语音识别子服务类。 |
4、实例化 服务类对象,启动服务。 |
服务代码实现
编写proto文件
speech请求(SpeechRecognitionReq)包含成员:
1、请求ID:用于标识该请求的唯一性。
2、语音数据:存放语音文件数据(以byte的方式存放)。
3、用户ID:标识用户,便于后续网关服务器响应用户。
4、用户登陆会话ID:用于网关进行用户身份鉴权,识别用户是否登陆。(此处用不上,为了代码大一统,添上)
speech应答(SpeechRecognitionResp)包含成员:
1、请求ID:对应请求中的请求ID,标识请求唯一性。
2、成功标识:标识该次请求的处理结果。
3、错误信息(optional):如果处理出错,记录出错信息。
4、语音文字数据(optional):如果处理成功,存放转换后的文字数据。
RPC服务器(SpeechRecognitionService)提供接口:
1、SpeechRecognition (SpeechRecognitionReq) returns (SpeechRecognitionResp)。
proto文件(speechRecognition.proto):
syntax="proto3";
package yangz;
option cc_generic_services = true;
// SpeechRecognitionReq
message SpeechRecognitionReq
{
string req_id = 1;
bytes speech_data = 2;
string user_id = 3;
optional string login_session_id = 4;
};
// SpeechRecognitionResp
message SpeechRecognitionResp
{
string req_id = 1;
bool success = 2;
optional string err_msg = 3;
optional string speech_character_data = 4;
};
// SpeechRecognitionService
service SpeechRecognitionService
{
rpc SpeechRecognize(SpeechRecognitionReq) returns (SpeechRecognitionResp);
};
服务端创建子类(SpeechRecognitionServiceImpl)完成RPC服务调用函数重写
SpeechRecognize(语音识别)
实现流程:
1、接收请求,获取语音数据。
2、调用基于语音识别SDK封装的框架,获取识别后的文本内容。
3、组织响应进行返回。
speechRecognitionServer.hpp:
// 创建子类, 继承于SpeechRecognitionService, 完成功能性接口的实现
class SpeechRecognitionServiceImpl : public yangz::SpeechRecognitionService
{
public:
SpeechRecognitionServiceImpl(const yangz::SpeechRecognitionClient::ptr &src_client)
: _src_client(src_client)
{
}
~SpeechRecognitionServiceImpl() {}