#!/bin/sh # __________ __ ___. # Open \______ \ ____ ____ | | _\_ |__ _______ ___ # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ # \/ \/ \/ \/ \/ # $Id$ # # Copyright (c) 2004 Daniel Gudlat # - http://www.rockbox.org/tracker/task/2131 # Copyright (c) 2006 Jonas Häggqvist # - This version, only dirwalk and the following comments remains # # 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. # # Note: You may wish to change some of the settings below. # # A script to automatically generate audio clips containing the names of all # folders in a directory tree for use with the "Talkbox" feature available to # users of the Rockbox open source firmware for Archos MP3 players and # recorders as well as several other devices. Talkbox permits the device to # speak the names of the folders as one navigates the directory structure on # the device, thus permitting "eyes-free" use for those for whom the usual # visual navigation is difficult or simply inadvisable. # # Audio clips are captured and stored in wave format, then converted into MP3 # format by a third party application (lame). If you execute the script, # passing it the top level of your music file hierarchy as an argument while # your device is connected to your PC, then the resulting audio clips will be # generated and stored in the correct location for use with the Talkbox # feature. Alternatively, if you mirror your music folder structure from your # PC to your Archos device, you can just run the script on the PC and then # update the files on your Archos with your usual synchronization routine. # # NOTE: If you don't already have them installed, you may obtain the Festival # text to speech system and several voices at: # # http://www.cstr.ed.ac.uk/projects/festival.html # http://festvox.org/festival/ # # The most pleasant freely available Festival voice I know of is the slt_arctic # voice from HST at http://hts.ics.nitech.ac.jp/ # # Known bugs # - This script generates talk clips for all files, Rockbox only uses talk clips # for music files it seems. # Include voicecommon.sh from the same dir as this script # Any settings from voicecommon can be overridden if added below the following # line. source `dirname $0`'/voicecommon.sh' #################### # General settings # #################### # which TTS engine to use. Available: festival, flite, espeak TTS_ENGINE=festival # which encoder to use, available: lame, speex, vorbis (only lame will produce # functional voice clips) ENCODER=lame # whether to overwrite existing mp3 files or only create missing ones (Y/N) OVERWRITE_TALK=N # whether, when overwriting mp3 files, also to regenerate all the wav files OVERWRITE_WAV=N # whether to remove the intermediary wav files after creating the mp3 files REMOVE_WAV=Y # whether to recurse into subdirectories RECURSIVE=Y # whether to strip extensions from filenames STRIP_EXTENSIONS=Y ################### # End of settings # ################### strip_extension() { TO_SPEAK=$1 # XXX: add any that needs adding for ext in mp3 ogg flac mpc sid; do TO_SPEAK=`echo "$TO_SPEAK" |sed "s/\.$ext//i"` done } # Walk directory $1, creating talk files if necessary, descend into # subdirecotries if specified dirwalk() { if [ -d "$1" ]; then for i in "$1"/*; do # Do not generate talk clip for talk(.wav) files if [ `echo "$i" | grep -c "\.talk$"` -ne 0 ] || \ [ `echo "$i" | grep -c "\.talk\.wav$"` -ne 0 ]; then echo "Notice: Skipping file \"$i\"" continue fi TO_SPEAK=`basename "$i"` if [ X$STRIP_EXTENSIONS = XY ]; then strip_extension "$TO_SPEAK" fi if [ -d "$i" ]; then # $i is a dir: SAVE_AS="$i"/_dirname.talk WAV_FILE="$SAVE_AS".wav # If a talk clip already exists, only generate a new one if # specified if [ ! -f "$SAVE_AS" ] || [ X$OVERWRITE_TALK = XY ]; then voice "$TO_SPEAK" "$WAV_FILE" encode "$WAV_FILE" "$SAVE_AS" fi # Need to be done lastly, or all variables will be dirty if [ X$RECURSIVE = XY ]; then dirwalk "$i" fi else # $i is a file: SAVE_AS="$i".talk WAV_FILE="$SAVE_AS".wav # If a talk clip already exists, only generate a new one if # specified if [ ! -f "$i.talk" ] || [ X$OVERWRITE_TALK != XY ]; then voice "$TO_SPEAK" "$WAV_FILE" encode "$WAV_FILE" "$SAVE_AS" fi fi # Remove wav file if specified if [ X$REMOVEWAV = XY ]; then rm -f "$WAV_FILE" fi done else echo "Warning: $1 is not a directory" fi } init_tts init_encoder if [ $# -gt 0 ]; then dirwalk "$*" else dirwalk . fi stop_tts