Hey Mac, say something!

Es ist schon erstaun­lich, dass die­ser klei­ne MacOS-Befehl vie­len Benutzerinnen und Benutzern von Macs unbe­kannt ist, obwohl er schon immer zu MacOS gehör­te, sogar Teile der Parametrisierung und eini­ge Stimmen schon vor dem Unix-basier­ten Mac-Betriebssystem vor­han­den waren. Ich spre­che hier vom Terminal Befehl ’say’. Deshalb möch­te ich einen klei­nen Beitrag die­sem Befehl mehr Öffentlichkeit geben.

Nützlich ist ’say’ über­all dort, wo man Sprache ein­set­zen möch­te, selbst aber nicht unbe­dingt meint eine ange­neh­me Sprecherstimme hat und lie­ber auf eine Stimme zurück­greift, die trotz aller Verbesserungen im Laufe der Jahre immer noch etwas künst­lich klingt.

Die ersten Schritte

Und so funk­tio­niert es: Nach dem Start des Terminals funk­tio­niert der ein­fachs­te Aufruf so:

say Ich kann auch sprechen

Und so funk­tio­niert es: Nach dem Start des Terminals funk­tio­niert der ein­fachs­te Anruf wie folgt:

say Ich kann auch spre­chen

Der Mac ver­wen­det die Stimme, die in den Einstellungen als Sprecherstimme ein­ge­stellt ist. Bei mir war das nach der Installation mei­nes Macs Anna, die sehr künst­lich klingt. Es ist jedoch mög­lich, bes­se­re Versionen der Standardstimmen oder ande­re Stimmen her­un­ter­zu­la­den.

Ein ent­spre­chen­der Dialog fin­det sich hin­ter dem DropDown-Menü bei der Systemstimme unter dem Menüpunkt „Stimmen ver­wal­ten”

Apple bie­tet dabei eine Vielzahl von Stimmen in den ver­schie­dens­ten Sprachen an.

Um eine die­ser Stimmen zu ver­wen­den, muss nicht unbe­dingt die Standardstimme geän­dert wer­den, der Befehl ’say’ kennt auch einen Parameter, mit dem eine Stimme aus­ge­wählt wer­den kann.

say -v Ralph Ich kann auch sprechen

Das klingt komisch, weil Ralph eine ame­ri­ka­ni­sche Stimme ist. Es soll­te also statt­des­sen eher fol­gen­der Befehl ein­ge­ge­ben wer­den:

say -v Ralph "I'm able to speak whole sentences"

Einen Überblick über alle Sprachen, die ein­ge­setzt wer­den kön­nen bekommt man mit der Eingabe des Befehls:

say -v '?'

Anscheinend sind nicht alle Sprachen, die in den Spracheinstellungen des Systems mög­lich sind, auch in der Kommandozeile ein­stell­bar. So ist es mir bis­her nicht gelun­gen, die Siri-Stimmen mit dem Parameter ‑v aus­zu­wäh­len. Auch eini­ge Stimmen, wie z.B. die en_US Stimme Nicky, konn­te ich nicht aus­wäh­len.

Wenn es meh­re­re Qualitätsstufen einer Stimme gibt, muss die­se ent­spre­chend auf­ge­ru­fen wer­den. Ich habe z.B. zwei unter­schied­li­che Qualitässtufen der deut­sche Stimme Anna auf dem Rechner:

say -v '?' |grep Anna                                                      
Anna                de_DE    # Hallo, ich heiße Anna und ich bin eine deutsche Stimme.
Anna (Premium)      de_DE    # Hallo, ich heiße Anna und ich bin eine deutsche Stimme.

Wenn ich also Anna (Premium) ver­wen­den will muss ich den gesam­ten Namen in Anführungszeichen ange­ben, also:

say -v 'Anna (Premium)' Hallo, ich heiße Anna und ich bin eine deutsche Stimme.

Wieder ein­mal habe ich mit ChatGPT den fol­gen­den Befehl erstellt, der alle ver­füg­ba­ren Sprachen anzeigt und mit ihrem Beispielsatz aus­spricht (ein­fach kopie­ren und in das Terminal ein­fü­gen (Ctrl‑C bricht die Schleife ab):

say -v '?' | while IFS= read -r line;
do
    voice=$(echo "$line" | awk '{gsub(/[a-z]{2}_[A-Z]{2}.*$/,""); gsub(/ *$/,""); print $0}');
    phrase=$(echo "$line" | awk -F "#" '{print $2}');
    echo "($voice) $phrase";
    say -v "$voice" "$voice: $phrase";
done

Dateien als Eingabe und Sound-Dateien als Ausgabe

Anstatt den Text ins Terminal ein­zu­tip­pen, kann man auch eine Textdatei als Eingabe nut­zen. Und das geht so:

say -f testtext.txt

Allerdings wird die Struktur des Textes dabei nicht erkannt, daher wer­den ggf. vor­han­de­ne Überschriften und Ansätze nicht mit den ent­spre­chen­den Pausen ver­se­hen. Falls man das möch­te, gibt es unten noch einen wei­ter­füh­ren­den Hinweis.

Wenn die Befehlszeile dann auch noch einem ‑o Parameter ver­se­hen wird, ent­steht eine Audio-Datei:

say -v 'Anna' -o audio.aiff -f testtext.txt 

Es muss dabei unbe­dingt auch eine Stimme ange­ge­ben wer­den, denn die­se fehlt, meckert das System. Das AIFF Audioformat ist als Voreinstellung gesetzt. Wer dies ändern möch­te, fin­det auf der „man”-Seite (man say im Terminal ein­ge­ben) wei­te­re Einstellmöglichkeiten, die neben dem Format, auch ande­re Parameter wie z.b. die Sprechrate und vie­les mehr beein­flus­sen.

Weiterführendes

Die oben genann­ten Parameter beein­flus­sen die gesam­te Sprach-Ausgabe eines Textes. Wenn man inner­halb der Textes den Sprachfluss beein­flus­sen möch­te muss soge­nann­te ‘embedded speech com­mands’ ver­wen­den. Einige Beispiel sind:

[[emph +]] Der + Parameter gibt dem Sprach-Synthesizer die Anweisung, die Betonung des fol­gen­den Wortes zu erhö­hen.

Es kön­nen meh­re­re Befehle inner­halb eines sol­chen Kommandos ange­ge­ben wer­den, wenn sie durch Semikolons getrennt sind, wie unten gezeigt:

[[emph +; rate 165]] Diese Befehle ver­an­las­sen die Sprachausgabe, das fol­gen­de Wort oder den fol­gen­den Ausdruck mit erhöh­ter Betonung und mit einer Geschwindigkeit von 165 Wörtern pro Minute zu spre­chen.

[[volm 0.3]] Dieser Befehl setzt das Lautstärke, mit dem das fol­gen­de Wort gespro­chen wird, auf 0.3.

[[volm +0.1]] Dieser Befehl erhöht die Lautstärke, mit dem das fol­gen­de Wort gespro­chen wird, um 0.1.

Weitere Infos zu die­sen Embedded Speech Commands fin­den sich in den Speech Synthesis Programming Guide direkt an die­ser Stelle

Die Dokumentation befin­det sich im archi­vier­ten Apple Entwickler Dokumentation. Bereich. Das kann bedeu­ten, das es viel­leicht bald Änderungen in der Ansteuerung geben könn­te. So soll es mit den Apple Betriebssystemen, die im Herbst 2023 her­aus­kom­men, z.B. mög­lich sein die eige­nes Stimme zu syn­the­ti­sie­ren. Ob dadurch dann auch Änderungen beim ’say’-Befehl erge­ben, wer­de ich zu gege­be­ner Zeit nach­tra­gen.

Hier auch noch ein wei­te­rer Link der die Verwendung die­ser Text-To-Speech Möglichkeiten in AppleScript auf­zeigt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert