<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ROS中的声音设置 audio_play]]></title><description><![CDATA[<p dir="auto">ROS中提供了audio_common软件包用于处理声音。其中audio_play是用于声音播放的程序。其参数较多，如果对于音频格式没有一些了解就会比较懵。下面是简单的介绍。</p>
<pre><code class="language-xml">&lt;node name="audio_play" pkg="audio_play" type="audio_play" output="screen" respawn="true" respawn_delay="5"
  &gt;
    &lt;param name="device" value=""/&gt;
    &lt;param name="do_timestamp" value="true"/&gt;
    &lt;param name="format" value="wave"/&gt;
    &lt;param name="channels" value="1"/&gt;
    &lt;param name="sample_rate" value="48000"/&gt;
    &lt;param name="sample_format" value="S16LE" /&gt;
    &lt;param name="depth" value="16" /&gt;
    &lt;remap from="audio" to="audio/audio_raw" /&gt;
    &lt;remap from="voice" to="audio/voice_raw" /&gt;
&lt;/node&gt;
</code></pre>
<p dir="auto">先从声音格式说起，</p>
<p dir="auto">format 声音的格式，分为wave和mp3，在程序中这个参数实际上wave并不对应着wav文件格式。如果你直接读取一个wav文件，然后把内容作为消息发布过来是没办法正常播放声音的。wave实际上是PCM格式，mp3是MP3格式。</p>
<p dir="auto">我们知道声音实际上是震动，声音文件就是把振幅按时间顺序记录下来的文件。其中 channels 是声道。sample_rate 是采样率，就是1秒记录多少个数据，采样率越高声音的质量也对应越高。sample_format是采样数据的记录格式。对于振幅信息，我们可以用int去存储，也可以用float去存储，可以16位存储也可以32位存储。上面的sample_format=S16LE就是说采用S有符号的，16位，LE 小端存储数据。这样记录下来的一串数据就是PCM格式。也就是最原始的音频数据。对于wav文件，需要在这些数据的基础上增加文件头，说明当前的数据格式。比如声道，采样率，采样格式等等。而mp3文件就是把PCM数据进行mp3编码之后的文件。</p>
<p dir="auto">然后是声音的播放设备<br />
更详细的说明可以参照这里的<a href="https://community.bwbot.org/topic/16514" target="_blank" rel="noopener noreferrer">文档</a><br />
这也是一个比较麻烦的话题。</p>
<p dir="auto">设置完成后怎么播放声音呢？</p>
<p dir="auto">假如我们有一个音频文件，怎么通过audio_play播放出来呢？这时候就需要用gstreamer了。我们需要把音频文件转换成我们设置的pcm格式。下面是使用gstreamer的转换指令</p>
<pre><code class="language-bash">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
</code></pre>
<p dir="auto">xxx.wav是我们的音频文件的名称。上面的指令把xxx.wav音频文件转换成 S16LE, 48000采样率，单声道的pcm文件。文件保存在/tmp/tts_temp.pcm</p>
<p dir="auto">具体的指令学习可以参照这里的<a href="https://www.cnblogs.com/xleng/tag/gstreamer/" target="_blank" rel="noopener noreferrer">gstreamer教程</a></p>
<p dir="auto">设置完成后一般使用已经没有什么问题了，但是当我们把audio_play通过robot_upstart包作为开机启动服务时，有时会出现没有声音的情况。这是audio_play本身的bug。原因就是在启动过程中可能声音设备还没有准备好，这时候播放声音会导致程序错误，而audio_play没有正确的处理这个错误。可以采用这里的<a href="https://git.bwbot.org/publish/audio_common" target="_blank" rel="noopener noreferrer">修改版本</a>来解决这个问题。</p>
]]></description><link>http://community.bwbot.org/topic/16515/ros中的声音设置-audio_play</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 14:07:00 GMT</lastBuildDate><atom:link href="http://community.bwbot.org/topic/16515.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Jul 2022 03:20:05 GMT</pubDate><ttl>60</ttl></channel></rss>