Divergent Protocol
Downloads:
FLAC (83 MB) VBR MP3 (21 MB) Ogg Vorbis (10 MB) PNG image (403 kB) Shell source code (2 kB) transcript (21 kB)
A feedback process involving speech synthesis and automatic transcription: text is converted to speech using the Flite engine, then the audio is reversed using SoX, and converted back to text with Pocket Sphinx and fed back into the start of the process. If an encode/decode loop is detected, the additional text "Divergent Protocol" is inserted to break the cycle.
POSIX shell source code:
#!/bin/sh
# Divergent Protocol (c) 2017 Claude Heiland-Allen
# mkdir dp && cd dp && ../dp.sh 'divergent protocol' 9
if [ "$1" ]
then
if [ "$2" ]
then
utterance="$1"
target="$2"
n=1
count=1
touch dp.txt
cat > dp.hs <<EOF
import Data.List
main = interact $ unwords . map head . group . words
EOF
ghc -O2 dp.hs
while true
do
for voice in slt awb
do
utterance="$(echo "${utterance}" | ./dp)"
speak="${voice}: ${utterance}"
if grep -q "^${speak}$" dp.txt
then
speak="${speak} ${1}"
utterance="${utterance} ${1}"
count=$((count + 1))
fi
echo "${speak}" | tee -a dp.txt
echo "${utterance}" | flite -voice "${voice}" -o "${voice}.wav"
sox "${voice}.wav" utterance.wav reverse
wait
if [ "${voice}" = "slt" ]
then
sox -M "${voice}.wav" -v 0.7 "${voice}.wav" stereo.wav swap
else
sox -M "${voice}.wav" -v 0.7 "${voice}.wav" stereo.wav
fi
cp -af stereo.wav "${n}.wav"
n=$((n + 1))
# mplayer -quiet -really-quiet stereo.wav &
if [ $count -ge $target ]
then
wait
rm -f slt.wav awb.wav stereo.wav utterance.wav
rename s/^/0/ ?.wav
rename s/^/0/ ??.wav
rename s/^/0/ ???.wav
rename s/^/0/ ????.wav
rename s/^/0/ ?????.wav
sox ??????.wav -e float dp.wav rate 44100 pad 0 6 reverb \
compand 0.01,0.1 6:-1000,-999,-10 -12 -1000 0.01
exit 0
fi
utterance="$(pocketsphinx_continuous -infile utterance.wav 2>/dev/null)"
done
done
else
echo "usage: $0 '$1' 9"
exit 1
fi
else
echo "usage: $0 'divergent protocol' 9"
exit 1
fi
The embedded Haskell program elides repeated words, without it I found it would get stuck into "... she she she she she ..." which didn't sound too good. On my 3GHz AMD64 system, it runs faster than realtime, so could conceivably be modified to run continuously as an internet radio station.
