利用语音识别技术辅助制作音源的初步尝试
Chaosinism
编辑于 2019年09月01日 08:08

补充说明:B站文章只能进行有限次数的修改,要获得最新的信息与资源可以查看我的个人主页(https://chaosinism.github.io)、B碗页面(https://bowlroll.net/user/261124)或Github仓库(https://github.com/Chaosinism)。如有问题可在个人主页留言或站内私信我。

2019/08/31


若想由一段音频素材(如一首歌或一段对话)制作出供人力Vocaloid使用的音源,第一步是要在素材中把可以用的发音逐个截取出来,此过程通常较为枯燥费力。因此,本文尝试探索一种结合AI语音识别技术加速该过程的方法。下面介绍一下步骤与工具。

(目前没有很方便的图形界面来实现这些功能,因此建议在对命令行与Python有一定使用经验的前提下阅读。)

目标是自动得到一系列单音节发音的wav文件

1、Watson Speech to Text 的使用方法

本步骤使用IBM的语音识别应用来获得每个单词在音频中的位置(起始时间与终止时间),以便之后的截取。

在这个网址注册IBM账号并申请该应用:https://www.ibm.com/watson/services/speech-to-text/

点击左侧按钮即可注册

注册成功后,目前可获得每月100分钟的免费额度,并得到用户名与密码。与注册时输入的用户名密码不同,它们是专门用于语音识别服务的。

点击“显示”可看到用户名和密码

IBM提供一系列API来调用语音识别应用,其中通过HTTP是比较便捷的一种方法。如果是Linux等系统,可以在命令行中使用如下形式的curl命令;如果是Windows系统,可能需要先下载curl(https://curl.haxx.se):

curl -X POST -u "你的用户名&#​34;:"你的密码&#​34; --header "Content-Type: audio/wav&#​34; --data-binary "@你的音频素材文件.wav" &#​34;https://stream.watsonplatform.net/speech-to-text/api/v1/recognize?model=zh-CN_BroadbandModel&word_confidence=true&timestamps=true" --output curl_result.json

介绍一下涉及到的选项:

  • Content-Type: audio/wav: 指明文件类型,最好使用单通道的wav文件,另外对采样率也有要求,下面会解释。

  • model=zh-CN_BroadbandModel:指明语言是中文,这里Broadband对应16000Hz采样率,另有Narrowband对应8000Hz采样率。除中文外,也支持识别其他语言,如日语可以用ja-JP_BroadbandModel,英式英语en-GB_BroadbandModel,美式英语en-US_BroadbandModel等。

  • word_confidence=true:AI对识别出的每个单词有一个置信度(0~1),越接近1表明识别越准确。

  • timestamps=true:每个单词在音频中的起始与终止秒数,这是我们最需要的数据。

若不出意外,等待几分钟后会有一个curl_result.json文件被下载,其中就是语音所对应的文字,与我们需要的时间数据。

2、提取JSON文件的数据并进行音频分割

得到json文件后,就可以按照里面提供的时间信息来切割原本的音频素材。我写了一个简单的Python脚本来执行这个操作,在这里分享一下:

  • https://github.com/Chaosinism/utau_tools

将代码中的文件名换成对应的wav与json文件,执行就可以得到分割后的多个发音。

脚本主要用到这些库:

  • json: 用于读取json格式的数据。

  • wave:用于读取并操作wav文件。

  • scipy:著名的科学计算工具,此处用于辅助操作wav文件。

  • pypinyin:将汉字转换为拼音,用于为切割后的文件命名。

此脚本仅能用于中文音频,但其他语言也大同小异,稍作修改即可。默认情况下脚本输出全部被识别出的发音,其中一些可能并不正确或不适合作为音源,可以设置confidence_threshold变量以仅仅输出置信度较高的发音。

3、注意事项

  • 获得发音文件仅是音源制作的第一步,需要后续手动调整来提高音源质量。以UTAU为例,oto.in并不会自动生成,需要在UTAU中手动设置,或使用setParam来辅助设置。

  • 请勿将本文中介绍的方法用于非法用途。


此次尝试较为肤浅,仅是利用现成的语音模型,其目的与制作音源并不完全相符(例如现成模型有很大比重是对语义的判断,而我们只需要发音)。我也尝试使用可自行定制的离线语音识别系统,如CMU Sphinx,但效果很不理想。若有改进建议或是其它想法,欢迎交流讨论