Ubuntu 12.10 „Quantal Quetzal“
Ubuntu 12.04 „Precise Pangolin“
Ubuntu 11.10 „Oneiric Ocelot“
Ubuntu 10.04 „Lucid Lynx“
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).
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)
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
Das Skript selbst kann als xsane2speech.sh heruntergeladen oder in einen Editor [2] kopiert, abgespeichert und ausführbar[3] gemacht werden.
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 veröffentlicht worden ist.
Außerdem wird das Steuerskript select.sh (Download ) 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.
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.
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 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
.
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.
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.
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.
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 (-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.
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.
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.
Unter Lucid kann eine etwas angepasste Variante 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.
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.
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).
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.
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.
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.
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.
Sprachausgabe Übersichtsseite
Skripte/Book-To-MP3 - "Paten"-Skript, das verschiedene Dateiformate in .mp3-Dateien umwandeln kann
Skripte/pdf2mp3 - vegleichbares Python-Skript, für PDF- und ascii-Daten zur Umwandlung in Audiodateien (.wav oder .mp3)
KMouth - kann ebenfalls Texte vorlesen und aufnehmen
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
Festival/Kompilieren - für deutschsprachige Festival-Unterstützung notwendig