summaryrefslogtreecommitdiff
path: root/tools/genvoice.sh
blob: 4e58801205b1ab8b750c3c96b1cde77787992489 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/sh
#             __________               __   ___.
#   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
#   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
#   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
#   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
#                     \/            \/     \/    \/            \/
# $Id$
#
# Copyright 2006 Jonas Häggqvist, some parts Copyright 2004 Daniel Gudlat
#
# 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.

# 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 #
####################

# These settings can be overridden by passing a file with definitions as
# the fourth parameter to this script

# 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 at this point)
ENCODER=lame
# Where to save temporary files
TEMPDIR=/tmp
# List of IDs to send to voicefont
VOICEFONTIDS=voicefontids

###################
# End of settings #
###################

TARGET_ID="$4"
createvoicefile() {
    RLANG="$1"
    $GENLANG -e=$ENGLISH -o -t=$TARGET $LANG_FILE > $VOICEFONTIDS
    $VOICEFONT "$VOICEFONTIDS" "$TARGET_ID" "$TEMPDIR/" "./$RLANG.voice"
    rm -f $VIOCEFONTIDS
}

deletefiles() {
    # XXX: might be unsafe depending on the value of TEMPDIR
    rm -f "${TEMPDIR}"/LANG_*
    rm -f "${TEMPDIR}"/VOICE_*
    rm -f "${TEMPDIR}"/NOT_USED_*
}

generateclips() {
    ROCKBOX_DIR="$1"
    RLANG="$2"
    TARGET="$3"
    GENLANG="$ROCKBOX_DIR"/tools/genlang
    ENGLISH="$ROCKBOX_DIR"/apps/lang/english.lang
    LANG_FILE="$ROCKBOX_DIR"/apps/lang/$RLANG.lang

    $GENLANG -e=$ENGLISH -o -t=$TARGET $LANG_FILE |(
    i=0
    while read line; do
        case `expr $i % 3` in
            0)
                # String ID no.
                NUMBER=`echo $line |cut -b 2-`
                ;;
            1)
                # String ID
                ID=`echo $line |cut -b 5-`
                ;;
            2)
                # String
                STRING=`echo $line |cut -b 8-`
                # xxx: Should the hash include encoder/tts options?
                POOL_FILE=${POOL}/`echo "$STRING" |md5sum|cut -b-32`-${RLANG}.mp3

                if [ -n "$POOL" ]; then
                    # we have a common pool of snippets, check that first
                    # for available mp3 sounds, and if it is available copy
                    # (symlink!) it over
                    if [ -f "$POOL_FILE" ]; then
                        echo "Re-using $ID from pool (${POOL_FILE})"
                        if [ ! -e "$TEMPDIR/$ID".mp3 ]; then
                            # only do this if not present
                            cp -f "$POOL_FILE" "$TEMPDIR/$ID".mp3
                        fi
                    fi
                fi

                # only make an mp3 if not already present
                if [ ! -e "$TEMPDIR/$ID".mp3 ]; then
                    # Now generate the file
                    voice "$STRING" "$TEMPDIR/$ID".wav
                    if [ -n "$POOL" ]; then
                        # create it in the pool, symlink it back
                        encode "$TEMPDIR/$ID".wav "$POOL_FILE"
                        cp -f "$POOL_FILE" "$TEMPDIR/$ID".mp3
                    else
                        encode "$TEMPDIR/$ID".wav "$TEMPDIR/$ID".mp3
                    fi
                fi
                ;;
        esac
        i=`expr $i + 1`
    done
    )
}

if [ -z "$4" ]; then
    echo "Usage: $0 rockboxdirectory language target targetid [settingsfile]";
    exit 32
else
    if [ ! -d "$1" ] || [ ! -f "$1/tools/genlang" ]; then
        echo "Error: $1 is not a Rockbox directory"
        exit 33
    fi
    # Check for valid language
    if [ ! -f "$1/apps/lang/$2.lang" ]; then
        echo "Error: $2 is not a valid language"
        exit 34
    fi
    if [ ! -z "$5" ]; then
        if [ -f "$5" ]; then
            # Read settings from file
            . "$5"
        else
            echo "Error: $5 does not exist"
            exit 36
        fi
    fi
    # XXX: check for valid $TARGET?
fi

VOICEFONT=`dirname $0`/voicefont
if [ ! -x $VOICEFONT ]; then
    echo "Error: $VOICEFONT does not exist or is not executable"
    exit 35
fi

init_tts
init_encoder
generateclips "$1" "$2" "$3"
stop_tts
createvoicefile "$2"
deletefiles