
源码分析
文章平均质量分 61
源码分析
安安爸Chris
这个博客用于写自己兴趣所在的内容,主要是源码阅读和智能语音相关的。 我另一个博客主要写工作相关的,请参考https://www.jianshu.com/u/3f1c3f228fa5
展开
-
【Dual-Path-RNN-Pytorch源码分析】loss函数:SI-SNR
DPRNN使用的loss函数是 SI-SNRSI-SNR 是scale-invariant source-to-noise ratio的缩写,中文翻译为尺度不变的信噪比,意思是不受信号变化影响的信噪比公式公式如下:{starget=⟨s^,s⟩s∣∣s∣∣2enoise=s^−stargetSISNR=10log10∣∣starget∣∣2∣∣enoise∣∣2\begin{cases}s_{target} = \cfrac {\lang{\hat s,s}\rangle s} {||s||原创 2021-09-12 10:01:50 · 8124 阅读 · 1 评论 -
【Dual-Path-RNN-Pytorch源码分析】AudioReader
AudioReader 是Dual-Path-RNN-Pytorch源码中用来读入scp文件的工具类,它的输入是一个scp文件的全路径。有关scp文件,它是一个文件与文件路径的记录文件。 内容样例如下1.wav /local/file/path/1.wav2.wav /local/file/path/2.wav3.wav /local/file/path/3.wav4.wav /local/file/path/4.wav5.wav /local/file/path/5.wav6.原创 2021-09-09 11:38:23 · 987 阅读 · 0 评论 -
【Dual-Path-RNN-Pytorch源码分析】Dual_RNN_Block
Dual_RNN_Block应该是整个网络中最重要的部分了。这里,每一个Block相当于网络内部的一层 ,源码中默认设置4层Dual_RNN_Block。每一个Dual_RNN_Block又分为intra_rnn(块内rnn)和inter_rnn(块间rnn)intra_rnn和inter_rnn是dual的灵魂,但是刚开始接触很难理解这个概念。结合代码和原论文的配图,可以理解为对Dual_RNN_Block的3D上对K和S维度训练输入张量输入的张量shape为[B, N, K, S],原创 2021-09-03 16:20:29 · 1002 阅读 · 0 评论 -
【Dual-Path-RNN-Pytorch源码分析】Segmentation
请参考Dual-Path-RNN-Pytorch的网络架构图。 这里我们单独把Segmentation部分拿来分析。 (文件:model_rnn.py)到达Segmentation时,输入的张量维度为[B,N,L], 其中B为Batch Size, N为特征维度, L为特征长度。主体函数函数主体如下,输入首先做paddingpaddingpadding函数如下:该函数主要做两件事将最后一维(特征长度)对齐,即如果长度要与P(hop size)的整数倍对齐将对齐后张量前后各补长度为P原创 2021-09-01 21:46:43 · 751 阅读 · 2 评论 -
【Dual-Path-RNN-Pytorch源码分析】model的架构图
原创 2021-09-01 00:38:40 · 483 阅读 · 0 评论 -
【opus源码分析】celt_fir5函数
celt_fir5函数是一个内部函数,用于计算FIR的代码如下/*** x 是输入信号* num 是FIR系数,在opus里这里是autocorrelation系数* y 是输出信号* N 是x输入信号的长度* mem是用于计算的数组,它用于依次储存x[i-1],x[i-2],x[i-3],x[i-4]的值*/static void celt_fir5(const opus_val16 *x, const opus_val16 *num, opus_va原创 2020-06-18 21:04:47 · 800 阅读 · 0 评论 -
【opus源码分析】【互相关函数源码分析】xcorr_kernal_c
今天只看一个函数xcorr_kernal_c,它的位置位于pitch.h里。这个函数是用于计算两个函数的相关性的,然后输出到长度为4的数组里。定义如下void xcorr_kernel_c(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len)入参x和y是两个用于计算的函数x和函数y。长度为4...原创 2020-02-04 18:32:57 · 870 阅读 · 0 评论 -
[flite源码分析一]常用数据结构cst_val
flite里的基础数据结构,最常见的是cst_val.这个结构设计的很巧妙.有如下特点最基础的数据结构,可以用于存储int,float,string,和其他对象.同样可以存放列表和树. cst_val结构很巧妙的设计成只占用8字节(也可能是16字节在64位机器上). cst_val内部分为栈类型(atomic)和堆类型(cons). 其中,堆类型是引用计数的.有关cons,可以参考...原创 2019-09-02 13:46:22 · 472 阅读 · 0 评论 -
【Harvest源码分析】GetF0CandidateContour函数
该函数,顾名思义,就是描绘F0 Candidate的轮廓。在GetFourZeroCrossingIntervals函数中,已经介绍了如何获取ZeroCrossings了。不清楚的可以再看一下我的那一篇文章。void GetF0CandidateContour(const ZeroCrossings *zero_crossings, double boundary_f0, double f0_floor, double f0_ceil, const double *temporal_po原创 2020-07-14 20:12:47 · 396 阅读 · 0 评论 -
【Harvest源码分析】NuttallWindow
NuttallWindow是Matlab里nuttallwin函数函数形式为Harvest里的四个系数和matlab的nattallwin稍微有些不同,这里为w(t)=0.355768+0.487396cos(π2Tct)+0.144232cos(πTct)+0.012604cos(3π2Tct)w(t) = 0.355768 + 0.487396cos( \frac {\pi }{2T_c} t) + 0.144232cos( \frac {\pi }{T_c} t) +0.012604cos原创 2020-07-07 19:11:59 · 585 阅读 · 0 评论 -
【Harvest源码分析】获取F0轮廓
频率36.629HZ频率44.321HZ频率50.037HZ频率54.566HZ频率60.545HZ频率66.024HZ频率74.539HZ频率84.152HZ频率95.005HZ频率119.009HZ频率149.078HZ频率171.246HZ频率200.148HZ频率214.514HZ频率238.018HZ频率278.190HZ频率314.066HZ频率380.018HZ频率436.526HZ频率492.823HZ频率586.068HZ频率684.原创 2020-07-06 16:11:33 · 515 阅读 · 1 评论 -
【Harvest源码分析】GetFilteredSignal函数
static void GetFilteredSignal(double boundary_f0, int fft_size, double fs,const fft_complex *y_spectrum, int y_length, double *filtered_signal)入参boundary_f0 边界频率,来自boundary_f0_list。它是一个长度为number_of_channels(185)的double数组。numberofchannels=1+log(f0f.原创 2020-07-09 20:50:11 · 367 阅读 · 0 评论 -
【Harvest源码分析】GetWaveformAndSpectrumSub函数
GetWaveformAndSpectrumSub函数基本就是Matlab版本的decimate实现。用于降采样。Matlab版本的decimate使用在这里在输入信号x的首尾,分别加了140长度的lag。 首部的lag全为x[0];尾部的lag全为x[x_length - 1]下图是降采样的前后对比,紫色是原来采样22050Hz,绿色是7350.(r=3)...原创 2020-07-07 16:40:27 · 262 阅读 · 0 评论 -
【Harvest源码分析】GetFourZeroCrossingIntervals函数
背景一个完整的正弦波存在如下性质,波峰间隔,波谷间隔,向上过零间隔,向下过零间隔这四者的值理论上应该一致的。那么该函数,顾名思义,就是取这四段值的代码数据结构用来保存这四段值得结构 ZeroCrossingstypedef struct { double *negative_interval_locations; //向下过零x值 double *negative_intervals; //向下过零y值 int number_of_negatives;原创 2020-07-13 21:53:33 · 391 阅读 · 0 评论 -
【rnnoise源码分析】rnn_train中的训练模型
rnnoise中的训练模型在rnn_train.py文件中,其中构建的model我梳理了一下,画图如下,方便大家理解其中model中的input和output就是图中标色的部分model = Model(inputs=main_input, outputs=[denoise_output, vad_output])不难看出,其实rnnoise的另一个训练产物是vad。...原创 2021-05-07 16:45:45 · 1047 阅读 · 0 评论 -
【rnnoise快速体验】rnnoise从编译到训练
运行环境为Ubuntu18.04C部分下载源码从github上下载源码,目前只有master分支,就拿master分支下来。准备编译环境干净的linux环境可能会没有安装gcc等编译工具所以要把下列编译所需的东西装好‘’’apt-get install build-essentialapt-get install autoconf libtool‘’’编译rnnoise的C部分源码unzip rnnoise-master.zipcd rnnoise-master.原创 2021-03-28 16:38:59 · 4189 阅读 · 1 评论 -
【rnnoise源码分析】compute_frame_feature函数
函数形式/*** @param st 全局context,存储一些上下文用的变量和结构体* @param X 根据入参in生成的频域数据,其中在训练时,低频部分被全部清零* @param P 是含有基频(pitch)部分语音信号生成的频域数据* @param Ex [band](https://blog.youkuaiyun.com/mimiduck/article/details/106390000)能量数据 * @param Ep 对应pitch信号数据的band能量* @param Exp 信号原创 2021-03-27 01:51:52 · 1326 阅读 · 4 评论 -
【rnnoise源码分析】band能量计算
rnnoise中有个函数compute_band_energy,用于计算band的能量值。这里有几个概念需要理清楚。基本概念首先,什么是band?band字面意思是频率带,是一组频率的范围。大家都知道,音声都是由频率的,而频率范围很广。人耳可知的频率范围就在20到20000hz。如果这些频率都参与计算,计算量过大。特别是一些实时系统,希望延迟低,计算量小,为了减少运算量,同时也根据人耳对低频敏感,高频不敏感的特性,不均等的对频谱作为划分,划分的每一小段就是一个band。大名鼎鼎的Mel Scale,原创 2020-05-28 18:30:44 · 2814 阅读 · 5 评论 -
【rnnoise源码分析】biquad滤波器
rnnoise的主要函数rnnoise_process_frame中首先是对输入的信号做biquad滤波。biquad Filter双二阶滤波器,wiki介绍在这里它是一种IIR filter双二阶滤波器系数a1,a2,b0,b1,b2公式如下一般运算使用如下公式:rnnoise源码中的双二阶计算函数是上述公式的实现,但是加入了调节参数mem。该参数从训练模型中获取函数源码如...原创 2020-03-07 01:31:30 · 3657 阅读 · 1 评论