-
-
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 |
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
Did a half-hearted attempt at modernizing this on my fork https://gist.github.com/jtsage/f38151b43debb6bd90ebaa4f0ab2687f - but the only real change here is the already mentioned change to the API_OPTS - this is with a clean install of 17, done today. At some point I need to do the logging correctly, because it's not, but it's been 20 years since I wrote shell scripts.
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.