This page gives info about recording and playing back sound troght the
For using the head microphones we must install the
PortAudio on the head and local computer.
- Install portaudio (in Ubuntu
sudo apt install portaudio19-dev)
- In the cmake configurations, we should turn on four options by running ccmake . in the
ENABLE_yarpmod_AudioPlayerWrapper ON ENABLE_yarpmod_AudioRecorderWrapper ON ENABLE_yarpmod_portaudio ON ENABLE_yarpmod_portaudioPlayer ON ENABLE_yarpmod_portaudioRecorder ON
If you rely on
robotology-superbuild, the configuration and the building process will automatically take care of the
Recording and Playback¶
Recording and playback is supported in yarp via
libportaudio, which wraps on the top of the linux device drivers.
These yarp devices are
portaudioPlayer (http://www.yarp.it/git-master/classPortAudioPlayerDeviceDriver.html) and
portaudioRecorder (http://www.yarp.it/git-master/classPortAudioRecorderDeviceDriver.html), we need to enable them from ccmake when we compile yarp on the laptop (the option is avilable only if libportaudio needs to be installed). On icub, these devices are already enabled by default.
Then, yarp has two network wrappers to send received audio data to/from the network. These devices are
AudioPlayerWrapper (http://www.yarp.it/git-master/classAudioPlayerWrapper.html) and
AudioRecorderWrapper (http://www.yarp.it/git-master/classAudioRecorderWrapper.html) . Again, we need to check our yarp ccmake configuration to enable and compile them.
We can record audio from a microphone and stream it over the network with the command:
yarpdev --device AudioRecorderWrapper --subdevice portaudioRecorder --start
On the other side, we can played some sound received from the network with:
yarpdev --device AudioPlayerWrapper --subdevice portaudioPlayer --start
We can connect the two modules with the command:
yarp connect /audioPlayerRecorder/audio:o /audioPlayerWrapper/audio:i tcp_fast
The option --start will automatically enable the devices on startup; otherwise, we can start/stop the recording/playback by sending the command on the corresponding RPC ports.
All these devices/subdevices require some specific (and complex) options to work properly. These options are documented in the YARP doc pages linked above.
The parameters required by portaudioRecorder/portaudioPlayer are specific to the sound format (e.g. frequency, sample format etc).
The parameters required by AudioRecorderWrapper/AudioPlayerWrapper define the fragmentation of the sound packets over the network and the buffering options. We recommend using the default options. Please note that buffering introduces some inevitable delay (five seconds by default), and that realtime audio playback is not currently supported (so we might hear some clicks, when a buffer underrun occurs).
Processing audio in a application¶
A different use case is processing audio in a application. To do this:
- read the audio data directly from the
- open an AudioPlayerWrapper in your module, using the standard polydriver.
- Using the second option, the audio packets should be already assembled by the wrapper.
Finally, we also have some test devices:
yarp_fakeMicrophone yarp_fakeSpeaker yarp_audioToFileDevice yarp_audioFromFileDevice
which can be used for testing/development purpose without the need of the real hardware.
Grabbing audio from the microphones¶
yarpdev --device AudioRecorderWrapper --subdevice portaudioRecorder --start on the head pc104, you'll get audio from icub microphones.
Simulate a microphone¶
If you want to simulate a microphone, i.e. play a file from disk:
yarpdev --device AudioRecorderWrapper --subdevice audioFromFileDevice --file_name myfile.wav --start
In both cases, the port opened by default by AudioRecorderWrapper is /audioRecorderWrapper/audio:o. You can check the options described in AudioRecorderWrapper.h if you want to choose a custom port name.