Navigation

    蓝鲸ROS机器人论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • Popular
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision

    ROS中的声音设置 audio_play

    技术交流
    audioplay pcm gstreamer
    1
    1
    933
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • weijiz
      weijiz last edited by weijiz

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

      1 Reply Last reply Reply Quote 0
      • 1 / 1
      • First post
        Last post
      Copyright © 2015-2023 BlueWhale community