[ROS] 安装 sound_play 驱动及播放、合成声音
相关简介:
audio_common 是一个第三方音频开发包,它实现了音频驱动以及相关的 ROS 消息机制。它包含如下几个库:
1)audio_capture: 从麦克风采集声音
2)audio_play: 从 audio_capture 收集声音并通过声卡播放
3)audio_common_msgs: 声音传输的消息定义
4)sound_play: 播放声音和语音合成
我们这里主要使用的是最后这个 sound_play,它的主要的功能包括:
1)声卡驱动;
2)播放声音(wav、ogg);
3)语音合成(仅限英文)
同时它支持 C++ 以及 python 接口,使得开发者可以不用关心底层的驱动和算法。
0、安装环境:
Ubuntu 14.04
ROS indigo
audio_common 0.2.8
1、下载源码:
sound_play 源码地址如下,它是 audio_common 的一个组件,我们这里将整个 audio_common 库下载:
https://github.com/ros-drivers/audio_common
我这里使用的是 0.2.8 版,您可以在以上地址下载更新版本,或者直接使用我这里的源码包:
audio_common-master.zip
2、编译源码:
1)在你的 ROS 工作区新建一个 audio 目录作为 audio 的 workspace,比如我这里为 ~/rosbuild_ws/package_dir/audio,后面简称为 AUDIO_WORKSPACE_PTAH:
1 2 | mkdir audio cd audio |
2)在下面再新建 src 源码目录以及 audio_common 子目录:
1 | mkdir -p src/audio_common |
3)将刚才下载的代码解压缩并拷贝到该 src 目录下。
4)在 AUDIO_WORKSPACE_PTAH 目录执行如下命令:
1 | rosdep install sound_play |
如果所有依赖库都已安装会显示:
#All required rosdeps installed successfully
如果没有的话则会自动进行安装。
5)在 AUDIO_WORKSPACE_PTAH 目录运行 catkin_make 编译:
1 | catkin_make |
3、运行节点:
1)运行 roscore:
1 | roscore |
2)新开一个 terminal 窗口进入 AUDIO_WORKSPACE_PTAH 并配置环境:
1 | source devel/setup.bash |
3)在刚才新打开的 terminal 窗口运行节点:
1 | rosrun sound_play soundplay_node.py |
如果显示类似以下信息则表示节点打开成功:
[INFO] [WallTime: 1448443557.340794] sound_play node is ready to play sound
4、测试播放:
打开新的 terminal 窗口进行测试。
1)测试播放内置声音:
我们使用系统内置的声音进行播放,运行如下命令:
1 | rosrun sound_play playbuiltin.py 2 |
如果听到两声锣声则表示运行成功。
2)测试播放 WAV 或 MP3 等声音:
使用 play.py 这个例子即可,后面的是我的 wav 路径,你可以修改成你自己的:
1 | rosrun sound_play play.py /home/skylook/Music/a2002011001-e02-ulaw.wav |
或者播放 MP3 文件:
1 | rosrun sound_play play.py /home/skylook/Music/a2002011001-e02-128k.mp3 |
正常情况下它会显示:
Playing "/home/skylook/Music/a2002011001-e02-128k.mp3".
为了方便你测试,我把这两个文件附在这里,你可以下载使用:
sample_sounds.zip
内容试听如下:
WAV:
MP3:
如果你听到了一段古典音乐,那么就说明播放成功了。
3)测试语音合成:
这是比较吸引人的一个功能,它使用了 text2wave 库将一段文本转成语音再进行播放。调用的例子如下:
1 | rosrun sound_play say.py 'Hello world' |
正常情况下它会显示:
Saying: Hello World
Voice: voice_kal_diphone
Volume: 1.0
如果你听到一段蹩脚的英文朗读 Hello World 那么这个例子你也运行成功了。由于音频库大小问题,这个合成效果可能不太自然,有兴趣的同学可以参照参考文献 [3] 研究下 text2wave 库怎么替换下别的声音。
关于 sound_play 的编译调试和运行就说明到这里了。
常见问题:
1)错误: package 'gstreamer-1.0' not found
该错误是由于没有安装 gstreamer 引起,请使用如下命令安装相关 gstreamer 库:
1 | sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev |
2)错误:Error opening pygst.
在执行命令:
1 | rosrun sound_play soundplay_node.py |
时可能出现如下错误:
No handlers could be found for logger "rosout"
**************************************************************
Error opening pygst. Is gstreamer installed? (sudo apt-get install python-gst0.10
**************************************************************
请参照提示执行如下命令安装即可:
1 | sudo apt-get install python-gst0.10 |
3)错误:sh: 1: text2wave: not found
在测试 say.py 的时候可能出现如下错误而无法发出声音:
sh: 1: text2wave: not found
[ERROR] [WallTime: 1448277178.711451] Sound synthesis failed. Is festival installed? Is a festival voice installed? Try running "rosdep satisfy sound_play|sh". Refer to http://wiki.ros.org/sound_play/Troubleshooting
[ERROR] [WallTime: 1448277178.712974] Exception in callback: 'NoneType' object has no attribute 'command'
这是由于没有安装相应的依赖库 festival and festvox-kallpc16k,使用如下命令进行安装:
1 | rosdep install sound_play |
4)错误:asoundconf: command not found
在教程中使用 asoundconf 进行默认声卡配置的时候,会遇到如下错误:
asoundconf: command not found
该错误的原因是 asoundconf 已经过期了。其实通常情况下我们没有必要选择默认声卡,如果需要的话可以在 Setting -> Sound 界面进行设置。至于替换 asoundconf 的工具我也没有找过。
5)错误:Sound command issued
运行例子 say.py 等时,如果出现如下警告:
[WARN] [WallTime: 1448443406.273976] Sound command issued, but no node is subscribed to the topic. Perhaps you forgot to run soundplay_node.py?
请根据提示在新 terminal 窗口运行:
1 | rosrun sound_play soundplay_node.py |
参考文献:
[1] http://wiki.ros.org/sound_play
[2] http://wiki.ros.org/sound_play/Tutorials/ConfiguringAndUsingSpeakers
[3] http://ubuntuforums.org/showthread.php?t=751169