ROS中的声音设置 audio_play

文章介绍了ROSaudio_common软件包中的audio_play程序,用于声音播放。重点讲解了音频格式如PCM和MP3,参数包括采样率、声道、格式等。提到了将音频文件通过Gstreamer转换为所需格式以配合audio_play播放,并讨论了audio_play在开机启动时可能出现的声音设备未准备好问题及解决方案。
摘要由CSDN通过智能技术生成

原文链接

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没有正确的处理这个错误。可以采用这里的修改版本来解决这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值