-
-
Save thenewguy/511722174c9a7f19f93e8425d2d46309 to your computer and use it in GitHub Desktop.
Asterisk voicemail mailcmd script for VM transcription
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# sendmail-bluemix | |
# current verison of this script: https://gist.github.com/lgaetz/2cd9c54fb1714e0d509f5f8215b3f5e6 | |
# | |
# | |
# Original source created by N. Bernaerts: https://github.com/NicolasBernaerts/debian-scripts/tree/master/asterisk | |
# modified per: https://jrklein.com/2015/08/17/asterisk-voicemail-transcription-via-ibm-bluemix-speech-to-text-api/ | |
# | |
# | |
# Notes: This is a script modified from the original to work with a FreePBX Distro PBX so that email notifications sent from | |
# Asterisk voicemail contain a speech to text trasncription provided by IBM Bluemix | |
# | |
# License: There are no explicit license terms on the original script or on the blog post with modifications | |
# I'm assumig GNU/GPL2+ unless notified otherwise by copyright holder(s) | |
# | |
# Usage: copy this file to /usr/sbin/ set ownership to asterisk:asterisk and make it executable. | |
# In the [general] section of /etc/asterisk/voicemail.conf set mailcmd=/usr/sbin/sendmail-bluemix | |
# This script also uses dos2unix, ensure it is executable by the asterisk user (chmod 777) | |
# | |
# Version History: | |
# 2017-09-17 Initial commit by lgaetz, working but unpolished | |
# 2017-09-18 Original attachment added to email | |
# 2017-09-18 fixed problem with email without attachments | |
# 2020-04-16 COVID-19 edition - updated to use API key using method from github user @jtsage | |
# Specify IBM Bluemix API credentials | |
# follow instructions here to get key and url https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-gettingStarted | |
# key is long string separated by underscore(s). API_OPTS assumes US english, but there are many other language options available | |
# see full API reference at: https://cloud.ibm.com/apidocs/speech-to-text | |
API_KEY="xxxxxxxxx_xxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxx" | |
API_URL="https://api.us-south.speech-to-text.watson.cloud.ibm.com/instances/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" | |
API_OPTS="/v1/recognize?model=en-US_NarrowbandModel" | |
# set PATH | |
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" | |
# save the current directory | |
pushd . | |
# create a temporary directory and cd to it | |
TMPDIR=$(mktemp -d) | |
cd $TMPDIR | |
# dump the stream to a temporary file | |
cat >> stream.org | |
# get the boundary | |
BOUNDARY=$(grep "boundary=" stream.org | cut -d'"' -f 2) | |
# if mail has no boundaries, assume no attachment | |
if [ "$BOUNDARY" = "" ] | |
then | |
# send the original stream | |
mv stream.org stream.new | |
else | |
# cut the original stream into parts | |
# stream.part - header before the boundary | |
# stream.part1 - header after the bounday | |
# stream.part2 - body of the message | |
# stream.part3 - attachment in base64 (WAV file) | |
# stream.part4 - footer of the message | |
awk '/'$BOUNDARY'/{i++}{print > "stream.part"i}' stream.org | |
# cut the attachment into parts | |
# stream.part3.head - header of attachment | |
# stream.part3.wav.base64 - wav file of attachment (encoded base64) | |
sed '7,$d' stream.part3 > stream.part3.wav.head | |
sed '1,6d' stream.part3 > stream.part3.wav.base64 | |
# convert the base64 file to a wav file | |
dos2unix -o stream.part3.wav.base64 | |
base64 -di stream.part3.wav.base64 > stream.part3.wav | |
# Send WAV to Watson Speech to Text API. Must use "Narrowband" (aka 8k) model since WAV is 8k sample | |
# Send WAV to Watson Speech to Text API. Must use "Narrowband" (aka 8k) model since WAV is 8k sample | |
CURL_OPTS="" | |
curl -s $CURL_OPTS -k -u "apikey:$API_KEY" -X POST \ | |
--limit-rate 40000 \ | |
--header "Content-Type: audio/wav" \ | |
--data-binary @stream.part3.wav \ | |
"$API_URL$API_OPTS" 1>audio.txt | |
# Extract transcript results from JSON response | |
TRANSCRIPT=`cat audio.txt | grep transcript | sed 's#^.*"transcript": "##g' | sed 's# "$##g'` | |
# generate first part of mail body, converting it to LF only | |
mv stream.part stream.new | |
cat stream.part1 >> stream.new | |
sed '$d' < stream.part2 >> stream.new | |
# beginning of transcription section | |
echo "--- Automated transcription result ---" >> stream.new | |
# append result of transcription | |
echo "$TRANSCRIPT" >> stream.new | |
# end of message body | |
tail -1 stream.part2 >> stream.new | |
# add orig attachment | |
cat stream.part3 >> stream.new | |
# append end of mail body, converting it to LF only | |
echo "" >> stream.tmp | |
echo "" >> stream.tmp | |
cat stream.part4 >> stream.tmp | |
dos2unix -o stream.tmp | |
cat stream.tmp >> stream.new | |
fi | |
# send the mail thru sendmail | |
cat stream.new | sendmail -t | |
# go back to original directory | |
popd | |
# remove all temporary files and temporary directory | |
rm -Rf $TMPDIR |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment