实时asr新服务串讲

news2024/9/30 11:24:25

1.背景及现状

         工程方面目前语音相关服务存在大量重复代码,逻辑复杂,文档缺失,并且某些细节设计不合理。基于目前现状,代码业务与功能耦合严重,迭代困难,将来增加新的能力也需要改动音频数据相关代码,开发周期较长。

         推理框架目前老服务使用的Kaldi推理框架,需要使用业界最新的推理框架去替代老的框架,以便在模型大小,识别准确率,识别速率,以及实时效果等多方面进行优化。相对于Kaldi来说Whisper是一个轻量级的语音处理工具库,专注于实时语音处理和嵌入式设备。它提供了一些基本的语音处理功能,如语音增强、语音识别、语音合成等。Whisper的设计目标是在资源受限的环境下实现高效的语音处理,因此它的代码量相对较小,适合在嵌入式设备或边缘计算平台上使用,所以可以有效的降低资源占用。

2.整体流程架构

新的架构流程

新的架构流程

可以看出,老服务有两个问题,首先是协议的选择,一次session需要进行多次http请求排序等分片组合逻辑会大大增加代码复杂度,另外很多业务能力(比如训练场,直播)处理放在了整个asr识别服务里面,属于功能与业务的耦合,需要进行拆解,方便代码维护与迭代。

3.新架构具体方案

1.协议相关

  • 协议方面参考阿里接口

如何自行开发代码访问阿里语音服务_智能语音交互(ISI)-阿里云帮助中心

  • 协议交互流程图

  • sdk相关

       对于用户端来说,接入asr可以通过两个方式接入,一种是直接根据协议文档进行接入,另一种是需要根据服务端提供的针对各个平台的sdk进行能力接入。

 调研是否可以复用阿里的sdk:

     相关链接

如何下载安装、使用实时语音识别PythonSDK及代码示例_智能语音交互(ISI)-阿里云帮助中心

 下载sdk查看依赖

可以看出来,阿里给的sdk需要安装他自身的核心库,这样会导致某些部分代码对我们来说是黑盒子,将来版本更替,能力升级,都可能会遇上兼容的问题。

  测试代码

import time
import threading
import sys

import nls
# from tests.test_utils import (TEST_ACCESS_TOKEN, TEST_ACCESS_APPKEY)

class TestSr:
    def __init__(self, tid, test_file):
        self.__th = threading.Thread(target=self.__test_run)
        self.__id = tid
        self.__test_file = test_file
   
    def loadfile(self, filename):
        with open(filename, 'rb') as f:
            self.__data = f.read()
    
    def start(self):
        self.loadfile(self.__test_file)
        self.__th.start()

    def test_on_start(self, message, *args):
        print('test_on_start:{}'.format(message))

    def test_on_error(self, message, *args):
        print('on_error args=>{}'.format(args))

    def test_on_close(self, *args):
        print('on_close: args=>{}'.format(args))

    def test_on_result_chg(self, message, *args):
        print('test_on_chg:{}'.format(message))

    def test_on_completed(self, message, *args):
        print('on_completed:args=>{} message=>{}'.format(args, message))


    def __test_run(self):
        print('thread:{} start..'.format(self.__id))
        #ws://127.0.0.1:8081/v1/asr/realtime
        sr = nls.NlsSpeechRecognizer(
                    url = 'ws://127.0.0.1:8081/v1/asr/realtime',
                    token='none',
                    appkey='none',
                    on_start=self.test_on_start,
                    on_result_changed=self.test_on_result_chg,
                    on_completed=self.test_on_completed,
                    on_error=self.test_on_error,
                    on_close=self.test_on_close,
                    callback_args=[self.__id]
                )
        while True:
            print('{}: session start'.format(self.__id))
            r = sr.start(ex={'format':'pcm', 'hello':123})
           
            self.__slices = zip(*(iter(self.__data),) * 640)
            for i in self.__slices:
                sr.send_audio(bytes(i))
                time.sleep(0.01)

            r = sr.stop()
            print('{}: sr stopped:{}'.format(self.__id, r))
            time.sleep(5)

def multiruntest(num=500):
    for i in range(0, num):
        name = 'thread' + str(i)
        t = TestSr(name, 'tests/test1.pcm')
        t.start()

nls.enableTrace(True)
multiruntest(1)



结论

     使用官网sdk的话需要绕过相关验证机制,目前觉得应该不太合适.。

2.引擎框架

       目前依据不同的库实现了两套引擎,一套是基于transform,一套基于fast-whisper,两种开元框架使用了不同的窗口策略。总体思路都是切分的方式,控制模型每次运算接收到的上下文窗口大小,让模型可以有对序列局部建模能力,然后将局部计算的结果拼接起来。

基本流程图

音频数据分片传输

      上面是一段单通道 16khz  16bit 的pcm原始音频数据的波形图,录音设备获取原始数据后将数据按照时间分片存储在内存中,也就是数据采样的过程。将连续的模拟信号改为可存储量化的数字信号。

音频数据量化

       将采样获取的数据使用numpy库进行音频数据量化,根据位深将数据量化为相应的数组,数组中每一个数据绝对值都小于2的16次方,方便后续输入算法模块。

静音检测处理

音频数据量化的基础上,后续的滑动窗口策略需要使用到静音来进行断句,静音原理是根据量化后的数据值是否大于100来确定的,因为外界有你声音的话,声音数据波动在2000以上。但是对于以后得优化可以进一步通过模型识别人声和非人声将这块逻辑进行替换,这样对于一些噪音很大的场景会提升识别准确率。

滑动窗口策略

  • 基于transform实现流式的窗口策略

         使用该推理框架实现流式,由于窗口太小识别数据不准确,另外依据测试结果,对于稍微长的语音(小于30s),识别的rtf参数值小于1.0,可以满足流式的基本要求,所以滑动窗口采用音频buffer逐渐增加的方式最为窗口滑动策略。

具体流程图如下:

  • 基于fast-whisper实现流式窗口策略

对于fast-whisper,使用github上开源的流式推理工程:

GitHub - ufal/whisper_streaming: Whisper realtime streaming for long speech-to-text transcription and translation

分析源码,发现由于fast-whisper提供的音频识别api支持condition_on_previous_text

参数,可以将之前识别的文本输出输入模型,协助模型识别该段音频数据,所以该推理工程使用数据buffer窗口大小不变,文本buffer滚动的方式进行流式处理。

具体流程如下:

4.测试指标

测试指标目前主要是字准与数据返回速度:

changeUrl

结论:

1.阿里目前首字时间打开600毫秒到800毫秒左右,流式过程中平均延时300ms到600ms范围内波动。

2.目前transform引擎目前首字时间打开600毫秒到800毫秒左右,流式过程中平均延时300ms到600ms范围内波动。

5.后续优化思考

  • 工程方面

在调试过程中,不同的窗口大小,不同的数据流速,静音阈值的大小,对识别效果或多或少都有一定的影响,可能也是因为这个原因(当然也有别的原因,比如网络不稳定或者音频文件本身噪音就比较大等),会导致之前算法测试结果和实际使用中的结果有很大差异,所以如果遇上算法同学认为识别效果不错但是工程实现之后发现识别结果不尽人意,可以尝试调节不同的工程参数,尝试找到最契合算法测试环境的情况。

  •   推理框架

      对于推理框架不只需要熟悉相关api相关参数,还要尽可能熟悉具体的内部原理,这样在模型调参过程中就不是盲目取尝试,做到先预期结果然后再验证。

      另外比如想办法让模型可以识别人声,这样对于噪音场景的识别效果也会有所提升。

  •      接入方式

   后续需要提供各个平台的sdk接入接口(第一阶段可以先让试用方根据协议进行接入)。

1

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

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

相关文章

Vue 实例创建流程

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

带大家做一个,易上手的家常葱爆牛肉

先准备一块牛肉 划水去冰 然后多清洗几次 尽力洗出血水 准备 大葱: 主要根据牛肉的量来。和我这块牛肉差不多的 三分之二根就够了。 三四个干辣椒 主要看你想让它有多辣 两瓣大蒜 大葱切段 干辣椒就原样就好 大蒜去皮切片 牛肉切片 起锅烧油 油烧热后 下牛肉翻炒 牛肉完全…

RPC框架简介

RPC定义 远程过程调用(Remote Procedure Call)。RPC的目的就是让构建分布式计算(应用)更加简单,在提供强大的调用远程调用的同时不失去简单的本地调用的语义简洁性 RPC整体架构 服务端启动时首先将自己的服务节点信息…

vue生命周期图示

详见:官网介绍

MyBatis 的XML实现方法(JAVA)

数据库表的结构如下: DROP DATABASE IF EXISTS test; CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; -- 使⽤数据数据 USE test; -- 创建表[⽤⼾表] DROP TABLE IF EXISTS userinfo; CREATE TABLE userinfo ( id INT ( 11 ) NOT NULL AUTO_INCREMENT, user…

【Linux】权限 !

Linux 权限 Liunx Linux 权限1 什么是权限1.1 Linux用户1.2 切换用户 2 权限管理2.1 文件访问者的分类2.2 文件类型和访问权限2.3 文件权限的设置方法chmod 命令chown 命令chgrp 命令umask 命令file 指令 2.4 目录权限粘滞位 3 权限总结 1 什么是权限 关于Linux的权限问题&…

vivado 接口、端口映射

接口 重要&#xff01;接口只能在“fpga”类型的&#xff1c;component&#xff1e;中定义。接口部分提供了<component>上所有可用物理接口的列表。<interfaces>部分包含嵌套在其中的一个或多个<interface>标记。一个接口是通过使用<port_map>标记由多…

OpenGL DIR

Mesa简介-CSDN博客 Mesa, also called Mesa3D and The Mesa 3D Graphics Library, is an open source software implementation of OpenGL, Vulkan, and other graphics API specifications. Mesa translates these specifications to vendor-specific graphics ha…

一维数组2和二维数组1

1.一维数组在内存中的储存 在前面创建的数组中&#xff0c;每个元素是怎么储存的呢&#xff1f;我们通过观察元素的地址来看看吧。 %p是用来打印地址的。 结果为&#xff1a; 由此可看出每个地址都相隔一个int类型的距离&#xff0c;可以看出数组在内存中是连续存放的。也就是…

2024美赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 模型…

51单片机驱动点阵屏

目录 1设计目的 2设计方案 2.1材料选择 2.2电源设计 2.3控制设计 3焊接调试 3.1焊接 3.2调试 4程序 1设计目的 此次设计的东西是一个点阵屏&#xff0c;通过点阵屏实现电梯屏幕功能。显示内容包括向上运行箭头和向下运行箭头&#xff0c;以及1-12的楼层。 2设计方案 …

龟兔再跑

欢迎来到程序小院 龟兔再跑 玩法&#xff1a;乌龟跳绳&#xff0c;点击鼠标左键乌龟跳跃&#xff0c;两只乌龟一直不停的甩绳子&#xff0c;另外一只乌龟从中跳过&#xff0c;赶快去跳绳吧^^。开始游戏https://www.ormcc.com/play/gameStart/255 html <div class"mai…

Vue开发者工具是什么?有哪些?

Vue开发者工具是什么&#xff1f; Vue开发者工具是用于Vue.js开发的浏览器扩展&#xff0c;提供了许多有用的功能和工具&#xff0c;帮助开发者更轻松地开发和调试Vue.js应用程序。 Vue开发者工具的功能特点有哪些&#xff1f; 1、组件树视图&#xff1a;Vue开发者工具可以显…

STM32-调用 vTaskStartScheduler API 后出现 HardFault

STM32 移植 FreeRTOS 后调用 vTaskStartScheduler() 后出现 HardFault 异常。 原因分析&#xff1a; FreeRTOS 配置头文件 FreeRTOSConfig.h 中与中断有关的配置和通过系统接口 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 设置的中断分组冲突。 /* The lo…

Java NIO (三)NIO Channel类

1 概述 前面提到&#xff0c;Java NIO中一个socket连接使用一个Channel来表示。从更广泛的层面来说&#xff0c;一个通道可以表示一个底层的文件描述符&#xff0c;例如硬件设备、文件、网络连接等。然而&#xff0c;远不止如此&#xff0c;Java NIO的通道可以更加细化。例如&a…

Python并发编程的概念和重要性

并发编程是一种编程方式&#xff0c;它允许在单台处理器上同时处理多个任务或操作。这些任务可以在单个处理器上通过时间分片技术实现&#xff0c;也可以在多核或多处理器系统上真正地并行执行。并发性对于提高系统资源利用率、提升应用程序性能以及改善用户体验都至关重要。 并…

计算机网络-分层结构,协议,接口,服务

文章目录 总览为什么要分层怎样分层正式认识分层概念小结 总览 为什么要分层 发送文件前要做的准备工作很多 把这个准备工作分层小问题解决&#xff0c;也就分层解决 怎样分层 每层相互独立&#xff0c;每层做的工作不同 界面自然清晰&#xff0c;层与层之间的接口能够体现…

JS-日期对象

日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 实例化 在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间 1&#xff09;获得当前时间 const datenew Date() 2)获得指定时间 const datenew D…

蓝桥杯理历年真题 —— 数学

1. 买不到的数目 这道题目&#xff0c;考得就是一个日常数学的积累&#xff0c;如果你学过这个公式的话&#xff0c;就是一道非常简单的输出问题&#xff1b;可是如果没学过&#xff0c;就非常吃亏&#xff0c;在考场上只能暴力求解&#xff0c;或是寻找规律。这就要求我们什么…

【window】Windows11:该文件没有与之关联的应用来执行该操作

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;人工智能 之前win10升级win11后&#xff0c;受不了桌面软件图标的的小箭头&#xff0c;所以弄掉了&#xff0c;但是随之而来产…