该博文只针对语音播放,对文字转语音不做深入探讨。语音就是一段拥有一定音频格式的音频,对语音进行播放就需要对该音频进行解码,然而对具有不同音频格式的文件进行解码是一件很繁琐的事。因此,如何选取适当的库来协助开发尤为重要,库选好选对了,这将大大提高我们的开发效率。接下来将会介绍一些相关音频库并使用这些音频库来创建语音播放节点。
相关库介绍
说道多媒体,一般都会使用下面FFmpeg库,它为音视频编解码提供一个高效稳定的框架,并且支持跨平台,功能相当强悍,有兴趣的可以去官网进一步了解。
另一个相信使用Ubuntu的用户不会陌生,当你使用VLC播放器会不会举得很顺畅?貌似大多数格式都能够播放。VLC是多媒体播放器,支持众多音频与视频解码器及档案格式;融合了FFmpeg计划的解码器与libdvdcss程序库使其有播放多媒体档案及加密DVD影碟的功能。
使用VLC
其他还有很多,但看了这两个之后感觉已经不用再找了。既然对ubuntu不陌生,那么就直接在软件中心安装一个VLC播放器吧。然后再安装VLC开发库:注意这里是安装了软件之后还要安装开发库!在终端执行:
’’’ apt-get install libvlccore-dev libvlc-dev ‘’’
对于每个新接触的库,最好的方法就是浏览官方的开发文档,若有什么疑问,可以到相关论坛寻求帮助,这样就会起到事半功倍的效果。这里同样给出:
若不喜欢看也没关系,直接上套路。使用该库简单的算法过程如下:
- 初始化 VLC 播放引擎
- 指定资源路径
- 初始化播放环境装载数据
- 释放资源
- 播放就绪,进入播放线程
- 若需要回调,还需启动监听
- while(直到结束):休眠
- 停止播放
- 释放资源
由于底层解码操作和向声卡写数据都已经封装好,即在最上层应用只需要简单的调用即可,不管是哪种音频文件,vlc播放引擎都会自动解析,这非常方便!
这里有个问题就是需不需要音频结束回调,也就是说需要不要知道音频播放结束的状态。假如说一个交互过程是有反馈的且不接受打断,那么这个就有必要了。若交互过程允许打断,那么这个播放结束状态就是不必要的。
为了实现一个比较简单的,低智能的交互过程,这里定义对话不允许打断,只能等到机器说完话之后才能与之进行下一步的交互。虽然这个过程很蠢,但是再进一步扩展,我们就能够实现打断功能了;只需在这个节点中订阅相应的唤醒节点,然后进行条件判决即可实现打断。(打断最主要的还是要实现回声消除的算法)
代码实现参考:语音播放节点