【飞桨PaddleSpeech语音技术课程】— 语音识别-流式服务

news2024/10/7 4:30:56

FastAPI websocket 流式语音识别服务

0. 背景

流式语音识别(Streaming ASR)或者在线语音识别(Online ASR) 是随着输入语音的数据不断增加,实时给出语音识别的文本结果。与之相对的是非实时或者离线语音识别,是传入完整的音频数据,一次给出整个音频的语音识别文本结果。

训练完一个流式的语音识别模型之后,需要将流式语音识别模型封装成一个服务,使用者通过网络访问流式语音识别服务实时获取音频的文本内容。

流式语音识别服务在实时字幕,视频直播,实时会议转写,输入法等场景都有大规模的应用。

1. Websocket 协议

在流式语音识别中,客户端client和服务端server需要进行长时间进行数据交互,client端不断地将数据传入到服务端,server需要将实时识别的文本返回给client端,因此client需要和server保持长时间的网络连接。

PaddleSpeech采用Websocket协议,保证client和server可以长时间保持网络连接。

WebSocket 协议支持全双工通信,client端和server端可以在一个网络连接上收发消息,使用WebSocket协议,可以实现client不断地向server端发送数据,进行实时语音识别。

# 下载流式ASR的demo视频
!mkdir -p work/source/
!test -f work/source/streaming_asr_demo.mp4 || wget -c https://paddlespeech.bj.bcebos.com/demos/asr_demos/streaming_asr_demo.mp4 -P work/source/
import IPython.display as dp
from IPython.display import HTML
html_str = '''
<video controls width="600" height="360" src="{}">animation</video>
'''.format("work/source/streaming_asr_demo.mov")
dp.display(HTML(html_str))

2. 测试服务

2.1 PaddleSpeech 流式协议

在PaddleSpeech中,client端使用websocket协议与server建立连接进行通信。
PaddleSpeech中client与server端的通信协议如下图所示。

在PaddleSpeech流式服务协议主要由三个部分组成,即建立链接握手数据处理结束链接握手

2.1 建立链接握手

在语音识别流式服务中,client端和server端需要建立长链接。
在语音识别流式服务中,client是语音识别业务的请求方,因此client需要主动和server端建立连接,client根据PaddleSpeech的流式协议主动发送建立链接的握手信息,协议过程如下图所示:

建立握手的详细步骤如下所示:

  1. Client 需要发送 WebSocket 协议用于握手的 HandShake 信息,Server一直阻塞等待 WebSocket 的握手信息;
    每当Server端接收到一个WebSocket 协议的HandShake之后,会开启一个线程用于处理该请求,同时继续阻塞等待下一个握手信息。

  2. Server 接收到 WebSocket的握手信息后,等待 Client 的命令;
    Server 端会进入到等待命令的循环中,根据client的命令进行处理。

  3. Client 发送开始 start 命令信息,Server只有接收到 start 命令之后才会让 server 进行语音识别相关准备工作。
    当server完成准备工作之后,将该链接的准备情况发送给client。

  4. Server 接收到开始信息之后,创建处理音频的Session,并把能否创建Session的信息发送给Client

经过上述4个步骤之后,表示client和server建立了流式语音识别的连接,同时server已经为语音识别做好的必要的准备工作。

2.2 数据处理

在流式语音识别中,最核心的部分是数据处理的部分。数据处理包括client端数据处理和server端数据处理部分。
client负责将音频以数据流的形式发送给server端。
server不断地接收到client发送的数据,对接收到的数据进行处理。

  1. Client 接收到流式连接Handler创建信息,如果Handler创建成功,则开始发送chunk音频数据。

  2. Server 接收到音频数据信息之后,开始处理音频,处理好之后将结果返回给Client端。

    Server在处理音频的这段时间,Client 禁止发送数据,直到Server给Client 响应;

  3. Client 接收到 Server 的识别结果之后,开始发送下一个chunk音频数据;

  4. Server端接收到最后一个chunk之后,开始识别。
    Client 发送最后一个chunk之后,只要没有发送结束session的信息,server则默认还有数据未发送结束。

下面针对client和server分别进行讲解:

2.2.1 client数据处理

client接收到Handler创建成功之后,需要将数据一批一批发送给server端,我们称每一批数据为一个chunk或者一个数据包。
数据包的大小,推荐为200ms左右。

假设一个数据包的样本点为 L L L, 整个音频的样本点为 N N N,音频数据被切割为 n n n 个数据包,则client的逻辑如下所示:

需要注意的是,如果最后一个数据包的长度不满足 L L L 的长度,也是可以发送过去。

2.2.2 server数据处理

server 端接收到 client 的数据之后,就需要进行处理,包括提取特征,声学模型推理,CTC解码等一系列操作。

2.2.2.1 提取特征

server端获取音频的样本数据之后,提取音频特征,如Fbank特征等。而提取Fbank特征的时候,通常帧长是25ms或者20ms,帧移10ms。

我们以帧长25ms,帧移为10ms为例,图示提取特征过程:

在上图中,当接收到数据包2时,提取第三帧frame3的特征时,需要用到数据包1里面的数据,因此在数据包1提取好特征之后,需要缓存一部分音频的样本数据。如果不缓存数据包1的音频样本点,那么在提取特诊时,会丢失很多音频数据,导致最后识别的结果变差。

2.2.2 声学模型推理

server端提取好特征之后,需要将音频特征送入到声学模型中进行解码,以获取每个每个声学符号似然概率。以conformer模型为例,在conformer模型的前两层有下采样层,其网络结构处理如下所示:

从上图中可以看到,声学模型推理时,每7帧语音数据组成一个声学模型解码的chunk,每两个chunk是有3帧的重叠部分。

与提取音频特征过程类似,当一个chunk(7帧语音数据)处理结束之后,需要将剩下的数据缓存起来,等待接收到下一个数据包,重新组合成一个新的chunk数据,送入到声学模型中。

在conformer模型中,可以配置一次解码的chunk的数据 n n n,即将 n n n 个chunk数据组合在一起进行一起解码,这就要求解码时,系统缓存的数据帧至少有

( n − 1 ) ∗ 4 + 7 = 4 n + 3 (n-1) * 4 + 7 = 4n + 3 (n1)4+7=4n+3

2.2.3 CTC 解码

声学模型对语音帧数据进行解码之后,得到每个语音识别建模符号的似然概率,然后使用CTC对每个解码符号进行解码,详细的解码过程可以参考我们aistudio教程中流式训练的部分。

2.3 结束连接握手

当client发送完最后一个数据包之后,client知道整个音频已经发送结束,需要结束这次流式语音识别的过程。server端并不知道client是否还有数据包需要发送,因此需要client端主动发送数据包发送结束的握手信息,server端接收到该信息后知道整个音频已经接收完成,不需要接收新的数据。详细的处理步骤如下所示:

  1. Client 发送 Finished 信息,表示已经发送完音频,此时Server将最后缓存数据进行处理结束,得到最后的解码结果,然后销毁 Handler

  2. Server 发送给 Client 信息,表示收到 Finished 信息,Client可以关闭连接,

    如果有缓存的音频信息未处理完,server识别该缓存音频同时也发送识别结果。

    最后缓存解码的结果,可以使用语言模型,或者attention模型进行rescoring进行优化,因此server端发送最后的Finished握手时,也发送最后一次解码结果。

  3. Client 收到信息之后,关闭连接,结束本次会话。

3. FastAPI 流式语音识别实战

3.1 安装 PaddleSpeech

实战FastAPI 流式ASR 的过程时,需要安装最新版本的PaddleSpeech
下载好测试音频之后,通过PaddleSpeech的cli方式访问服务。

# 1. 安装 PaddleSpeech
!pip install -U paddlespeech==1.0.1

# 2. 安装 PaddleAudio
!pip install paddleaudio==1.0.0

# 3. 安装 uvicorn==0.18.3 (防止版本问题引发错误)
!pip install uvicorn==0.18.3
!unzip PaddleSpeech-r1.0.zip
!wget https://paddlespeech.bj.bcebos.com/Parakeet/tools/nltk_data.tar.gz
!tar zxvf nltk_data.tar.gz
# punc
!paddlespeech_server start --conf PaddleSpeech/demos/streaming_asr_server/conf/punc_application.yaml &> punc.log &

# asr
!paddlespeech_server start --conf PaddleSpeech/demos/streaming_asr_server/conf/ws_conformer_wenetspeech_application.yaml &> asr.log &

3.2 client 发送数据

!wget -c https://paddlespeech.bj.bcebos.com/PaddleAudio/zh.wav 
!ls ./zh.wav

# asr
!paddlespeech_client asr_online --server_ip 127.0.0.1 --port 8090 --input ./zh.wav

# asr + punc
!paddlespeech_client asr_online --server_ip 127.0.0.1 --port 8090 --punc.server_ip 127.0.1 --punc.port 8190 --input ./zh.wav

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

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

相关文章

ppocrlabel简单教学

前言 给我们小白成员的快速上手ppocrlabel的指南 1. ppocr环境配置 建议是先创建一个虚拟环境 【直接参考】&#xff1a;https://blog.csdn.net/weixin_42708301/article/details/119864744 2. ppocrlabel环境安装 【参考文档】PaddleOCR-release-2.6\PPOCRLabel\README_c…

将STM32 内部Flash虚拟成优盘,进行IAP升级

书接上回&#xff0c;上篇文章已经成功的将 STM32 内部FLASH虚拟成优盘进行文件存储了。 【将 STM32 内部Flash虚拟成优盘】https://blog.csdn.net/qq_44810226/article/details/127508789 然后我们开始固件升级流程&#xff1a; 从上图可以看出&#xff0c;固件存储的位置是不…

Python-代码封装思想

继上文所将讲的pythonrequestsUnittest框架&#xff0c;本文将继续分享python代码的进一步封装思想&#xff0c;来提高代码的整体运行效率及整洁性&#xff0c;本文以接口测试框架为例进行讲解。 关于Unittest单元测试框架的具体使用方法链接链接&#xff08;点击跳转&#xf…

MMEngine理解

MMEngine理解1 简介1.1 架构1.2 模块介绍1.2.1 核心模块与相关组件1.2.1 公共基础模块2 上手示例2.1 构建模型2.2 构建数据集和数据加载器2.3 构建评测指标2.4 构建执行器并执行任务3. 基础模块3.1 注册器&#xff08;Registry&#xff09;3.1.1 什么是注册器3.1.2 使用流程3.1…

OSPF路由协议(二)

作者介绍&#xff1a; ⭐️作者&#xff1a;小刘在C站 ❄️每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ☁️夕阳下&#xff0c;是最美的绽放。 目录 一.Router id 二.DR,BDR 三.DR BDR 选举过程 四.ospf 度量值 cost 代价 五.ospf 的数据…

部署vue项目到阿里云服务器

一般前端工程师只会使用npm run serve 在开发环境下验证&#xff0c;那么如何把npm run build 打出的包部署到服务器上进行上线呢&#xff1f;这篇文章就详细阐述这一流程。 1. 购买或试用阿里云服务器 作为新用户可以试用一个月阿里云服务器&#xff0c;阿里云官方网址如下&a…

【数据结构与算法分析】0基础带你学数据结构与算法分析07--二叉树

在学习上一章后&#xff0c;我们对树加以限制&#xff0c;如果树的度为 2&#xff0c;那么就称这颗树为 二叉树 (binary tree)。 二叉树的性质 在一棵二叉树上&#xff0c;有一些重要的性质&#xff1a; 第 i 层 (i∈N) 上最多有 2^(i−1) 个结点层次为 k(k∈N) 的树最多有 …

进程地址空间

目录 程序地址空间 感知虚拟地址空间的存在 进程地址空间 分页 & 虚拟地址空间 Linux2.6内核进程调度队列 程序地址空间 我们在学习C语言的时候了解过程序地址空间的分布&#xff1a; 需要注意的是&#xff1a;程序地址空间不是内存。我们在linux操作系统中通过代码来…

刷题笔记之二(字符串中找出连续最长的数字串+数组中出现次数超过一半的数字+另类加法+计算糖果+进制转换)

目录 1. 多层继承问题 2. 继承中子类的构造要引用super 3. 比较地址 4. 字符串中找出连续最长的数字串(编程题) 5. 数组中出现次数超过一半的数字&#xff08;编程题&#xff09; 6. 另类加法&#xff08;编程题&#xff09; 7. Interface 接口中定义方法 8. 实现或继…

C语言学习(二)之字符串和格式化输入/输出

文章目录一、字符串二、 输入2.1 scanf()作用2.2 两种用法三、输出3.1 printf()3.1.1 printf 四种用法3.1.2 常用输出控制符3.1.3 为什么需要输出控制符一、字符串 字符串是一个或多个字符的序列。如&#xff1a;“Hello World” 双引号不是字符串的一部分。仅告知编译器它括…

【学习笔记】《深入浅出Pandas》第16章:可视化

文章目录16.1 plot方法16.1.1 plot概述16.1.2 plot基础方法16.1.3 图形类型16.1.4 x轴和y轴16.1.5 图形标题16.1.6 字体大小16.1.7 线条样式16.1.8 背景辅助线16.1.9 图例16.1.10 图形大小16.1.11 色系16.1.12 绘图引擎16.1.14 图形叠加16.1.15 颜色的表示16.1.16 解决图形中的…

量子笔记:量子计算 toy python implementation from scratch

目录 0. 概要 1. 量子比特表示&#xff1a;用二维张量表示 2. 张量积的实现 2.1 用scipy.linalg.kron()实现张量积 2.2 用张量积计算双量子系统的基 3. 多量子系统基向量表示和生成 3.1 Helper function: bin_ext 3.2 多量子系统的基的生成 3.3 numpy.matrix numpy.m…

基于多尺度注意力网络单图像超分(MAN)

引言 Transformer的自注意力机制可以进行远距离建模&#xff0c;在视觉的各个领域表现出强大的能力。然而在VAN中使用大核分解同样可以得到很好的效果。这也反映了卷积核的发展趋势&#xff0c;从一开始的大卷积核到vgg中采用堆叠的小卷积核代替大卷积核。 上图展现了MAN网络在…

使用T0,方式2,在P1.0输出周期为400µs,占空比为4:1的矩形脉冲,要求在P1.0引脚接有虚拟示波器,观察P1.0引脚输出的矩形脉冲波形

大家学过一段时间的单片机了&#xff0c;今天我们来说说单片机里的定时器&#xff0c;又叫计数器。首先&#xff0c;我们通过案例来了解一下什么是定时器。 【例】使用T0&#xff0c;方式2&#xff0c;在P1.0输出周期为400s&#xff0c;占空比为4&#xff1a;1的矩形脉冲&…

如何编写优秀的测试用例,建议收藏和转发

1、测试点与测试用例 测试点不等于测试用例&#xff0c;这是我们首先需要认识到的。 问题1&#xff1a;这些测试点在内容上有重复&#xff0c;存在冗余。 问题2&#xff1a;一些测试点的测试输入不明确&#xff0c;不知道测试时要测试哪些。 问题3&#xff1a;总是在搭相似…

串口通信协议【I2C、SPI、UART、RS232、RS485、CAN】

&#xff08;1&#xff09;I2C 集成电路互连总线接口(Inter IC)&#xff1a;同步串行半双工传输总线&#xff0c;连接嵌入式处理器及其外围器件。 支持器件&#xff1a;LCD驱动器、Flash存储器 特点&#xff1a; ①有两根传输线&#xff08;时钟线SCL、双向数据线SDA&#…

python基础19-36题

题目&#xff1a; 代码十九二十二十一二十二二十三二十四二十五二十六二十七二十八二十九三十三十一三十二三十三三十四三十五三十六十九 birthday int(input(“请输入生日日期&#xff1a;”)) Set1 [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31] Set2 [2,3,6,7,10,11,…

【CV】第 7 章:目标检测基础

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

几何等变图神经网络综述

许多科学问题都要求以几何图形&#xff08;geometric graphs&#xff09;的形式处理数据。与一般图数据不同&#xff0c;几何图显示平移、旋转和反射的对称性。研究人员利用这种对称性的归纳偏差&#xff08;inductive bias&#xff09;&#xff0c;开发了几何等变图神经网络&a…

SpringMVC | 快速上手SpringMVC

&#x1f451; 博主简介&#xff1a;    &#x1f947; Java领域新星创作者    &#x1f947; 阿里云开发者社区专家博主、星级博主、技术博主 &#x1f91d; 交流社区&#xff1a;BoBooY&#xff08;优质编程学习笔记社区&#xff09; 前言&#xff1a;在上一节中我们了解…