diff options
Diffstat (limited to 'tools/voicecommon.sh')
-rw-r--r-- | tools/voicecommon.sh | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/tools/voicecommon.sh b/tools/voicecommon.sh new file mode 100644 index 0000000000..d6759d834b --- /dev/null +++ b/tools/voicecommon.sh @@ -0,0 +1,282 @@ +#!/bin/sh +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# $Id$ +# +# Copyright (c) 2006 Jonas Häggqvist +# +# All files in this archive are subject to the GNU General Public License. +# See the file COPYING in the source tree root for full license agreement. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +# A selection of functions common to creating voicefiles for Rockbox. +# +# You may wish to change some of the settings below. + +##################### +# Program locations # +##################### + +# Leave any you're not using untouched, enter full path if the program is +# not found + +# the festival main executable +FESTIVAL_BIN=festival +# the festival_client binary +FESTIVAL_CLIENT=festival_client + +# The flite executable +FLITE_BIN=flite + +# The eSpeak executable +ESPEAK_BIN=speak + +# The lame executable +LAME_BIN=lame + +# The speexenc executable +SPEEX_BIN=speexenc + +# The oggenc executable +VORBIS_BIN=oggenc + +# The wavtrim executable +WAVTRIM=`dirname $0`/wavtrim + +##################### +# Festival settings # +##################### + +# If you're not using festival, leave untouched + +# whether to start the Festival server locally (Y/N) +FESTIVAL_START=Y +# the host of the Festival server +# this is set to localhost automatically when FESTIVAL_START is Y +FESTIVAL_HOST=localhost +# the port of the Festival server +FESTIVAL_PORT=1314 +# where to log the Festival client output +FESTIVAL_LOG=/dev/null +# other options to the festival client +FESTIVAL_OPTS="" + +################## +# Flite settings # +################## + +# If you're not using flite, leave untouched +FLITE_OPTS="" + +################### +# eSpeak settings # +################### + +# If you're not using eSpeak, leave untouched +ESPEAK_OPTS="" + +#################### +# Wavtrim settings # +#################### + +# The maximum sample value that will be treated as silence by the wavtrim tool. +# The value is expressed as an absolute 16 bit integer sample value (0 dB equals +# 32767). +# +# 500 is a good guess - at least for Festival + +NOISEFLOOR='500' + +##################### +# Encoding settings # +##################### +# where to log the encoder output +ENC_LOG=/dev/null + +# Suggested: --vbr-new -t --nores -S +# VBR, independent frames, silent mode +LAME_OPTS="--vbr-new -t --nores -S" + +# Suggested: +# XXX: suggest a default +SPEEX_OPTS="" + +# Suggested: -q0 --downmix +# Low quality, mono +VORBIS_OPTS="-q0 --downmix" + +################### +# End of settings # +################### + +# Check if executables exist and perform any necessary initialisation +init_tts() { + case $TTS_ENGINE in + festival) + # Check for festival_client + if [ ! `which $FESTIVAL_CLIENT` ]; then + echo "Error: $FESTIVAL_CLIENT not found" + exit 4 + fi + + # Check for, and start festival server if specified + if [ X$FESTIVAL_START = XY ]; then + if [ ! `which $FESTIVAL_BIN` ]; then + echo "Error: $FESTIVAL_BIN not found" + exit 3 + fi + FESTIVAL_HOST='localhost' + $FESTIVAL_BIN --server 2>&1 > /dev/null & + FESTIVAL_SERVER_PID=$! + sleep 3 + if [ `ps | grep -c "^\ *$FESTIVAL_SERVER_PID"` -ne 1 ]; then + echo "Error: Festival not started" + exit 9 + fi + fi + # Test connection to festival server + output=`echo -E "Rockbox" | $FESTIVAL_CLIENT --server \ + $FESTIVAL_HOST --otype riff --ttw --output \ + /dev/null 2>&1` + if [ $? -ne 0 ]; then + echo "Error: Couldn't connect to festival server at" \ + "$FESTIVAL_HOST ($output)" + exit 8 + fi + ;; + flite) + # Check for flite + if [ ! `which $FLITE_BIN` ]; then + echo "Error: $FLITE_BIN not found" + exit 5 + fi + ;; + espeak) + # Check for flite + if [ ! `which $ESPEAK_BIN` ]; then + echo "Error: $ESPEAK_BIN not found" + exit 5 + fi + ;; + *) + echo "Error: no valid TTS engine selected: $TTS_ENGINE" + exit 2 + ;; + esac + if [ ! -x $WAVTRIM ]; then + echo "Error: $WAVTRIM is not available" + exit 11 + fi +} + +# Perform any necessary shutdown for TTS engine +stop_tts() { + case $TTS_ENGINE in + festival) + if [ X$FESTIVAL_START = XY ]; then + # XXX: This is probably possible to do using festival_client + kill $FESTIVAL_SERVER_PID > /dev/null 2>&1 + fi + ;; + esac +} + +# Check if executables exist and perform any necessary initialisation +init_encoder() { + case $ENCODER in + lame) + # Check for lame binary + if [ ! `which $LAME_BIN` ]; then + echo "Error: $LAME_BIN not found" + exit 6 + fi + ;; + speex) + # Check for speexenc binary + if [ ! `which $SPEEX_BIN` ]; then + echo "Error: $SPEEX_BIN not found" + exit 7 + fi + ;; + vorbis) + # Check for vorbis encoder binary + if [ ! `which $VORBIS_BIN` ]; then + echo "Error: $VORBIS_BIN not found" + exit 10 + fi + ;; + *) + echo "Error: no valid encoder selected: $ENCODER" + exit 1 + ;; + esac + +} + +# Encode file $1 with ENCODER and save the result in $2, delete $1 if specified +encode() { + INPUT=$1 + OUTPUT=$2 + + if [ ! -f "$INPUT" ]; then + echo "Warning: missing input file: \"$INPUT\"" + else + echo "Action: Encode $OUTPUT with $ENCODER" + case $ENCODER in + lame) + $LAME_BIN $LAME_OPTS "$WAV_FILE" "$OUTPUT" >>$ENC_LOG 2>&1 + ;; + speex) + $SPEEX_BIN $SPEEX_OPTS "$WAV_FILE" "$OUTPUT" >>$ENC_LOG 2>&1 + ;; + vorbis) + $VORBIS_BIN $VORBIS_OPTS "$WAV_FILE" -o "$OUTPUT" >>$ENC_LOG 2>&1 + esac + if [ ! -f "$OUTPUT" ]; then + echo "Warning: missing output file \"$OUTPUT\"" + fi + fi +} + +# Generate file $2 containing $1 spoken by TTS_ENGINE, trim silence +voice() { + TO_SPEAK=$1 + WAV_FILE=$2 + if [ ! -f "$WAV_FILE" ] || [ X$OVERWRITE_WAV = XY ]; then + if [ "${TO_SPEAK}" == "" ]; then + touch "$WAV_FILE" + else + case $TTS_ENGINE in + festival) + echo "Action: Generate $WAV_FILE with festival" + echo -E "$TO_SPEAK" | $FESTIVAL_CLIENT $FESTIVAL_OPTS \ + --server $FESTIVAL_HOST \ + --otype riff --ttw --output "$WAV_FILE" 2>"$WAV_FILE" + ;; + espeak) + echo "Action: Generate $WAV_FILE with eSpeak" + echo $ESPEAK_BIN $ESPEAK_OPTS -w "$WAV_FILE" + echo -E "$TO_SPEAK" | $ESPEAK_BIN $ESPEAK_OPTS -w "$WAV_FILE" + ;; + flite) + echo "Action: Generate $WAV_FILE with flite" + echo -E "$TO_SPEAK" | $FLITE_BIN $FLITE_OPTS -o "$WAV_FILE" + ;; + esac + fi + fi + trim "$WAV_FILE" +} + +# Trim wavefile $1 +trim() { + WAVEFILE="$1" + echo "Action: Trim $WAV_FILE" + $WAVTRIM "$WAVEFILE" $NOISEFLOOR +} |