背景

这篇研究日记是在研究出现状况时的一份记录,分享出来,方便自己记忆查阅,也方便有类似想法的朋友 避坑

介绍

虚拟歌姬自动调教是我正在研究的一个深度学习的落地方式。期间为了提升模型的效果,我们尝试了很多方法,其中之一便是这篇文章将要讨论到的歌曲音频切割。

目标

歌曲音频切割的目标是根据歌曲波形信息,将每一个字对应的音频进行切割。

挑战

相较于一般的对话音频,歌曲音频中字与字的间隔非常模糊,就算是人自己也不容易清晰辨识歌曲音频中的每一个字。

过程

经过连续几个休息日的复现和实验,我整理了以下几种切割方案。

根据停顿对歌曲进行切割

顾名思义就是根据静音区间进行切割。设置响度阀值,低于这个响度的音频都视作静音片段。在处理对话文本时最常用的也是这种方法,因为他最大的好处就是快速可靠。

python代码部分使用的是pydub模块,详细代码参考:Python pydub实现语音停顿切分

1
2
3
4
5
6
7
8
from pydub import AudioSegment
from pydub.silence import split_on_silence

chunks = split_on_silence(sound,
# must be silent for at least half a second
min_silence_len=500,
# consider it silent if quieter than -16 dBFS
silence_thresh=-16)

采用KMEANS方法进行切割

类似的思想我在这篇文章中有提到。使用聚类的方法对音频进行分割,实现对音频的分段。

具体的实现代码这里我推荐一个Github上的项目:py_speech_seg这里面有比较完善的使用Kmeans方法
结合接下来要提到的VAD算法进行音频分割的python函数。

不使用VAD的Kmeans方法无法对音频进行合理的切割,经常会有字中分割的情况,而且无法拟合字数,因而无法确定具体的类别个数 K。

采用VAD算法预处理后再使用Kmeans方法速度更快,效果更好,可以实现在停顿部分进行切割。但是依然需要根据程序的实验结果,人为确定类别个数K,而且存在文本粘连问题,往往一段切割出来的文本中包含好几个字。

根据VAD算法识别间隔并切割

语音激活检测(VAD, Voice Activation Detection)算法主要是用来检测当前声音信号中是否存在人的话音信号的。该算法通过对输入信号进行判断,将话音信号片段与各种背景噪声信号片段区分出来,使得我们能够分别对两种信号采用不同的处理方法。

详见:还是不会VAD?三分钟看懂语音激活检测方法

采用BIC方法进行切割

在统计学里,处理模型选择问题时我们往往采用BIC进行判定,即贝叶斯信息准则。BIC是似然函数(likelihood function)加上一个惩罚项组成的,这个加上的惩罚项与模型拟合的参数有关,这样可以防止过拟合。

参考:Python实现基于BIC的语音对话分割
参考:Speaker, Environment and Channel Change Detection and Clustering via the Bayesian Information Criterion

相较于Kmeans方法,采用BIC的切割相对较慢,但是片段的准确度较高。字的粘连问题得到一定的解决。

采用BILSTM方法进行切割(可能的方法)

在之前提到的py_speech_seg项目中有一种还未完成的机器学习的方法,BILSTM方法,不确定其可行性。

结论

每一种方法都有自己的特点,但是没有一种能够满足我的需求,需要进一步研究。因此最开始的虚拟歌姬自动调教项目需要放缓。

参考