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