It is possible to create an AGI script that uses the native text-to-speech services in Mac OS X to play phrases within the PBX.
Create an AGI shell script called “osx_say.agi” in the Asterisk agi-bin directory. Be sure that the file is flagged as executable using “chmod 755 osx_say.agi”.
#!/bin/bash
PHRASE=$1
FILENAME=`echo "${PHRASE}" | md5`
if [ ! -f /tmp/${FILENAME}.ulaw ]; then
say -o /tmp/${FILENAME}.aiff "$PHRASE"
afconvert -f "NeXT" -d 'ulaw@8196' /tmp/${FILENAME}.aiff /tmp/${FILENAME}.tmp
dd ibs=1 skip=28 if=/tmp/${FILENAME}.tmp of=/tmp/${FILENAME}.ulaw
rm /tmp/${FILENAME}.tmp
rm /tmp/${FILENAME}.aiff
fi
if [ "$2" ]
then
echo "SET VARIABLE ${2} /tmp/${FILENAME} \"\"\n";
print "\n";
else
echo "EXEC PLAYBACK /tmp/${FILENAME} \"\"\n";
fi
The script is configured to use the default voice, which is fairly good in OS X 10.5 Leopard or later. It also caches phrases based on their MD5 hash, so repeated sounds will not need to be regenerated very often.
Invoking the script from a dialplan is fairly straightforward:
exten => 1000,1,AGI(osx_say.agi, "Welcome to Asterisk.")
Instead of immediately calling Playback, the script can set a variable to the audio file path. This is useful for integrating the sound with other scripts or modules, such as with Background. The variable name should be specified as the second parameter.
exten => 1000,1,AGI(osx_say.agi, "Welcome to Asterisk.", PHRASE_VAR)
exten => 1000,2,Background(${PHRASE_VAR})