IoT Bytes

Bits and Bytes of IoT

Play Audio File on Phone Line with Raspberry Pi

Pradeep Singh | 24th Jun 2018

Speaker_Icon

In this article, I am going to share a sample Python script with you that would help you to play an audio (.wav) file on your analog phone line.

1.  Hardware Setup:

I would use the same setup that I used for my other modem related articles (i.e. Raspberry Pi 3 connected with USRobotics USR5637 USB Modem).

If you haven’t gone through my other articles, the following picture depicts my Raspberry Pi + Analog Dial-up Modem setup –

modem_setup

2. Compression Method and Sampling Rate Specifications:

While trying to play an audio file over the phone line using the analog modem, you need to specify voice compression method and the sampling specification using the VSM AT Command (+VSM=cml,vsr). The “cml” parameter identifies the compression method and the “vsr” parameter identifies the sampling rate. You may refer to the following table for the supported values for the USRobotics Modem –

audio_msg4

Before proceeding further, you need to check the compression method and sampling rate of the file that you want to play over the phone line. If the compression method and/or the sampling rate are not supported by your modem, you will not be able to play the audio.

3. Record Audio File:

If you don’t have a .wav file with the compression method and sampling rate supported by your modem, you need to record it on your computer. Though you can use any software to record the audio file, for this article, I am going to use Audacity audio software.

3.1 Download Audacity:

You can download Audacity from the following link and install on your computer –

https://www.audacityteam.org/download/

3.2 Record Audio File using Audacity:

Before you start recording the audio file, make sure you select “mono” recording channel and “8000Hz” sampling rate as shown in the following screenshot –

record1

3.3 Export the Audio File:

To export the recorded file, go to “File” menu and select “Export –> Export as WAV“. This will show you a Save File dialog box. Make sure you select “Other uncompressed files” for “File type“, “WAV (Microsoft)” for “Header” and “Unsigned 8-bit PCM” for “Encoding” as shown in the following screenshot –

record2

4. AT+VSM Command Values for Recorded Audio File:

Since the audio file recorded in previous steps is saved with the compression method of 8-Bit PCM and contains samples at the rate of 8000Hz, you should use the +VSM AT command with following values –

AT+VSM=128,8000

5. AT Command Sequence for Audio Playback using Analog Voice Modem:

To play the audio file you need to follow the following AT command sequence from the serial communication program or the code that you may write (I used Python 2.7 to execute these commands).

If you don’t know the meaning of DTE or DCE, you may google the details. However, following diagram will give you a quick idea about the DTE and DCE devices in my setup –

DTE_DCE

The following tables show the AT Commands and their respective responses from the modem (DCE).

In this example, we are assuming that a call will be received on the modem and the Raspberry Pi will pass the AT Commands to the modem to pick the call and play an audio message –

audio_msg1

After going off-hook, we are now ready to play the wave file over the phone line using the following AT command sequence. You can use a WAVE driver to send the audio data to the modem.

audio_msg2

Once the audio playback is completed, you should hang-up the call using the ATH command as shown in the following table –

audio_msg3

6. Download Python Code Sample:

You can download the sample Python script with implementation on these AT Commands from my Github Repository Octocat, using the following command –

git clone https://github.com/pradeesi/play_audio_over_phone_line

Following terminal output shows the git clone output on raspberry pi –

pi@raspberrypi:~ $ git clone https://github.com/pradeesi/play_audio_over_phone_line
Cloning into 'play_audio_over_phone_line'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 10 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.
pi@raspberrypi:~ $

On successful code download, you should see “play_audio_over_phone_line” directory under your present working directory. CD into the “play_audio_over_phone_line” directory and make sure you have all the files as shown in the following terminal output – 

pi@raspberrypi:~ $ cd play_audio_over_phone_line/
pi@raspberrypi:~/play_audio_over_phone_line $ ls
README.md  play_audio.py  sample.wav
pi@raspberrypi:~/play_audio_over_phone_line $

7. Execute Python Script To Play Audio On The Phone Line:

To run the python script, execute the following command (make sure you are inside play_audio_over_phone_line directory)-

python play_audio.py

Now you can call your landline number and your modem should play the wave file over the phone line. 

Following screenshot shows the terminal output of the python script, during the audio playback –

play_audio


Related Articles:

Record Audio from Phone Line with Raspberry Pi

Incoming Call Details Logger with Raspberry Pi

USB Analog Modem with Raspberry Pi

Python Script to Reset USB Modem COM Port on Raspberry Pi

Python Script to Autodetect Modem COM Port on Raspberry Pi

References:

Wikipedia – Voice modem command set

USRobotics 56K USB Modem Voice Commands

USRobotics 56K USB Modem – Data and General Commands

Voice +V Commands – Developer’s Guide

Blog Home Page:

Let’s Decipher IoT…

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: