当前位置: 首页 > news >正文

流式语音识别概述-paddlespeech

语音识别技术(Automatic Speech Recognition)是一种将人的语音转换为文本的技术。在智能问答中,可通过语音接入用户query,实现问答。

在流式语音识别系统中,客户端不断地将音频数据实时传输至服务器,而服务器则负责对这些数据进行即时语音识别,并将识别出的文本结果实时回传给客户端。

PaddleSpeech,采用WebSocket协议来确保客户端与服务器之间能够长时间稳定地保持连接。WebSocket协议以其支持全双工通信的特性而著称,在同一网络连接上,客户端和服务器可以同时发送和接收消息,无需像传统HTTP请求那样频繁地建立和断开连接。

流式 TTS 服务支持 http 和 webscoket 两种协议。

http 支持流式返回,可以满足目前的流式 TTS 的方案,即请求一次,返回流式数据,响应返回结束会自动断开连接。

而 websocket 支持双工,适用于需要长连接的场景,也可应用于目前的流式 TTS 的方案,可以在一次连接中请求多次,相比 http 请求多次而言,可减少建立连接的次数。

除此之外,流式 ASR 使用的是 websocket 协议,使用 webscoket 协议启动服务,可以同时启动包含流式 ASR 和流式 TTS 的服务。

访问流式 TTS 服务流程图(左:访问 http 服务;右:访问 websocket 服务)

客户端操作:

  1. client 端向 server 端发送 http 请求(在这个过程中,client 端会先向 server 端发送建立连接请求并和 server 端建立连接)
  2. server 端收到请求后先检查字段内容是否有效,然后去引擎池取对应的引擎
  3. 引擎进行推理生成合成音频,将其封装成设计的响应格式,返回响应到 client 端,并自动断开连接
  4. client 端收到响应后,对其结果进行后处理(保存音频操作)
    async with websockets.connect('ws://ip:8090/paddlespeech/asr/streaming') as ws:
       
        # 第一次调用需要发送开始指令
        audio_info = json.dumps({"name": "test.wav", "signal": "start", "nbest": 1})
        await ws.send(audio_info)
        msg = await ws.recv()
        # {'status': 'ok', 'signal': 'server_ready'}
        msg = json.loads(msg)
        print(msg)
        # 输出内容长度
        length = 0
      
        # 计算在给定的采样率(RATE)、数据块大小(CHUNK)和录制时长(RECORD_SECONDS)下,需要读取多少个数据块来完成整个录制过程。
        print(int(RATE / CHUNK * RECORD_SECONDS))
        for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
            data = stream.read(CHUNK)
            await ws.send(data)
            msg = await ws.recv()
            # {'result': ''}
            msg = json.loads(msg)
        .........

        # 发送结束指令
        audio_info = json.dumps({"name": "test.wav", "signal": "end", "nbest": 1})
        await ws.send(audio_info)
        msg = await ws.recv()
        # {'status': 'ok', 'signal': 'finished', 'result': '', 'times': [{'w': '', 'bg': 0.0, 'ed': 0.68}, ...]}
        msg = json.loads(msg)
        if tag and len(msg['result']) > 0:
            punc_text = punc(msg['result'])
            msg['result'] = punc_text
        print(msg['result'])

服务端:

  1. 准备服务对应的配置参数文件,文件内包含该服务启动使用的模型相关信息和服务端口,引擎选择的相关信息
  2. 根据配置文件中引擎的选择将对应的引擎加入到引擎池中(该步骤的目的是为了使得启动的服务入口可以支持多个语音服务)
  3. 根据配置文件中的模型配置对上述对应的引擎进行初始化
  4. 使用 fastapi 和 uvicorn 启动服务
from paddlespeech.server.bin.paddlespeech_server import ServerExecutor

server_executor = ServerExecutor()
server_executor(
    config_file="./conf/application.yaml",
    log_file="./log/paddlespeech.log")

注:部分内容摘自百度飞桨平台。

相关文章:

  • 手撕算法 ——前缀和
  • 项目管理中的立项管理:从理论到实践的完整指南
  • 对 Docker 理解的补充 docker容器虚拟化技术有什么用?怎么使用?
  • springBoot中使用事务的隔离与回滚
  • 博弈论——AB博弈
  • ✨ **关于《恋与深空》的综合介绍**
  • 中兴B860AV3.2-T查处理器芯片是S905L3B还是S905L3SB芯片询方法分享
  • 深度学习视觉BEV 3D目标检测算法综述
  • 基于PyQt5与Open3D的轻量化BIM工具开发指南(下)‌
  • stm32 2.0
  • 基于ssm的【大湾区旅游推荐系统的设计与实现】
  • 【漫话机器学习系列】146.Softmax 激活函数(Softmax Activation Function)
  • 优先级队列(PriorityQueue)_1_模拟实现优先级队列
  • c++ 类和对象 —— 下 【复习总结】
  • Win11锁屏后显示“天气、市场、广告”如何取消显示
  • [从零开始学习JAVA] Stream流
  • 为什么Django能有效防御CSRF攻击?
  • 支持向量机(Support Vector Machine)基础知识2
  • linux 命令 cd
  • Centos搭建Tomcat服务器:我的实战经验分享(成功版本 详细!)
  • “复旦源”一源六馆焕新启幕,设立文化发展基金首期1亿元
  • 特写|银耳种植“北移”到沧州盐山,村民入伙可年增收4万元
  • 纪念|脖子上挂着红领巾的陈逸飞
  • 降水较常年同期少五成,安徽四大水利工程调水超11亿方应对旱情
  • 全国省市县国土空间总体规划已基本批复完成,进入全面实施阶段
  • 讲座|消逝之钟:《红楼梦》与《布登勃洛克一家》中的时间观