IM项目-----语音识别子服务

news2024/9/20 12:08:06

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、搭建思想
  • 二、服务器搭建
    • 1.继承speechService类,重写业务代码
    • 2.编写语音识别服务器类
    • 3.建造者类编写
  • 三.测试


前言

语音转换子服务,用于调用语音识别 SDK,进行语音识别,将语音转为文字后返回给网关。

  1. 语音消息的文字转换:客户端进行语音消息的文字转换。

在这里插入图片描述


一、搭建思想

1.参数解析 – 基于gflags模块
rpc所需信息:
当前服务器的地址端口:用于搭建rpc服务器的监听地址信息

服务注册所需信息:
注册中心的地址端口:用于进行向服务注册中心进行服务注册

外部访问的地址端口:用于告诉注册中心的访问地址信息

语音识别平台所需信息
(app id,api key,secret key)

日志模块所需信息:
运行模式,日志文件名称,日志输出级别

2.初始化日志模块
3.搭建RPC服务器–实现语音识别业务接口功能
4.向注册中心进行服务注册

在这里插入图片描述

二、服务器搭建

1.继承speechService类,重写业务代码

只有一个rpc服务,就是进行语音识别,请求方需要将语音文件内容发送过来,我们在需要调用语音识别sdk,因此在成员变量中有一个ASRClient。这个变量是在make_rpc时传入进来的,在创建rpc时需要添加服务。

//1.继承SpeechService服务类,重写业务方法
    class SpeechServiceImpl :public SpeechService
    {
    public:
        SpeechServiceImpl(const ASRClient::ptr& _asr_client)
            :_client(_asr_client)
        {

        }

        ~SpeechServiceImpl(){};

        //重写业务方法
        void SpeechRecognition(google::protobuf::RpcController* controller,
                        const ::lkm_im::SpeechRecognitionReq* request,
                        ::lkm_im::SpeechRecognitionRsp* response,
                        ::google::protobuf::Closure* done)
        {
            brpc::ClosureGuard rpc_guard(done);
            
            //解析出请求中的语音数据
            //基于语音识别sdk进行语音识别调用,获取语音转文字结果
            std::string err_msg;
            std::string resp = _client->recognize(request->speech_content(),err_msg);
            if(resp.empty()){
                //语音转文字失败
                LOG_ERROR("requestId = {} 语音识别失败.",request->request_id());
                response->set_request_id(request->request_id());
                response->set_success(false);
                response->set_errmsg(err_msg);
            }
            //构造响应返回
            response->set_request_id(request->request_id());
            response->set_success(true);
            response->set_recognition_result(resp);
        }
    private:
        ASRClient::ptr _client;     //语音识别客户端
    };

2.编写语音识别服务器类

在语音识别子服务中有三个对象,一个是服务注册对象,一个是语音识别对象,还有一个是rpc服务器。
服务注册对象的构建需要etcd服务器地址,注册的服务名称以及对应的主机地址。
语音识别对象的构建需要三个key.
rpc服务器构建需要rpc服务器监听的端口,还需要提供超时时间以及io线程数量.
构造这三个对象需要九个参数,因此我们使用建造者模式。

我们通过建造者类来构造这个对象,然后调用这个类提供的start方法,启动rpc服务器。

   //2.封装一个语音识别子服务服务器
    class SpeechServer
    {
    public:
    using ptr = std::shared_ptr<SpeechServer>;
        SpeechServer(const Registry::ptr& registry,const ASRClient::ptr& asr_client,const std::shared_ptr<brpc::Server>& server)
            :_registry(registry),_asr_client(asr_client),_server(server)
        {

        }
        ~SpeechServer(){}

        //启动rpc服务器
        void start()
        {
            _server->RunUntilAskedToQuit();
        }
    private:
        Registry::ptr _registry;    //服务注册对象
        ASRClient::ptr _asr_client;     //语音识别客户端
        std::shared_ptr<brpc::Server> _server;        //rpc服务器
    };

3.建造者类编写

这个类提供了三个方法make_**(),需要先调用这个三个方法,来分别构造出rpc服务器,服务注册和语音识别客户端。在调用build方法,生成一个speechServer对象,通过这个对象就可以启动服务器。

在构造服务注册对象时,就会向etcd进行服务注册。

//建造者类,具体思想是通过建造者类的build函数构造一个SpeechServer对象,通过这个对象启动rpc服务器
    class SpeechServerBuilder
    {
    public:
        void make_registry(const std::string& etcd_host,const std::string& service_name,const std::string& service_host)
        {
            _registry = std::make_shared<Registry>(etcd_host);
            //进行服务注册
            _registry->registry(service_name,service_host);
        }

        void make_asr(const std::string &app_id,const std::string &api_key,const std::string &secret_key)
        {
            _asr_client = std::make_shared<ASRClient>(app_id,api_key,secret_key);
        }

        void make_brpc(uint16_t port, int32_t timeout = -1, uint8_t num_threads = 1)
        {
            if(!_asr_client){
                LOG_ERROR("语音识别客户端未构造");
                abort();
            }

            //创建brpc服务器对象
            _server = std::make_shared<brpc::Server>();
            //添加服务
            SpeechServiceImpl *SpeechService = new SpeechServiceImpl(_asr_client);    //把这个对象的交给_server释放
            int ret = _server->AddService(SpeechService,brpc::ServiceOwnership::SERVER_OWNS_SERVICE);
            if (ret == -1) {
                LOG_ERROR("添加rpc服务失败");
                abort();
            }

            brpc::ServerOptions options;
            options.idle_timeout_sec = timeout;
            options.num_threads = num_threads;
            ret = _server->Start(port,&options);
            if(ret == -1){
                LOG_ERROR("rpc服务器启动失败");
                abort();
            }
        }


        SpeechServer::ptr build()
        {
            if(!_registry){
                LOG_ERROR("服务注册客户端对象未构造");
                abort();
            }
            if(!_asr_client){
                LOG_ERROR("语音识别客户端未构造");
                abort();
            }
            if(!_server){
                LOG_ERROR("rpc服务器对象未构造");
                abort();
            }

            SpeechServer::ptr speechServer = std::make_shared<SpeechServer>(_registry,_asr_client,_server);
            return speechServer;
        }
    private:
        Registry::ptr _registry;    //服务注册对象
        ASRClient::ptr _asr_client;     //语音识别客户端
        std::shared_ptr<brpc::Server> _server;        //rpc服务器
    };

三.测试

#include "speech_server.hpp"

DEFINE_bool(run_mode, false, "程序的运行模式,false-调试; true-发布;");
DEFINE_string(log_file, "", "发布模式下,用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下,用于指定日志输出等级");

DEFINE_string(etcd_host, "127.0.0.1:2379", "注册中心主机地址");
DEFINE_string(base_service, "/service", "服务监控根目录");
DEFINE_string(instance_name, "/speech_service/instance", "当前实例名称");
DEFINE_string(access_host, "127.0.0.1:10001", "当前实例的外部访问地址");

DEFINE_string(app_id, "115608644", "语音平台应用ID");
DEFINE_string(api_key, "GLQvgyNc4AaqhPfnDIMTRlw4", "语音平台API密钥");
DEFINE_string(secret_key, "vTcqDBswZUfAgjTcFA3GJGrc6yEWIO2w", "语音平台加密密钥");

DEFINE_int32(rpc_port,10001,"rpc服务器监听端口");   //必须和access_host端口一致

int main(int argc,char*argv[])
{
    google::ParseCommandLineFlags(&argc, &argv, true);
    lkm_im::init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);

    lkm_im::SpeechServerBuilder ssb;
    ssb.make_registry(FLAGS_etcd_host,FLAGS_base_service + FLAGS_instance_name,FLAGS_access_host);
    ssb.make_asr(FLAGS_app_id,FLAGS_api_key,FLAGS_secret_key);
    ssb.make_brpc(FLAGS_rpc_port);
    lkm_im::SpeechServer::ptr speechServer = ssb.build();
    speechServer->start();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节跳动算法岗面试亲历:高效流程大公开,通关诀窍全掌握

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 个人情况 985 本硕项目一个论文一篇无实习经历 时间节点 7.2 技术面一面 …

探索Python的聊天机器人世界:errbot库的神秘面纱

文章目录 探索Python的聊天机器人世界&#xff1a;errbot库的神秘面纱背景&#xff1a;为何选择errbot&#xff1f;errbot是什么&#xff1f;如何安装errbot&#xff1f;简单库函数使用方法1. 创建机器人2. 响应消息3. 处理私聊4. 定时任务5. 错误处理 场景应用1. 会议提醒2. 天…

sheng的学习笔记-AI-FOIL(First-Order Inductive Learner)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 规则学习&#xff08;rule learning&#xff09;: sheng的学习笔记-AI-规则学习&#xff08;rule learning&#xff09;-CSDN博客 序贯覆盖(sequential covering):sheng的学习笔记-AI-序贯覆盖(sequential covering) 基础…

Java 方法重写(难)

目录 1&#xff0e;A类和B类都写一个相同的方法&#xff0c;先用static&#xff0c;两边都是一样的&#xff1a; 2&#xff0e;A类和B类都去掉static&#xff0c;出现了两个圆圈的符号&#xff0c;代表重写&#xff1a; 3&#xff0e;总结 4&#xff0e;为什么需要重写&…

maven模块管理和继承聚合

1.分模块设计与开发 分模块即为不同的模块实现不同的功能&#xff0c;方便项目开发和部署。 如下图&#xff1a;pojo为实体模块&#xff0c;tlias为业务模块&#xff0c;utils为功能模块 要在tlias模块中使用其他两个模块&#xff0c;需要在pom文件中加入对应的依赖。 如图&…

【OceanBase诊断调优】—— obdiag 一条命令搞定卡合并问题根因分析

1. 背景 卡合并是一个OceanBase中较为复杂的问题&#xff0c;可能由各种问题引入导致。当前是否卡合并无明确定义&#xff0c;一方面我们认为超过36小时没合完是合并超时&#xff08;RS会报ERROR日志&#xff09;&#xff0c;另一方面用户可能自己判断合并超时&#xff08;根据…

探索AI大模型:从入门到精通的学习路径

每日一句正能量 其实许多波折不过是成功道上的荆棘路&#xff0c;纵然今天不如意&#xff0c;但我们还有未来。 前言 随着人工智能技术的快速发展&#xff0c;AI大模型学习正成为一项备受关注的研究领域。为了提高模型的准确性和效率&#xff0c;研究者们需要具备深厚的数学基…

pc远程控制软件有哪些?4款热门远程控制软件推荐,总有一款适合你!

在数字化转型的浪潮中&#xff0c;远程控制已成为企业提升运营效率、实现远程办公的不可或缺的工具。 正所谓 "运筹帷幄之中&#xff0c;决胜千里之外" &#xff0c;PC端远程控制软件让企业管理者和员工能够跨越地域限制&#xff0c;高效协同工作。 今天&#xff0c…

excel 单元格一直显示年月日

excel 单元格一直显示年月日&#xff0c;在单元格上右键选择单元格格式&#xff0c;选择日期时单元格会显示成日期格式

Flink 与 Kubernetes (K8s)、YARN 和 Mesos集成对比

Flink 与 Kubernetes (K8s)、YARN 和 Mesos 的紧密集成&#xff0c;是 Flink 能够在不同分布式环境中高效运行的关键特性。 Flink 提供了与这些资源管理系统的深度集成&#xff0c;以便在多种集群管理环境下提交、运行和管理 Flink 作业。Flink 与 K8s、YARN 和 Mesos 集成的详…

前后端独立部署的企业级私有化文档管理系统丨无忧·企业文档

大家好&#xff0c;我是软件部长&#xff0c;今天给大家介绍一款企业级在线知识库项目-JVS的无忧企业文档。 JVS提供低代码、物联网、规则引擎、智能BI、逻辑引擎、无忧企业文档&#xff08;在线协同&#xff09;、无忧企业计划、无忧企业邮筒等平台&#xff0c;欢迎关注微信公…

无处不在的人工智能:现状与未来

文章目录 引言科幻电影中的AI《她》&#xff1a;人工智能的爱情《我&#xff0c;机器人》&#xff1a;AI的觉醒 人工智能的发展现状专用人工智能的突破通用人工智能的起步 结语 引言 在21世纪的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动社会发展的关键…

热爱无国界:deepin 23获得全球用户的信任与支持

查看原文 随着 deepin 操作系统在全球范围内知名度和影响力的日益攀升&#xff0c;其独特的魅力和卓越的使用体验赢得了世界各地的众多开源爱好者与全球媒体的高度关注与支持。 海外分支社区的蓬勃发展 最近&#xff0c;deepin 在国际化进程中又迈出了坚实的一步——deepin …

【贪心算法】贪心算法一

贪心算法一 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.柠檬水找零 题目…

C++中模板的初级使用函数模板(刚刚接触模板概念的小白也能明白)

文章目录 模板分类函数模板函数模板的原理函数模板基本语法 —— typename 以及 class简单的函数模板多类型模板参数class 和 typename 的选择类模板 模板分类 模板的核心思想是让编译器在编译时生成适用于具体类型的代码&#xff0c;这个过程称为模板实例化。C 中的模板分为两…

3 种自然语言处理(NLP)技术:RNN、Transformers、BERT

自然语言处理 (NLP) 是人工智能的一个领域&#xff0c;旨在使机器能够理解文本数据。NLP 研究由来已久&#xff0c;但直到最近&#xff0c;随着大数据和更高计算处理能力的引入&#xff0c;它才变得更加突出。 随着 NLP 领域的规模越来越大&#xff0c;许多研究人员都试图提高…

大模型算法二次开发,基本思路详细拆解

前言 随着众多大模型相继问世&#xff0c;大模型二次开发、大模型微调成为一项热门技术。本文为大家总结了大模型二次开发的基本方法与思路&#xff0c;希望对大家有所帮助。 转载自丨吃果冻不吐果冻皮 开发方法分类 1、领域知识注入&#xff1a;Continue PreTraining(增量…

LeetCode_sql_day28(1767.寻找没有被执行的任务对)

描述&#xff1a;1767.寻找没有被执行的任务对 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

简单题88. 合并两个有序数组 (Python)20240920

问题描述&#xff1a; python&#xff1a; class Solution(object):def merge(self, nums1, m, nums2, n):""":type nums1: List[int]:type m: int:type nums2: List[int]:type n: int:rtype: None Do not return anything, modify nums1 in-place instead.&qu…

GSAP动画库:让网页动起来的艺术

GSAP动画库&#xff1a;让网页动起来的艺术 前言 在现代网页设计中&#xff0c;动画效果不仅能够提升用户体验&#xff0c;还能增强视觉吸引力。 GSAP&#xff08;GreenSock Animation Platform&#xff09;是业界领先的动画库&#xff0c;它提供了强大的工具和功能&#xff…