自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

谈谈音频开发

专注于音频软件开发的方方面面

  • 博客(73)
  • 收藏
  • 关注

原创 三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的

前面的博客里说过最近几个月我从传统语音(语音通信)切到了智能语音(语音识别)。刚开始是学语音识别领域的基础知识,学了后把自己学到的写了PPT给组内同学做了presentation(语音识别传统方法(GMM+HMM+NGRAM)概述)。一段时间后老板就布置了具体任务:在我们公司自己的ARM芯片上基于kaldi搭建一个在线语音识别系统,三个人花三个月左右的时间完成。由于我们都是语音识别领域的小白,要求...

2019-09-08 21:58:23 2403 1

原创 又被“过运营商语音认证”虐了一回

又被“过运营商语音认证”虐了一回!虐的伤痕累累、疲惫不堪!过程是痛苦的,但结果是美好的,收获也是挺多的!既然用了“又”,那以前肯定被虐过。是的,没错。那是7年多前(2011年底),同样是在秋冬,不过一个是2011年底,一个是2018年底。同样是在芯片公司, 不过一个是老牌外企,一个是本土新秀。当时我们在公司的芯片上做了一个语音通信解决方案(具体怎么做的见我前面的文章:如何在嵌入式Linux上开发一...

2019-01-20 22:20:56 2101 1

原创 谈谈我开发过的几套语音通信解决方案

本人从事音频软件开发10+年,既开发过voice相关的,又开发过music相关的,但大多数还是开发voice相关的。掐指一算到现在在通信终端上开发过的语音解决方案共有五套,它们既有有线通信的,又有无线通信的;既有在上层开发的,又有在底层开发的;既有在ARM上开发的,又有在DSP上开发的,总之各有特色。但因为都是语音通信解决方案,又有共同的地方,都要有语音的采集播放、编解码、前后处理和传输等。今天我...

2018-07-08 22:45:45 7602 1

原创 蓝牙HFP协议推荐的语音丢包补偿算法浮点实现的定点化

蓝牙语音通话相关的HFP(Hand Free Profile)强烈建议在宽带语音通话时要用上语音丢包补偿(packet lost concealment,PLC)算法来保证丢包时的语音质量,也给出了推荐的PLC算法的浮点实现。不仅找到了,而且还是算平方根的倒数的(Word32 Isqrt(Word32 L_x),输入是一个32位的值,输出是Q0.31的值),这样除法就变成了乘法。从图上可以看出,在做丢包补偿时,定点的和浮点的实现部分PCM值有误差,但误差都是在1范围内,这是可以接受的。

2024-03-21 12:29:06 767

原创 飞桨paddlespeech语音唤醒推理C INT8 定点实现

激活值的分布范围一般都比较广, 这种情况下如果直接使用最大值非饱和量化, 就会把离散点噪声给放大从而影响模型的精度,最好是找到合适的阈值|T|,将|T|/127作为量化scale,把识别率等指标的降幅控制在一个较小的范围内,这就是饱和量化。这个方法用的是饱和量化。发现它不是一个纯定点的实现,即里面有部分是float的,当时觉得里面最关键的权重和激活值都是定点运算了,部分浮点运算可以接受, 我也先做一个非纯定点的实现,把参数个数较少的bias用浮点表示。在函数里根据激活值的量化scale只做激活值的量化。

2024-01-31 11:28:19 1165

原创 智能手表上的音频(五):录音

从图看出,音频帧也分两部分:帧头和帧内容。帧头占一个字节(8个bit),各个比特的含义已在图中表示出来,其中P表示0,FT占4个比特,从二进制的0000到0111,共8个值,对应AMR-NB的8种码率。从上图看出,录音的音频数据是从ADSP-CP的sharememory里取的(ADSP-CP的sharememory放着上下行的音频数据)。从上图看出,每隔固定时长从驱动获得48k的PCM数据,如要保存成WAV格式就重采样成16k,如要保存成AMR格式,不仅重采样成8K, 而且好要做AMR-NB编码得到码流。

2023-12-18 07:51:29 713

原创 智能手表上的音频(四):语音通话

从上图可以看出上行要经过audio driver / resampler / VE(AEC/ANS/AGC) / encoder / IMS等模块,下行要经过IMS / decoder / VE(ANS/AGC) / resampler / mixer / audio driver等模块。7) ADSP给AP发DISABLE_ADSP_STREAM_ACK,告诉停止ADSP上的语音流是否OK。9) CP给AP发DISABLE_CP_STREAM_ACK,告诉停止CP上的语音流是否OK。

2023-11-30 07:36:29 1426 2

原创 智能手表上的音频(三):音频文件播放

ADSP没有音频数据时又会通过DATA_REQ向AP要音频数据,AP收到后会向ADSP发送音频数据,当SBC码流的字节数达到A2DP_DATA_REQ请求的个数时又会给AP发A2DP_DATA_REQ_ACK。4) AP收到ADSP发来的DATA_REQ后就会给ADSP回DATA_REQ_ACK,带上音频数据(AP把音频数据放在双方都能访问的share memory里,实际上在命令里带上的是这块音频数据在share memory里的起始地址, ADSP收到命令后从这个起始地址处拿音频数据)。

2023-11-08 08:30:00 371

原创 智能手表上的音频(二):驱动

BT下的驱动相对内置codec下的,ADMA等做些值的修改,主要调ASSP。调驱动时首先调的就是AP与ADSP之间的IPC,确保AP和ADSP之间通信正常,ADSP的log输出正常,能正常dump音频数据,在IPC好的基础上再去调其他的。在一个loop里,ADSP先从上图中的Play buffer里取CP放进去的要播放的语音数据,然后从ADSP audio buffer里取采集到的语音数据,采集到的语音数据经处理(比如重采样)后送到上图中的Record Buffer里,最后给CP发一个IPC中断。

2023-10-18 08:30:00 361

原创 智能手表上的音频(一):架构

SRC是各种采样率(8k / 16k / 44.1 k /48k等)的转换,以前写过专门的文章,具体见以下文章(不同的是少了一些外设(在手表这种产品形态下就不需要有线耳机和听筒等了),同时把外置codec芯片换成了内置codec,即把codec芯片集成到SOC里面了。有专门的codec芯片厂商,他们把codec芯片的功能做的比较丰富。)介绍了安卓智能手机上的音频。相对智能手机而言,相同的是依旧有AP/ADSP/CP,不同的是不再用安卓系统,同时音频外设只有内置codec上的麦克风和扬声器,以及蓝牙。

2023-09-25 08:30:00 326

原创 飞桨paddlespeech语音唤醒推理C定点实现

即算出的浮点的fbank值作为浮点实现模型的输入,将浮点的Fbank值根据定标转换成定点值作为定点实现模型的输入,然后每层的浮点实现和定点实现并行运行。需要说明的是目前完成的是16bit的定点实现,后面会在此基础上做8bit的定点实现。1, 在python下根据paddlepaddle提供的API(named_parameters)得到模型每层的参数(weight & bias),同时看每层的weight和bias的绝对值的最大值,从而确定参数的Q格式,再以这个Q格式对weight 和bias做量化。

2023-07-21 07:35:46 511

原创 基于飞桨paddlespeech训练中文唤醒词模型

一边训练模型,一边请更多的人用手机录“你好米雅”的唤醒词音频,还要对这些录好的做7k HZ处的低通滤波处理。整个数据集是由3个子数据集(“你好米雅”数据集,“你好米雅”相似词数据集,AIDATATANG数据集)组成的,前两个是同一出品方且用相同的设备录的。又想试试真实录音的wav的准确率如何,请了几个人在办公室环境下用手机录了“你好米雅”的音频,在得到的模型下去测试,结果让我大失所望,识别率特别低。等做产品时用的数据集是私有的,把找到的方法用到模型训练上,就能出一个性能不错的语音唤醒方案。

2023-06-08 07:56:44 1016 6

原创 将音频格式从flac转到wav的两种方法

将音频格式从flac转到wav的两种方法

2023-05-08 08:14:30 583 1

原创 飞桨paddlespeech语音唤醒推理C浮点实现

paddlespeech kws C deployment

2023-04-18 08:09:07 790 2

原创 飞桨paddlespeech 语音唤醒初探

PaddleSpeech提供了MDTC模型在Hey Snips数据集上的语音唤醒(KWS)的实现。这篇论文是用空洞时间卷积网络(dilated temporal convolution network, DTCN)的方法来做的,曾获the 2020 personalized voice trigger challenge (PVTC2020)的第二名,可见这个方案是比较优秀的。想看看到底是怎么做的,于是我对其做了一番初探。

2023-03-03 18:37:59 1845 4

原创 音频音量调整中的ramp up & down

音频音量调整中的ramp up & down

2023-01-16 08:09:51 1354 1

原创 智能语音之远场关键词识别实践(二)

远场关键词识别 前端实践 完整方案

2022-12-18 12:55:52 707

原创 智能语音之远场关键词识别实践(一)

语音识别主要分两大类:大词汇量连续语音识别技术(Large Vocabulary Continuous Speech Recognition,LVCSR)和关键词识别(keyword Spotting,KWS)。LVCSR由于对算力要求较高,一般在云端(服务器侧)做,而KWS对算力的要求相对较小,可以在终端上做。我们公司是芯片设计公司,主要设计终端上的芯片,想要在语音识别上做点事情,最可能的是做KWS,于是我们就选择KWS来实践语音识别。按距离远近,语音识别可分为近场识别和远场识别,远场的应用场景更丰富些,

2022-03-03 08:18:10 1737

原创 麦克风阵列波束形成之DSB原理与实现

语音识别有近场和远场之分,且很多场景下都会用到麦克风阵列(micphone array)。所谓麦克风阵列是一组位于空间不同位置的麦克风按一定的形状规则布置形成的阵列,是对空间传播声音信号进行空间采样的一种装置,采集到的信号包含了其空间位置信息。近场语音识别将声波看成球面波,它考虑各麦克风接收信号间的幅度差;远场语音识别将声波看成平面波,它忽略各麦克风接收信号间的幅度差,近似认为各接收信号之间是简单的时延关系。麦克风阵列可分为一维、二维和三维麦克风阵列。一维麦克风阵列,即线性麦克风阵列,各个麦克风位于同一条直

2022-02-21 08:17:06 3394 3

原创 VoIP语音处理流程和知识点梳理

做音频软件开发10+年,包括语音通信、语音识别、音乐播放等,大部分时间在做语音通信。做语音通信中又大部分时间在做VoIP语音处理。语音通信是全双工的,既要把自己的语音发送出去让对方听到,又要接收对方的语音让自己听到。发送又可叫做上行或者TX,接收又可叫做下行或者RX。之前写了好多关于VoIP语音处理方面的文章,本文想结合框图对相关知识做一个梳理。先综述发送和接收方向的处理,再具体到每个知识点上。讲到某个知识点,如曾经写过相关的文章,就给出链接,如没有写过,等以后写到时再补上链接。由于一些知识点在发送和接收两

2022-01-07 08:11:02 3654

原创 基于MCRA-OMLSA的语音降噪(三):实现(续)

上篇文章(基于MCRA-OMLSA的语音降噪(二):实现)讲了基于MCRA-OMLSA的语音降噪的软件实现。本篇继续讲,主要讲C语言下怎么对数学库里的求平方根(sqrt())、求自然指数(exp())、求自然对数(log())的函数做替换。1,求平方根求平方根最常用的方法是牛顿迭代法。下图是y = f(x)的曲线,当f(x) =0时的值(α)就是该方程的根。可以通过多次迭代逼近的方法求得这个根,原理如下:任取一个x0,这个值对应的y值为f(x0)。在.

2022-01-05 08:09:48 703

原创 基于MCRA-OMLSA的语音降噪(二):实现

上篇文章(基于MCRA-OMLSA的语音降噪(一):原理)讲了基于MCRA-OMLSA降噪的原理,本篇讲怎么做软件实现。软件实现有多种方式。单纯看降噪效果可用python,因为python有丰富的库可用,可节省不少时间,把主要精力放在降噪效果提升上。如果要把算法用在产品上就得用其他语言。我们是芯片公司,且我们team偏底层,最常用的语言是C,所以我又用C实现了该算法。本文先讲讲在python下的实现,再讲讲在C下的实现。一,python下的实现Python有丰富的库,音频文件读取的librosa

2021-12-28 08:11:32 965

原创 基于MCRA-OMLSA的语音降噪(一):原理

前面的几篇文章讲了webRTC中的语音降噪。最近又用到了基于MCRA-OMLSA的语音降噪,就学习了原理并且软件实现了它。MCRA主要用于噪声估计,OMLSA是基于估计出来的噪声去做降噪。类比于webRTC中的降噪方法,也有噪声估计(分位数噪声估计法)和基于估计出来的噪声降噪(维纳滤波),MCRA就相当于分位数噪声估计法,OMLSA就相当于维纳滤波。本文先讲讲怎么用MCRA和OMLSA来做语音降噪的原理,后续会讲怎么来做软件实现。一 MCRAMCRA的全称是Minima Controlled R

2021-12-21 08:11:27 2133 1

原创 webRTC中语音降噪模块ANS细节详解(四)

上篇(webRTC中语音降噪模块ANS细节详解(三))讲了噪声的初始估计方法以及怎么算先验SNR和后验SNR。 本篇开始讲基于带噪语音和特征的语音和噪声的概率计算方法和噪声估计更新以及基于维纳滤波的降噪。一, 带噪语音和特征条件下的语音概率先看怎么算带噪语音和特征条件下的语音概率。其中会用到先前算好的先验SNR和后验SNR,也会用到特征条件下的语音概率,从而涉及到怎么算特征条件下的语音概率,有了特征条件下的语音概率后带噪语音和特征条件下的语音概率就好算了。1, 带噪语音和特征条件下的语音概.

2021-11-15 08:00:41 1320 1

原创 webRTC中语音降噪模块ANS细节详解(三)

上篇(webRTC中语音降噪模块ANS细节详解(二))讲了ANS的处理流程和语音在时域和频域的相互转换。本篇开始讲语音降噪的核心部分,首先讲噪声的初始估计以及基于估计出来的噪声算先验信噪比和后验信噪比。1,初始噪声估计webRTC中ANS的初始噪声估计用的是分位数噪声估计法(QBNE,Quantile Based Noise Estimation),对应的论文为《Quantile Based Noise Estimation For Spectral Subtraction And Wiene.

2021-11-02 08:07:56 2245

原创 webRTC中语音降噪模块ANS细节详解(二)

上篇(webRTC中语音降噪模块ANS细节详解(一))讲了维纳滤波的基本原理。本篇先给出webRTC中ANS的基本处理过程,然后讲其中两步(即时域转频域和频域转时域)中的一些处理细节。ANS的基本处理过程如下图1: 图1从图1可以看出,处理过程主要分6步,具体如下:1) 把输入的带噪信...

2021-10-22 08:06:22 2850

原创 webRTC中语音降噪模块ANS细节详解(一)

ANS(adaptive noise suppression) 是webRTC中音频相关的核心模块之一,为众多公司所使用。从2015年开始,我在几个产品中使用了webRTC的3A(AEC/ANS/AGC)模块。以前仅仅是使用,对其中的算法原理只是初步了解。近半年来,我利用业余时间在看着《语音增强:理论与实践》和《实时语音处理时间指南》这两本书,对降噪算法有了更深的理解,同时又对ANS的代码进行了调试,基本掌握了算法实现。我想把我对ANS的理解写出来。由于内容细节较多,就出一个系列吧。webRTC中的ANS是

2021-10-10 16:39:24 1908

原创 基于混合模型的语音降噪效果提升

上篇文章(基于混合模型的语音降噪实践)实践了基于混合模型的算法来做语音降噪,有了一定的降噪效果。本篇说说怎么样来提升降噪效果。算法里会算每个音素的高斯模型参数,也会建一个音素分类的神经网络模型。这些都是依赖于音素对齐的,音素对齐做的越好,每个音素的高斯模型越准确,音素分类模型越收敛准确率越高,从而算法的降噪效果越好。先前做音素对齐用的是开源工具speech-aligner,怎么样让音素对齐做的更好呢?自己做不太现实(不仅周期长,而且相关专业知识积累有限),还得依赖专业工具。调研下来MFA(Montr

2021-07-19 08:01:54 491 3

原创 基于混合模型的语音降噪实践

前面的文章(语音降噪论文“A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier”的研读 )梳理了论文的思想。本篇就开始对其实践,主要分以下几步:1,基于一个语料库算出每个音素的单高斯模型;2,训练一个输出是一帧是每个音素概率的NN分类判别模型;3,算法实现及调优。1,得到每个音素的单高斯模型要想得到每个音素的单高斯模型,首先得做好音素对齐,知道某一帧对应哪个音.

2021-06-18 07:58:32 382 1

原创 语音降噪论文“A Hybrid Approach for Speech Enhancement ...“的研读

最近认真的研读了一篇关于语音降噪的论文(A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier)。它是一种利用混合模型降噪的方法,即既利用了生成模型(MoG高斯模型),也利用了判别模型(神经网络NN模型)。本文根据自己的理解对原理做了梳理。论文是基于“Speech Enhancement Using a Mixture-Maximum Model”提出的MixMAX.

2021-05-16 22:46:29 954

原创 基于sinc的音频重采样(二):实现

上篇(基于sinc的音频重采样(一):原理)讲了基于sinc方法的重采样原理,并给出了数学表达式,如下: (1)本文讲如何基于这个数学表达式来做软件实现。软件实现的细节很多,这里主要讲核心部分。函数srcUD()和filterUD()就是实现的主要函数(这两个函数是在源码基础上作了一定的改动,核心思想没变)。srcUD()是实现一帧中点的重采样...

2021-04-17 22:08:14 1098 2

原创 基于sinc的音频重采样(一):原理

我在前面的文章《音频开源代码中重采样算法的评估与选择 》中说过sinc方法是较好的音频重采样方法,缺点是运算量大。https://ccrma.stanford.edu/~jos/resample/ 给出了sinc方法的原理文档和软件实现。以前是使用这个算法,没太关注原理和实现细节。去年(2020年)由于项目的需要和组内同学把这个算法的原理和软件实现细节搞清楚了。本文先讲讲sinc方法的原理,后面文章会讲讲软件实现的细节。1,sinc函数和信号的采样与重建在数字信号处理中,sinc函数定义为:.

2021-03-13 23:31:30 3110 1

原创 深度学习中神经网络模型的量化

1,什么是量化2,为什么要量化3,神经网络模型的量化神经网络模型在训练时都是浮点运算的,得到的模型参数也是浮点的。通常模型参数较多,在inference时也有非常多的乘累加运算。如果处理器的算力有限,在inference时用浮点运算将导致CPU load很高,极大影响性能。而且通常一个参数用浮点数表示占四个字节,而如果用8比特量化的话,一个参数只占一个字节,memory得到了极大的节约,在memory紧张的处理器上尤为重要。所以通常都要对神经网络模型进行量化,来降低CPU load和..

2021-02-21 21:03:10 1628 1

原创 嵌入式设备上卷积神经网络推理时memory的优化

以前的神经网络几乎都是部署在云端(服务器上),设备端采集到数据通过网络发送给服务器做inference(推理),结果再通过网络返回给设备端。如今越来越多的神经网络部署在嵌入式设备端上,即inference在设备端上做。嵌入式设备的特点是算力不强、memory小。可以通过对神经网络做量化来降load和省memory,但有时可能memory还吃紧,就需要对神经网络在memory使用上做进一步优化。本文就以一维卷积神经网络为例谈谈怎么来进一步优化卷积神经网络使用的memory。文章(卷积神经网络中一维卷.

2021-02-06 21:18:23 842

原创 智能语音卷积神经网络中一维卷积的处理

卷积神经网络(CNN)是深度学习中常用的网络架构,在智能语音中也不例外,比如语音识别。语音中是按帧来处理的,每一帧处理完就得到了相对应的特征向量,常用的特征向量有MFCC等,通常处理完一帧得到的是一个39维的MFCC特征向量。假设一段语音有N帧,则处理完这段语音后得到的是一个39行N列(行表示特征维度,列表示帧数)的矩阵,这个矩阵是一个平面,是CNN的输入。应用在图像问题上的CNN通常是二维卷积(因为图像有RGB三个通道),而语音问题上的CNN输入是一个矩阵平面,可以用一维卷积。本文就讲讲一维卷积是怎么处理

2021-01-23 20:58:16 2921 5

原创 深度学习分类问题中accuracy等评价指标的理解

在处理深度学习分类问题时,会用到一些评价指标,如accuracy(准确率)等。刚开始接触时会感觉有点多有点绕,不太好理解。本文写出我的理解,同时以语音唤醒(唤醒词识别)来举例,希望能加深理解这些指标。1,TP / FP / TN / FN下表表示为一个二分类的混淆矩阵(多分类同理,把不属于当前类的都认为是负例),图中的四个参数均用两个字母表示,第一个字母表示判断结果正确与否(正确用T(True),错误用F(False),第二个字母表示判定结果(正例用P(Positive),负例用N(Negat.

2021-01-16 21:51:04 7429

原创 音频处理中交织与非交织数据转换的几种方法

当音频的声道数多于一个时,音频数据的存放有两种格式,即交织的(interleave)和非交织的(non-interleave)。以最常见的双声道为例,交织和非交织的音频数据存放如下图:上图中L表示左声道数据,R表示右声道数据,整数1、2等表示第几个采样点,这样L1就表示左声道的第一个采样点数据。从上图看出,所谓交织的是指一个采样点的两个声道的数据依次放在一起,非交织的是指先放左声道的所有采样点的数据,再放右声道的所有采样点的数据。在音频处理时,有时需要交织的数据,而有时又需要非交织的数据..

2020-05-29 23:15:19 2041

原创 我们基于kaldi开发的嵌入式语音识别系统升级成深度学习啦

先前的文章《三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的 》说我们花了不到三个月的时间搭了一个基于kaldi的嵌入式语音识别系统,不过它是基于传统的GMM-HMM的,是给我们练手用的,通过搭这个系统我们累积了一定的语音识别领域的经验,接下来我们就要考虑做什么形态的产品了。语音识别可以分大词汇量连续语音识别(Large Vocabulary Continuous Speec...

2019-12-28 21:34:49 2345 3

原创 kaldi中CD-DNN-HMM网络参数更新公式手写推导

在基于DNN-HMM的语音识别中,DNN的作用跟GMM是一样的,即它是取代GMM的,具体作用是算特征值对每个三音素状态的概率,算出来哪个最大这个特征值就对应哪个状态。只不过以前是用GMM算的,现在用DNN算了。这是典型的多分类问题,所以输出层用的激活函数是softmax,损失函数用的是cross entropy(交叉熵)。不用均方差做损失函数的原因是在分类问题上它是非凸函数,不能保证全局最优解(只...

2019-11-03 22:12:54 1275

原创 机器学习中梯度下降法原理及用其解决线性回归问题的C语言实现

本文讲梯度下降(Gradient Descent)前先看看利用梯度下降法进行监督学习(例如分类、回归等)的一般步骤:1, 定义损失函数(Loss Function)2, 信息流forward propagation,直到输出端3, 误差信号back propagation。采用“链式法则”,求损失函数关于参数Θ的梯度4, 利用最优化方法(比如梯度下降法),进行参数更新5, 重复...

2019-10-17 18:30:05 1139 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除