[C#][TUTORIAL] Text-to-Speech und Speech-to-Text(Spracherkennung)

04/18/2012 16:37 eXtreme'#1
Hallo und herzlich willkommen zu meinem 1. Tutorial.
Hier werde ich euch zeigen, wie ihr in C# gesprochenen Text in einen schriftlichen Text umwandelt und wie ihr Text vom "vorlesen" lassen könnt.

1.: Was brauchen wir?
2.: "Speech-to-Text"
2.1: Auf die Speech Assembly verweisen
2.2: Code
3.: "Text-to-Speech"
3.1 Code
Abschluss


1.
Visual Studio C#
Mikrofon oder Headset

2.
Bei "Speech-to-Text" wird ein gesprochener Text erkannt und kann dann im Porgramm weiterverarbeitet werden. Im Großen und Ganzen ist das keine besondere Kunst, denn Microsoft hat dafür die Speech.Recognition Funktion mitgeliefert. Dafür müssen wir allerdings zuerst einen Verweis auf die Speech-Assembly erstellen. Dies ist im folgenden Teil 2.1 erklärt.

2.1
Zuerst öffnen wir Visual Studio und erstellen ein neues Windows-Form Projekt.
Das Projekt habe ich einfach mal SpeechTutorial genannt. Nun wird der Verweis folgendermaßen erstellt:
1.Rechtsklick auf das Projekt im Solution Explorer und wählt "Add Reference".

[Only registered and activated users can see links. Click Here To Register...]#

2.Wähle oben .NET aus und such nach System.Speech.

[Only registered and activated users can see links. Click Here To Register...]

3.Klick auf OK.

2.2
Kommen wir nun zum Code.
Zu Beginn binden wir per using die Namespace ein:
Code:
using System.Speech.Recognition;
Als nächstes können ziehen wir auf die Form ein Button, eine ListBox und eine RichTextBox.
Per Doppelklick auf den Button erstellen wir ein Klick-Event. In das neu hinzugefügte Event kopieren wir zunächst folgenden Code, der später genauer erklärt wird.

Davor erstellen allerdings einen Verweis auf die SpeechRecognitionEngine Instanz. Diese fügen wir so an:

Code:
 public Form1()
        {
            InitializeComponent();
        }
        private SpeechRecognitionEngine spracherkennung = new SpeechRecognitionEngine();
Nun der Rest

Code:
spracherkennung.SetInputToDefaultAudioDevice();
spracherkennung.LoadGrammar(new DictationGrammar());
spracherkennung.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(spracherkennung_SpeechRecognized);
spracherkennung.RecognizeAsync(RecognizeMode.Multiple);
Mit
Code:
SpeechRecognitionEngine spracherkennung = new SpeechRecognitionEngine();
wird ein Verweis auf die SpeechRecognitionEngine Instanz erstellt.

Code:
spracherkennung.SetInputToDefaultAudioDevice();
Es wird das Standard Mikrofon benutzt.

Code:
spracherkennung.LoadGrammar(new DictationGrammar());
Hier wird die Grammatik geladen, welche letztendlich die Spracheingabe indentifiziert und in einen lesbaren Text umwandelt.

Code:
spracherkennung.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(spracherkennung_SpeechRecognized);
Dieses Event wird ausgelöst, wenn das Programm eine Spracheingabe feststellt.

Code:
spracherkennung.RecognizeAsync(RecognizeMode.Multiple);
Dies bedeutet, das nachdem das Programm einen Input bemerkt hat, es nicht aufhört sondern auf die nächsten Spracheingaben wartet.

Kommen wir nun zu dem Event. Dafür fügen wir folgenden Code ein.

Code:
void spracherkennung_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            foreach (RecognizedWordUnit wort in e.Result.Words)
            {
                listBox1.Items.Add(wort.Text);
            }
        }
In dem Event wird per foreach jedes festgestellte Wort einzeln ausgegeben und der ListBox hinzugefügt.

Alternativ dazu kann man auch den ganzen Satz, den man spricht in einer RichTextBox ausgeben lassen.

Code:
richTextBox1.AppendText("\r\n" + e.Result.Text);
Wenn wir nun das Programm starten, auf den Button klicken und in das Mirko reden, sollte der Text entweder in der listBox oder in der RichTextBox erscheinen. Gehen wir nun weiter zu "Text-to-Speech".

3

Die Funktion Speech.Synthesis ermöglicht es uns, dem Programm einen Text zu geben, den er dann "vorliest".

3.1

Zu Beginn erstellen wir ein neues Projekt. Wir wiederholen Schritt 2.1 und binden die Namespace ein, diesmal allerdings mit:

Code:
using System.Speech.Synthesis;
Die Form bestücken wir nun mit einem Button und einer "Multiline" Textbox.

Wie eben, zeige ich erstmal den kompletten Code:

Auch hier erstellen wir erst einmal ein Verweis auf die SpeechSynthesizer Instanz:
Code:
 public Form1()
        {
            InitializeComponent();
        }
       private SpeechSynthesizer speaker = new SpeechSynthesizer();
Code:
sprecher.SetOutputToDefaultAudioDevice();
sprecher.Rate = -1;
sprecher.Volume = 100;
sprecher.SelectVoice("Microsoft Anna");
sprecher.SpeakAsync(textBox1.Text);

Zur genaueren Erklärung:

Code:
SpeechSynthesizer sprecher = new SpeechSynthesizer();
Es wird ein Verweis auf die SpeechSynthesizer Instanz erstellt.

Code:
sprecher.SetOutputToDefaultAudioDevice();
Der aktuelle Standard Lautsprecher wird zum ausgeben des Textes benutzt.

Code:
sprecher.Rate = -1;
Hier kann die Schnelligkeit eingestellt werden, mit der der Text vorgelesen werden soll.

Code:
sprecher.Volume = 100;
Dieser Abschnitt sollte weitestgehend selbsterklärend sein, denn hier wird die Lautstärke geregelt.

Code:
sprecher.SelectVoice("Microsoft Anna");
Es stehen verschiedene Stimmen zur Auswahl. Standardmäßig ist die englische Stimme "Microsoft Anna" eingestellt. Deutsche Stimmen gibt es auch, die müssen allerdings erst installiert werden. Dies ist 4 Post's weiter erklärt ;)

Code:
sprecher.SpeakAsync(textBox1.Text);
Hier wird "sprecher" der zu lesende Text übergeben. In unserem Fall die Textbox.

Die Text-zu-Sprach Funktion ist nun fertig und kann getestet werden.
(Am besten einen englischen Text, denn wenn man einen deutschen von einer englischen Stimme vorlesen lässt, hört sich das ein wenig komisch an.)


Abschluss

Jetzt kann man das Ganze natürlich beliebig weit ausbauen und z.B. eine Sprachsteuerung für den Computer entwickeln. Doch das ist jetzt euch überlassen ;)

Nun sind wir auch schon am Ende des Tutorials angelangt. Ich hoffe es war verständlich, auch wenn es mein 1. Tutorial war.

aera12
04/18/2012 16:42 Dev5#2
Sieht gut aus :)
04/19/2012 19:51 V8II#3
Genial! Die Spracherkennung hat nur leiche Mängel ^^ Aus "Elitepvpers" macht er "gelegentlich Operas" und so weiter.
'text to speech" redet immer nur auf Englisch oder? Gibts das auch auf deutsch? Ist aber ganz amüsant wie manches ausgesprochen wird :D

Edit: Du solltest nicht bei jedem Klick-Event einen neuen SpeechSynthesizer erstellen ... eine einmalige erstellung währe besser
04/19/2012 19:59 Kentazo#4
Nicht schlecht :D
Danke dir.
04/19/2012 22:11 eXtreme'#5
Quote:
Originally Posted by V8II View Post
Genial! Die Spracherkennung hat nur leiche Mängel ^^ Aus "Elitepvpers" macht er "gelegentlich Operas" und so weiter.
'text to speech" redet immer nur auf Englisch oder? Gibts das auch auf deutsch? Ist aber ganz amüsant wie manches ausgesprochen wird :D

Edit: Du solltest nicht bei jedem Klick-Event einen neuen SpeechSynthesizer erstellen ... eine einmalige erstellung währe besser
Danke, du hast Recht. Ich setzt mich direkt dran und verbesser es. ;)

Quote:
Originally Posted by Kentazo
Nicht schlecht
Danke dir.
Dank dir fürs Feedback :)

Doch nun zu dem Sprachpaket auf Deutsch!


Wie kann man denn nun die "Ausgabe-Sprache" auf Deutsch stellen?
Ganz einfach:
1. Besucht diesen Link: [Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

Installiert die Datei einfach.

2. Besucht diesen Link: [Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

Installiert auch diese Datei.

Danach sollten euch "LH Anna" und "LH Stefan" als Deutsche Sprachpakete zu Seite stehen.
Das ganze könnt ihr folgendermaßen im Code festlegen:
Ihr ändert einfach die Zeile
Code:
sprecher.SelectVoice("Microsoft Anna");
für eine männliche Stimme durch

Code:
sprecher.SelectVoice("LH Stefan");
oder für eine weibliche Stimme durch
Code:
sprecher.SelectVoice("LH Anna");
Das ganze sollte dann auf Deutsch sein.

aera12
04/20/2012 16:05 V8II#6
Cool!
Weißt du ob es eine Möglichkeit gibt, die Deutschen Sprachpakte mit C# mitzuliefern / automatisch zu installieren? Ich möchte meine Programmnutzer nicht mit zu vielen Downloads quälen ...

Edit: Danke für die PN!