🍀碎碎念🍀 Hello米娜桑,这里是英国留学中的杨丝儿。我的博客的关键词集中在算法、机器人、人工智能、数学等等,点个关注吧,持续高质量输出中。 ⭐️B站账号:杨丝儿今天也在科学修仙
这篇研究日记是在研究出现状况时的一份记录,分享出来,方便自己记忆查阅,也方便有类似想法的朋友 避坑。
虚拟歌姬自动调教是我正在研究的一个深度学习的落地方式。期间为了提升模型的效果,我们尝试了很多方法,其中之一便是这篇文章将要讨论到的歌曲音频切割。
歌曲音频切割的目标是根据歌曲波形信息,将每一个字对应的音频进行切割。
相较于一般的对话音频,歌曲音频中字与字的间隔非常模糊,就算是人自己也不容易清晰辨识歌曲音频中的每一个字。
经过连续几个休息日的复现和实验,我整理了以下几种切割方案。
顾名思义就是根据静音区间进行切割。设置响度阀值,低于这个响度的音频都视作静音片段。在处理对话文本时最常用的也是这种方法,因为他最大的好处就是快速可靠。
python代码部分使用的是pydub模块,详细代码参考:Python pydub实现语音停顿切分
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)
类似的思想我在之前文章中有提到。使用聚类的方法对音频进行分割,实现对音频的分段。
具体的实现代码这里我推荐一个Github上的项目:py_speech_seg这里面有比较完善的使用Kmeans方法 结合接下来要提到的VAD算法进行音频分割的python函数。
不使用VAD的Kmeans方法无法对音频进行合理的切割,经常会有字中分割的情况,而且无法拟合字数,因而无法确定具体的类别个数 K。
采用VAD算法预处理后再使用Kmeans方法速度更快,效果更好,可以实现在停顿部分进行切割。但是依然需要根据程序的实验结果,人为确定类别个数K,而且存在文本粘连问题,往往一段切割出来的文本中包含好几个字。
语音激活检测(VAD, Voice Activation Detection)算法主要是用来检测当前声音信号中是否存在人的话音信号的。该算法通过对输入信号进行判断,将话音信号片段与各种背景噪声信号片段区分出来,使得我们能够分别对两种信号采用不同的处理方法。
在统计学里,处理模型选择问题时我们往往采用BIC进行判定,即贝叶斯信息准则。BIC是似然函数(likelihood function)加上一个惩罚项组成的,这个加上的惩罚项与模型拟合的参数有关,这样可以防止过拟合。
参考:Python实现基于BIC的语音对话分割 参考:Speaker, Environment and Channel Change Detection and Clustering via the Bayesian Information Criterion
相较于Kmeans方法,采用BIC的切割相对较慢,但是片段的准确度较高。字的粘连问题得到一定的解决。
在之前提到的py_speech_seg
项目中有一种还未完成的机器学习的方法,BILSTM方法,不确定其可行性。
每一种方法都有自己的特点,但是没有一种能够满足我的需求,需要进一步研究。因此最开始的虚拟歌姬自动调教项目需要放缓。