ubuntuusers.de

Hinweis: Dies ist ein statischer Snapshot unseres Wikis vom 25. März 2013 und kann daher nicht bearbeitet werden. Der aktuelle Artikel ist unter wiki.ubuntuusers.de zu finden.

xsane2speech

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

XSane/xsane-logo.png xsane2speech ist eine Wrapper-Skript für XSane, mit dem eine eingescannte Textvorlage sofort "vorgelesen" werden kann. Die dafür nötige Texterkennung erfolgt über tesseract-ocr oder Cuneiform-Linux, die Textausgabe kann über die Sprachsynthesizer-Programme eSpeak oder Festival erfolgen. Der Text wird gespeichert, er kann sowohl direkt wiedergegeben als auch via Lame als .mp3-Datei gespeichert werden. Zum Einsatz kommen außerdem Zenity (für Abfragen zum Verlauf), ggf. auch iconv (zur Sicherstellung der richtigen Textkodierung).

Vorbereitung

Folgende Pakete müssen installiert [1] werden:

  • xsane (universe)

  • imagemagick

  • tesseract-ocr (universe, sowie die gewünschten Sprachpakete)

  • espeak

  • lame (multiverse)

  • zenity

  • mbrola (multiverse, optional, sowie gewünschte Mbrola-Stimmen, Verwendung über eSpeak, ggf. auch Festival)

  • festival (universe, optional, sowie die gewünschten Stimmen und Wörterbuchdateien)

  • cuneiform (multiverse, optional, sinnvoll z.B. für Texte in Spalten, bietet viele Sprachen)

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install xsane imagemagick tesseract-ocr espeak lame zenity mbrola festival cuneiform 

sudo aptitude install xsane imagemagick tesseract-ocr espeak lame zenity mbrola festival cuneiform 

xsane2speech

Das Skript selbst kann als xsane2speech.sh {dl} heruntergeladen oder in einen Editor [2] kopiert, abgespeichert und ausführbar[3] gemacht werden.

Hinweis:

Für die Verwendung von Festival muss, wenn MPlayer als Ausgabesoftware verwendet werden soll, der Befehl für die Audioausgabe in Zeile 125 angepasst werden, es muss dort mplayer eingesetzt werden!

  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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
#!/bin/bash
#    xsane2speech - speech directly from xsane
#    Copyright (C) 2010, 2011 Heinrich Schwietering
# 
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
##
#
##############################################################################
#
#                               xsane2speech 0.12
#
#                       *** OCR and TTS made simple ***
#
#
##############################################################################
#
# xsane2speech is a OCR wrapper to be able to use tesseract or cuneiform
# with xsane, and utter the result via espeak or festival or save it as mp3
#
#
#
TEMP_DIR=/tmp/      # folder for temporary files (TIFF & tesseract data)
ERRORLOG="xsane2speech.log"  # file where STDERR goes
ESPEAK=espeak
CUNEIFORM=cuneiform
FESTIVAL=/PATH/TO/COMPILED/VERSION/OF/festival/bin #path for german/OGI festival and text2wave
TESSERACT=tesseract
USER=~/Dokumente
SEL=select.sh

if [[ -z "$1" ]]
  then
  echo "Usage: $0 [OPTIONS]

  xsane2speech converts files to TIF, scans them with Tesseract or Cuneiform
  outputs the text in a file and converts it to speech

  OPTIONS:
    -i <file1>  define input file (any image-format supported)
    -o <file2>  define output-file (*.txt)
    -l <lang>  define language-data OCR engine should use
    -e <option> extra option for Cuneiform
    -z <ocr-engine> OCR engines cuneiform or tesseract (default)
    -y <synthesizer> define synthesizer Festival or eSpeak (default)
    -x <settings> synthesizer settings; for festival only [language] is possible

  Progress- & error-messages will be stored in this logfile:
     $TEMP_DIR$ERRORLOG

  xsane2tess depends on
    - XSane http://www.xsane.org/
    - ImageMagick  http://www.imagemagick.org/
    - TesseractOCR http://code.google.com/p/tesseract-ocr/
    - Cuneiform-Linux https://launchpad.net/cuneiform-linux
    - eSpeak http://espeak.sourceforge.net/
    - festival http://www.cstr.ed.ac.uk/projects/festival
    - optional: german festival
    - iconv http://www.gnu.org/software/libiconv/
    - zenity http://live.gnome.org/Zenity
    - lame http://lame.sourceforge.net/
    - mbrola http://tcts.fpms.ac.be/synthesis/mbrola
  Some coding was stolen from 'ocube'
  http://www.geocities.com/thierryguy/ocube.html

"
  exit
fi

# get options...
while getopts ":i:o:l:e:z:y:x:" OPTION
  do
  case $OPTION in
    i )  # input filename (with path)
      FILE_PATH="$OPTARG"
    ;;
    o )  # output filename
      FILE_OUT="$OPTARG"
    ;;
    l )  # Language-selection
      LANGUAGE="$OPTARG"
    ;;
    e )  # format selection for cuneiform
      EXTRA="$OPTARG"
    ;;
    z )  # Language-selection
      OCRENG="$OPTARG"
    ;;
    y )  # Synthesizer-selection (default is eSpeak)
      SYNTH="$OPTARG"
    ;;
    x )  # Synthesizer-settings
      SYNSET="$OPTARG"
    ;;
  esac
done

# redirect STDOUT to FILE_OUT
exec 1>>$FILE_OUT

# redirect STDERR to ERRORLOG
exec 2>>$TEMP_DIR$ERRORLOG

echo 1>&2
echo "Start ~~~+++~~~~+++~~~" `date +%c` 1>&2

# strip path from FILE_PATH, use filename only
IN_FILE=${FILE_PATH##*/}

TXT_FILE="$TEMP_DIR""OCRResult"
TIF_FILE="$TEMP_DIR""OCRResult".tif

        # set variable for sound process
        { if [[ "$SYNTH" == "Festival" ]] ; then
            SOUND=aplay 1>&2
        else
            SOUND=espeak 1>&2
        fi }

# converting image into TIFF (ImageMagick]
convert "$FILE_PATH" -compress none  "$TIF_FILE" 1>&2

# check for requested ocr-engine
{ if [[ "$OCRENG" == "Cuneiform" ]] ; then
        # start OCR 
        "$CUNEIFORM" -l "$LANGUAGE" -f smarttext -o "$TXT_FILE".txt "--$EXTRA" "$TIF_FILE"  1>&2
    echo "cuneiform -l "$LANGUAGE" -f smarttext used" 1>&2
        # remove strange signs produced by cuneiform
        sed -i -e 's/—/-/g; s/â€"/-/g' "$TXT_FILE".txt
        echo "cuneiform text cleaned" 1>&2
else
        # tesseract is default, start OCR (tesseract expands output with *.txt)
       `tesseract "$TIF_FILE" "$TXT_FILE" -l "$LANGUAGE"` 1>&2
        # distinguish between J an I, which are often identical in "Fraktur"
        { if [[ "$LANGUAGE" == "deu-f" ]]; then
            sed -i -r -e 's/([J])([bcdfghjklmnpqrstvwxyzß])/\I\2/g' "$TXT_FILE".txt
        fi }
    echo "tesseract -l "$LANGUAGE" used" 1>&2
fi }
 
# STDOUT scanned text => FILE_OUT
cat "$TXT_FILE".txt

# delete graphic file after use
rm "$TIF_FILE"

# Ask for further scans to be added
END=`zenity --entry --title="Weitere Scans" --entry-text="Ja" --text="Sollen weitere Textpassagen angehängt werden?"`
{ if [ "$END" != "Ja" ]; then
    { if [[ $SYNSET == "german" ]] ; then
        # change certain sign combinations german festival can't use
       sed -i -r -e 's/fi/fi/g; s/fl/fl/g; s/[íı]/i/g' "$FILE_OUT" # fix ligature fi, fl, signs íı
       sed -i -r -e 's/([[:alpha:]][[:alpha:]])([0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g' "$FILE_OUT" # dissemble character-digit-digit combinationes
       sed -i -r -e 'N;s/([[:lower:]])-\n([[:lower:]][^ ]* ?)/\1\2\n/;P;D' "$FILE_OUT" #remove "Trennungen"
       sed -i -r -e 's/’/`/g; s/[«»ˮ„”“‟]/"/g' "$FILE_OUT" #remove incompatible utf-8 signs
       iconv -t ISO8859-15 "$FILE_OUT" -o "$FILE_OUT" # recode to ISO-8859-15 for german festival
       echo "text cleaned and recoded for german festival" 1>&2
    fi }

    # check if direct tts or saving as mp3 is requested
    MP3=`zenity --entry --title="Ausgabe" --entry-text="1" --text="Wie soll die Ausgabe erfolgen?\n 1) Direkte Sprachausgabe\n 2) Speicherung als MP3-Datei"`
    { if [ "$MP3" == "1" ]; then
      SELECTION=`$SEL "$SOUND" "$TXT_FILE" "$FILE_OUT" "$TEMP_DIR" "$ERRORLOG"` & 1>&2
      echo "$SEL started" 1>&2
        # check for requested synthesizer
        { if [[ "$SYNTH" == "Festival" ]] ; then
            echo "Festival --language $SYNSET used for utterance" 1>&2
            { if [[ $SYNSET == "german" ]] ; then  
                # german festival is requested
                `$FESTIVAL/festival --language "$SYNSET" --tts "$FILE_OUT"`  1>&2
                # other festival languages used, festival in "PATH" used
            else
                `festival --language "$SYNSET" --tts "$FILE_OUT"`  1>&2
            fi }
            # eSpeak is default 
        else 
                echo "eSpeak with options $SYNSET used for utterance"  1>&2
                `"$ESPEAK" $SYNSET -f "$FILE_OUT"`  1>&2
        fi }

       { if 
           pidof zenity true ; then 1>&2 #the PIDs end up in the text without the 1&>2
           killall select.sh 1>&2
           echo "$SEL ended" 1>&2
           killall zenity 1>&2
           echo "zenity ended" 1>&2
       fi }

        # check if a recording is wanted after listening
        END2=`zenity --entry --timeout=10 --title="Archivieren" --entry-text="Nein" --text="Soll eine .mp3-Datei erstellt werden?"`

    fi }
        # set name for dirctory and file to save mp3
    { if [ "$MP3" == "2" ] || [ "$(echo $END2 | tr [:upper:] [:lower:])" == "ja" ]; then 
        FILE=`zenity --file-selection --save --confirm-overwrite --title "Name und Ort zum Speichern auswählen" --filename="$USER"/"$FILE_OUT.mp3"`

        # check for requested synthesizer
        { if [[ "$SYNTH" == "Festival" ]] ; then
            { if [[ $SYNSET == "german" ]] ; then  
                # german festival is requested
                `$FESTIVAL/text2wave "$FILE_OUT" -o "$TEMP_DIR"temp.wav && lame --tt ${FILE##*/} --ta Hörbuch -b 16 -h -V2 -S "$TEMP_DIR"temp.wav "$FILE"` 1>&2
                # other festival languages used
            else
                `text2wave "$FILE_OUT"  -o "$TEMP_DIR/temp.wav" && lame --tt ${FILE##*/} --ta Hörbuch -b 16 -h -V2 -S "$TEMP_DIR"temp.wav "$FILE"` 1>&2
            fi }
            # remove temporary wave file
            rm "$TEMP_DIR"temp.wav
            echo "Festival --language $SYNSET used for mp3" 1>&2
        # eSpeak is default 
        else 
            `"$ESPEAK" $SYNSET -f "$FILE_OUT" --stdout | lame --tt ${FILE##*/} --ta Hörbuch -b 16 -h -V2 -S - "$FILE"` 1>&2
            echo "eSpeak with options $SYNSET used for mp3"  1>&2
        fi }
    fi }
        SAVEFILE=`zenity --list --radiolist --timeout=10 --width=250 --height=160 --text "Text aufbewahren?" --title "Textbehandlung" --column="" --column Funktion \
        \"\" Ja \
        \"\" Nein \
        `
        { if [ "$SAVEFILE" = Ja ];then
            echo "text saved as $FILE_OUT" 1>&2
        elif [ "$SAVEFILE" = Nein ];then
	    rm "$FILE_OUT"
            echo "text $FILE_OUT erased" 1>&2
        fi }

fi }

# delete ocr output
rm "$TXT_FILE".txt
echo "~~~+++~~~~+++~~~" `date +%c` 1>&2

Das Skript ist eine Weiterentwicklung des xsane2tess-Skriptes, das auf ubuntu-fr.org {fr} veröffentlicht worden ist.

Außerdem wird das Steuerskript select.sh (Download {dl}) benötigt, um die Sprachausgabe zu unterbrechen, wieder aufzunehmen oder vorzeitig ganz beenden zu können.

  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
#!/bin/bash
#
#    select.sh for xsane2speech - speech directly from xsane
#    Copyright (C) 2010, 2011 Heinrich Schwietering
# 
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
##


exec 2>>"${4}${5}"

sleep 1
        while pidof "${1}" true
        do
        {
        SELECT=`zenity --list --radiolist --width=250 --height=200 --text "Textwiedergabe bedienen" --title "Wiedergabe" --column="" --column Funktion \
        \"\" Pause \
        \"\" End \
        \"\" Erase \
        `
        if [ -z "$SELECT" ]; then
	    killall ${1}
            rm ${2}.txt
            echo "abborted ~~~+++~~~~+++~~~" `date +%c` 1>&2
            sleep 0.1
            killall xsane2speech.sh
            killall zenity            
            killall select.sh
            break
        elif [ "$SELECT" = Pause ];then
	    killall -STOP ${1}
        elif [ "$SELECT" = End ];then
	    killall "${1}"
            echo "utterance canceled" 1>&2
            sleep 0.6
            killall select.sh
            break
        elif [ "$SELECT" = Erase ]; then
	    killall ${1}
            rm ${2}.txt
            rm ${3}
            echo "utterance canceled" 1>&2
            echo "text $3" 1>&2
            echo "erased ~~~+++~~~~+++~~~" `date +%c` 1>&2
            sleep 0.1
            killall xsane2speech.sh
            killall zenity
            killall select.sh
            break
        fi
        }
        # toggle zenity window
        {
        SELECT2=`zenity --list --radiolist --width=250 --height=200 --text "Textwiedergabe bedienen" --title "Wiedergabe" --column="" --column Funktion \
        \"\" Resume \
        \"\" End \
        \"\" Erase \
        `
        if [ -z "$SELECT2" ]; then
	    killall -CONT ${1}
	    killall ${1}
            rm ${2}.txt
            echo "abborted ~~~+++~~~~+++~~~" `date +%c` 1>&2
            sleep 0.1
            killall xsane2speech.sh 
            killall zenity
            killall select.sh
            break
        elif [ "$SELECT2" = Resume ];then
	    killall -CONT ${1}
        elif [ "$SELECT2" = End ];then
	    killall -CONT ${1}
            killall ${1}
            sleep 0.6
            echo "utterance canceled" 1>&2
            killall select.sh
            break
        elif [ "$SELECT2" = Erase ];then
	    killall -CONT ${1}
	    killall ${1}
            rm ${3}
            rm ${2}.txt
            echo "utterance canceled" 1>&2
            echo "text ${3}" 1>&2
            echo "erased ~~~+++~~~~+++~~~" `date +%c` 1>&2
            sleep 0.1
            killall xsane2speech.sh
            killall zenity
            killall select.sh
            break
        fi
}
done 

Beide Skripte kopiert man am besten mit Root-Rechten[4] nach /usr/local/bin, so lässt sich das Programm von allen Benutzern verwenden.

Konfiguration

Das Temporärverzeichnis in xsane2speech.sh (Zeile 33) kann entsprechend der eigenen Wünsche angepasst werden, dort wird auch die xsane2speech.log-Datei abgelegt. Die weiteren Variablen müssen ggf. geändert werden, wenn die Programme in anderen als den üblicherweise im PATH eingetragenen Verzeichnissen liegen. Dies gilt insbesondere bei der Verwendung von erweiterten Festival-Versionen, das Skript ermöglicht die Verwendung der "Standard"-Installation aus den Paketquellen neben einer selbsterstellten deutschsprachigen Version.

Funktionsweise

Die mit XSane eingescannten Vorlagen werden einer Texterkennung unterzogen (Standard ist tesseract-ocr, Alternative Cuneiform-Linux, womit eine Vielzahl von Sprachen abgedeckt ist). Es sind beliebig viele kombinierte Scans möglich, der Abschluss der Texterfassung wird im Zenity-Fenster bestätigt. Der gesamte Text kann ggf. vor Ausgabe in einem Texteditor[2] korrigiert werden, z.T. werden typische Fehler direkt ausgebügelt. So erkennt Cuneiform z.B. gerne Bindestriche als —, auch für Festival werden nicht-auslesbare Zeichenkombinationen "entschärft". Über die Synthesizer eSpeak (Standard-Einstellung) oder Festival wird der Text dann in Sprache umgewandelt, auch hierfür stehen eine Vielzahl von Sprachen zur Verfügung, es können über eSpeak auch viele Mbrola-Stimmen {en} zum Einsatz kommen. Die Ausgabe erfolgt entweder direkt, oder sie wird in einer .mp3-Datei aufgezeichnet, dafür kommt lame zum Einsatz. Beim Einsatz von Festival-Stimmen erfolgt zuvor eine Umwandlung in eine Wave-Datei mit dem Festival-eigenen Programm text2wave.

Benutzung

In "XSane -> Einstellung -> Konfiguration -> Texterkennung" wird als OCR-Befehl "/PFAD/ZU/xsane2speech.sh" sowie weitere Optionen zur Steuerung angegeben. Als weitere Optionen werden "-i", für die Ausgabedatei "-o" angeben, die weiteren Felder bleiben leer. Die Option "Benutze GUI Fortschritts Pipe" darf nicht angehakt sein (nicht nur wegen der orthographischen Mängel...), da sonst das Wrapper-Skript nicht geschlossen werden kann. Es bleiben etliche nicht abwürgbare "Zombie"-Prozesse zurück, die erst mit Beenden von XSane abgeschlossen werden.

Beispiele

xsane2speech.sh -l deu -x "-vmb-de6 -s165 -g2"

verwendet Tesseract mit deutscher Sprache, für die Sprachausgabe wird eSpeak mit der Mbrola-Stimme de6 eingesetzt, Sprechgeschwindigkeit 165 Wörter pro Minute, Pauseneinstellung zwischen den Wörten ca. 20 ms. Diese Feineinstellungen kann man am besten in Gespeaker ausprobieren, wo sie über Schiebregeler leicht einstellbar sind. Zur Verwendung der mbrola-Stimmen siehe auch mbrola-Stimmen einbinden.

xsane2speech.sh -z Cuneiform -l ita -e "fax" -y Festival -x italian

setzt Cuneiform-Linux für italienischen Text ein, das Format ist Text mit Zeilenumbrüchen wie in der Vorlage, Einstellung für eine Vorlage in Fax-Qualität. Als Sprachausgabe kommt Festival mit italienischer Stimme zum Einsatz. Informationen zur näheren Festlegung der Sprecherstimme findet man unter Sprache/Stimme festlegen.

Achtung!

Die Angaben müssen sehr exakt erfolgen, es dürfen zwischen den Optionen nur einfache Leerzeichen verwendet werden, sonst kommt es zu Fehlern!

Im Forum findet sich ein Skript, mit dem dialoggeführt fehlerfreie Konfigurationen für verschiedene Einstellungen erstellt und für weitere Verwendung auch abgespeichert werden können. Es verwendet allerdings yad für die Dialoge.

Optionen

Die verfügbaren Optionen für das Skript sind:

Optionen für xsane2speech
Argument Funktion
-z OCR-PROGRAMM Tesseract, Cuneiform, Tesseract ist der Standard, wenn keine Angabe gemacht wird; verwendbar ist auch Tesseract-3.00
-l SPRACHKÜRZEL Legt die verwendete Sprache für das OCR-Programm fest, ohne Angabe wird englisch (eng) verwendet
-e OPTION Extra-Optionen für Cuneiform-Linux, möglich matrix (Nadeldrucker-Vorlage), singlecolumn (einspaltig auslesen) und fax (Vorlag ein Fax-Qualität)
-y SYNTHESIZER Festival oder eSpeak (Standard wenn keine Angabe erfolgt)
-x "SYNTHESIZER-OPTION(EN)" eSpeak-Option(en), müssen in Anführungszeichen stehen; für Festival ist hier nur ein Sprachangabe möglich. Ohne Angabe wird englisch als Ausgabesprache verwendet.

Für Cuneiform wird standardmäßig als Format -f smarttext verwendet, der Text wird damit entsprechend der Vorlage an Zeilenende umgebrochen. Es lässt sich hier auch die Option text verwenden, die bei deutlichem Abstand zwischen den Zeilen Absatzumbrüche erstellt und den Text ansonsten in einer Zeile durchschreibt.

Die Vorlage wird in XSane im Betrachter-Modus erstellt. Als Auflösung werden 300 dpi empfohlen, die besten Ergebnisse erzielt man meist mit der Einstellung "Strichzeichnung" (für sehr kleine Schriften, bei Waschzettel etc. ggf. höhere Auflösungen verwenden). Im Betrachter die Texterkennung (xsane/xsane-ocr.jpg-Taste) wählen. Alternativ kann auch das Ausgabeformat "TEXT" gewählt werden, und als Modus "Speichern", wenn keine weiteren Einstellungen nötig sind. Dann wird der Text direkt umgewandelt, ohne den Betrachter zu öffnen. Allerdings lassen sich so mehrere Scans nicht zu einer Ausgabe zusammenfassen!

Die .txt-Datei wird dann in angegebenen Verzeichnis (Schreibrechte nötig!) als AUSGABENAME.txt abgelegt. Die Qualität der Texterkennung ist natürlich von der Qualität und Aufbau des Vorlage abhängig; je "verschachtelter" Text und Grafikelemente sind, desto schwieriger wird die exakte Zerlegung, und damit die Texterkennung. Daher sollte man ggf. einzelne Ausschnitte in der richtige Reihenfolge scannen, und die Bilder dabei auslassen. Bei Vorlagen mit Bildern schneidet meist Cuneiform besser ab; tesseract 2.04 aus den Paketquellen kann nicht mit Spalten umgehen (gilt nicht für Tesseract 3.00, dessen Verwendung auch wegen der sehr guten Erkennungsqualität sehr zu empfehlen ist). Bei Verwendung von deu-f als Tesseract-Sprache sortiert das Skript I und J, die in Fraktur-Schriften oft mit dem selben Zeichen dargestellt werden, danach, ob nach dem Zeichen ein Vokal (dann ->J) oder ein Konsonant (dann ->I) folgt.

xsane2speech-Zenity2.png Nach jedem Scan wird abgefragt, ob Text aus weiteren Scans an die bestehende Textdatei angehängt werden soll. Dabei auf den gleichen Namen der Ausgabedatei achten, die Nummerierungsfunktion in XSane sollte daher nicht genutzt werden. Die Sprachausgabe erfolgt, wenn keine weiteren Scans mehr angehängt werden sollen; danach erscheint eine Abfrage, ob der Text direkt ausgegebene (Eingabe "1") oder als .mp3-Datei gespeichert werden soll (Eingabe "2").

Wird die .mp3-Erstellung gewählt, kann im sich darauf öffnenden Fenster der Speicherort und der Dateiname ausgewählt werden, standardmäßig ist ~/Dokumente/Vorlesen vorgesehen. Als Grundlage ist der Name der Text-Datei eingestellt, an den dann automatisch ein .mp3-Endung angehängt wird. Der Speicherort kann im Skript unter der Variabel $USER verändert werden, der dort gewählte Ordner muss allerdings existent sein.

./xsane2speech-steuern.png Wenn die direkte Wiedergabe gewählt wurde, öffnet sich ein Zenity-Fenster mit den Steuereinstellungen "Pause/Resume", "End" und "Erase". "End" führt dazu, dass die Sprachausgabe abgebrochen, und weiter im Skript-Ablauf vorgegangen wird. "Erase" kann dazu verwendet werden, die Wiedergabe abzubrechen, und den dazugehörige Text direkt zu löschen, man kehrt dann auf die XSane-Ebene zurück. Wenn man die Schaltflächen "Abbrechen" (oder "OK" ohne eine Auswahl) wählt, bleibt der Text erhalten, man kehrt aber ebenfalls auf die XSane-Ebene zurück. Das Fenster schließt sich, wenn keine Eingabe gemacht wird, mit Ende der Sprachausgabe automatisch. Nach dem "Vorlesen" hat man noch einmal die Möglichkeit, die Sprachausgabe als .mp3-Datei abzuspeichern, falls man auch weiterhin auf die Inhalte zurückgreifen möchte; das Verfahren ist identisch mit dem zur Abspeicherung beschriebenen.

Nach Abschluss wird abgefragt, ob die zugehörige Textdatei erhalten oder gelöscht werden soll; im Zenity-Fenster die entsprechende Angabe machen.

Die Fenster schließen sich nach einer gewissen Zeit automatisch, wenn keine Angabe erfolgt; der Wert wird im Skript in den Zenity-Angaben über die Option --timeout=x in Sekunden geregelt und kann den eigenen Wünschen entsprechend angepasst, oder auch ganz gelöscht werden. Auch die dann erfolgende Aktion lässt sich anpassen, indem man für die Option --entry-text="X" die gewünschte Aktion einträgt.

Nutzung unter Ubuntu Lucid Lynx 10.04

Unter Lucid kann eine etwas angepasste Variante {dl} des Skripts verwendet werden, da die verwendete eSpeak-Version beim Einsatz von Mbrola-Stimmen die Ausgabe nicht "direkt" sondern über eine temporär erstellte .wav-Datei erfolgt. Die Bedienung ist identisch zu der der Standard-Version, das heruntergeladene Skript in xsane2speech.sh umbenennen.

Integration einer Rechtschreibprüfung

Der Text lässt sich vor der Ausgabe/Speicherung mit einer Rechtschreibprüfung korrigieren. Eine Möglichkeit besteht darin, im Code eine weitere Zenity-Abfrage nach Zeile 169 (Standard-Version) bzw. 176 (Lucid-Version) einzurichten:

    SPELLCHECK=`zenity --entry --title="Rechtschreibkorrektur" --entry-text="Ja" --text="Sollen der Text auf Rechtschreibfehler überprüft werden?"`
    { if [[ $SPELLCHECK == "Ja" ]]; then
         gedit "$FILE_OUT"
#        gnome-terminal -x hunspell -t "$FILE_OUT"
#        echo "hunspell used for spellchecking" 1>&2 
         echo "gedit used for spellchecking" 1>&2 
    fi }

In diesem Beispiel ist entweder die Möglichkeit vorgesehen, gedit direkt mit der Texttdatei aufzurufen, und dort die Rechtschreibkorrektur einzusetzen (gedit verwendet Aspell; es ist natürlich auch jeder andere Texteditor möglich), oder (hier auskommentiert) Hunspell in einem externen Terminal-Fenster zu verwenden. Die Verwendung eines Editor hat den Vorteil, dass auch zwar prinzipiell richtig geschriebene, in dem Zusammenhang aber falsch erkannte Wörter gefunden und korrigiert werden können. Die Ausgabe sollte natürlich erst danach erfolgen, es ist aber auch möglich, den Text während des Abhörens noch zu korrigieren, um ihn dann für die mp3-Erstellung "korrekt" verwenden zu können. Standardmäßig wird die systemweit gesetzte Spracheinstellung verwendet, für andere Sprachen müssten die entsprechenden Optionen verwendet werden.

Spracheinstellung für deutsche Festival-Wiedergabe

Um Texte mit Umlauten/ß direkt mit der deutschen Festival-Version wiedergeben zu können, ohne das gesamte System umstellen zu müssen, wird im Standard-Skript mit eine Zeichensatzkonvertierung in ISO-8859-15 mit iconv vorgenommen. Allerdings kann es dabei zu Fehlern kommen, wenn im Text Zeichen vorhanden sind, die nicht im ISO-Format vorhanden sind. Die Wiedergabe wird in einem solchen Fall direkt an der Stelle mit dem Fehlzeichen abgebrochen, da der nachfolgende Text nicht mehr konvertiert wird. Im Skript erfolgt daher die Ersetzung von problematischen Zeichen mit

       sed -i -r -e 's/’/`/g; s/[«»ˮ„”“‟]/"/g' "$FILE_OUT" #remove incompatible utf-8 signs

Ggf. müssten weiter Zeichen nach diesem Muster bearbeitet werden (im Lucid-Skript noch nicht integriert; "Umweg": Verwendung eines Texteditors über die Rechtschreibprüfungs-Option, darin die entsprechenden Zeichen ersetzen und den erkannten Text im ISO-8859-15-Format abspeichern).

Probleme

Falls Probleme auftauchen, liefert das angelegte Protokoll xsane2speech.log ggf. Hinweise zur Lösung. Je nach Rechnerleistung ist es eventuell nötig, die sleep-Werte im select.sh anzupassen, wenn sich z.B. das Steuerungsfenster für die Wiedergabe nicht öffnet.

Hinweis:

Bitte im Ubuntu liest vor! (Projekt-Thread) nachfragen, wenn es zu merkwürdigen Verhalten oder unlösbaren Dingen kommt, oder auch, wenn es Wünsche, Verbesserungsvorschläge etc. gibt!

Die Meldung

bt_audio_service_open: connect() failed: Connection refused (111)

ist vernachlässigbar, sie bezieht sich auf eine Bluetooth-Verbindung, die nichts mit dem Programm zu tun hat. Ggf. kann man das Paket bluez-alsa entfernen, wenn man es nicht benötigt.

Festival mit deutschsprachiger Ausgabe

Die deutschen Festival-Stimmen können sinnvoll nur in einer Umgebung eingesetzt werden, in der systemweit die ISO-8859-15-Textkodierung verwendet wird; siehe Zeichenkodierung ändern. Umlaute und Sonderzeichen werden ansonsten nicht richtig sondern z.B. als "upsa upsa" o.ä. ausgegeben.

Die Meldung

/PFAD/ZU/xsane2speech.sh: Zeile xxx: German: Kommando nicht gefunden.

ist hingegen vernachlässigbar, sie wird von text2wave ausgelöst, hat aber keinen Einfluss auf die Funktion. Auch die Meldung

Audio spooler has died unexpectedly
closing a file left open: /PFAD/ZUR/AUSGABEDATEI.txt

ist harmlos, sie tritt immer auf, wenn man unter Festival die Sprachausgabe abbricht.

Mbrola

Einige der deutschen Mbrola-Stimmen (de4, auch unter eSpeak einsetzbar, und ganz besonders de8, was eigentlich keine "deutsche", sondern eine bayrische Dialekt-Stimme ist) können mit bestimmten Diphonen nicht umgehen; im Log erscheinen Angaben wie

Warning: g-ts unkown, replaced with _-_
Warning: 6-6 unkown, replaced with _-_
Warning: 6-@ unkown, replaced with _-_

und die fehlenden Laute werden weggelassen, was sehr störend sein kann. Unter Festival kann das etwas gelindert werden, siehe Festival - Tipps und Tricks.

Alternativen

  • Ubuntu liest vor! - Ursprungsthread im Forum

  • Thread zum sed-Befehl

  • eSpeak - verwendeter Standard-Synthesizer mit umfangreicher Sprachunterstützung

  • Festival - alternativer Synthesizer, mit Stimmen, die auf natürlichen Sprechern beruhen

ubuntuusers.local › Wikixsane2speech