-
-
Save lgaetz/2cd9c54fb1714e0d509f5f8215b3f5e6 to your computer and use it in GitHub Desktop.
#!/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) | |
# Specify your IBM Bluemix API key and URL on the lines noted below | |
# | |
# 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 |
Not having any luck getting this to work. Can I setup a log file to see what is wrong?
@edlentz, did you ever get anywhere with this? I used @jtsage's sendmail.asterisk which includes an IBM error log with each voicemail. I've not been able to solve the 500 errors that are occurring, however.
May need changes to this scrip to use the new stt models:
https://medium.com/ibm-watson-speech-services/watson-speech-to-text-how-to-plan-your-migration-to-the-next-generation-models-6b10605b3bc5
Haha. good timing, I too just got the annoucement from watson.
Many STT models being deprecated 2022-09-15 including "en-US_NarrowbandModel" which this script currently relies on. Needs to be updated, further reading here.
Just change the API_OPTS="/v1/recognize?model=en-US_NarrowbandModel"
line to API_OPTS="/v1/recognize?model=en-US_Telephony"
, and it works fine.
See here: https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models-migrate#models-migrate-step1
Also for the non-English users, here is a list of speech models: https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models-ng#models-ng-telephony
Because I've not done it in ages, does anybody have a quick howto on dumping shell output to the appropriate log channel for this to happen? Working with @atoporovsky to address his issue, I'd like to hit it in one go.