ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
ROS中的声音设置 audio_play
-
ROS中提供了audio_common软件包用于处理声音。其中audio_play是用于声音播放的程序。其参数较多,如果对于音频格式没有一些了解就会比较懵。下面是简单的介绍。
<node name="audio_play" pkg="audio_play" type="audio_play" output="screen" respawn="true" respawn_delay="5" > <param name="device" value=""/> <param name="do_timestamp" value="true"/> <param name="format" value="wave"/> <param name="channels" value="1"/> <param name="sample_rate" value="48000"/> <param name="sample_format" value="S16LE" /> <param name="depth" value="16" /> <remap from="audio" to="audio/audio_raw" /> <remap from="voice" to="audio/voice_raw" /> </node>
先从声音格式说起,
format 声音的格式,分为wave和mp3,在程序中这个参数实际上wave并不对应着wav文件格式。如果你直接读取一个wav文件,然后把内容作为消息发布过来是没办法正常播放声音的。wave实际上是PCM格式,mp3是MP3格式。
我们知道声音实际上是震动,声音文件就是把振幅按时间顺序记录下来的文件。其中 channels 是声道。sample_rate 是采样率,就是1秒记录多少个数据,采样率越高声音的质量也对应越高。sample_format是采样数据的记录格式。对于振幅信息,我们可以用int去存储,也可以用float去存储,可以16位存储也可以32位存储。上面的sample_format=S16LE就是说采用S有符号的,16位,LE 小端存储数据。这样记录下来的一串数据就是PCM格式。也就是最原始的音频数据。对于wav文件,需要在这些数据的基础上增加文件头,说明当前的数据格式。比如声道,采样率,采样格式等等。而mp3文件就是把PCM数据进行mp3编码之后的文件。
然后是声音的播放设备
更详细的说明可以参照这里的文档
这也是一个比较麻烦的话题。设置完成后怎么播放声音呢?
假如我们有一个音频文件,怎么通过audio_play播放出来呢?这时候就需要用gstreamer了。我们需要把音频文件转换成我们设置的pcm格式。下面是使用gstreamer的转换指令
gst-launch-1.0 filesrc location=xxx.wav ! decodebin ! audioconvert ! audio/x-raw, format=S16LE, channels=1 ! audioresample ! audio/x-raw, rate=48000 ! filesink location=/tmp/tts_temp.pcm
xxx.wav是我们的音频文件的名称。上面的指令把xxx.wav音频文件转换成 S16LE, 48000采样率,单声道的pcm文件。文件保存在/tmp/tts_temp.pcm
具体的指令学习可以参照这里的gstreamer教程
设置完成后一般使用已经没有什么问题了,但是当我们把audio_play通过robot_upstart包作为开机启动服务时,有时会出现没有声音的情况。这是audio_play本身的bug。原因就是在启动过程中可能声音设备还没有准备好,这时候播放声音会导致程序错误,而audio_play没有正确的处理这个错误。可以采用这里的修改版本来解决这个问题。