Xamarin.Forms: TextToSpeech

Ich hatte es ja bereits in meinem Beitrag zur Vorstellung des Projekts XFWeather angekündigt und hier ist nun auch schon der erste Beitrag. Ich möchte nämlich gerne hilfreiche NuGet-Packages vorstellen, welche einem plattformspezifische Implementierungen abnehmen sollen. Dies hat dann den großen Vorteil, dass man noch mehr Code über die verschiedene Plattformen hinweg teilen kann und den größten Anteil im portablen Teil des Projekts abbilden kann. In diesem Beitrag ich mich gerne mit dem Thema TextToSpeech befassen.

Manchmal möchte man dem Nutzer etwas per Sprache ausgeben. Hierfür gibt es auf den verschiedenen mobilen Betriebssystemen auch jeweils eine Lösung. So gibt es unter iOS zum Beispiel die Klasse AVSpeechSynthesizer oder unter UWP die Klasse SpeechSynthesizer. Damit könnte ich jetzt natürlich ein Interface erstellen und dann entsprechend drei plattformspezifische Implementierungen vornehmen, aber glücklicherweise brauchen wir dies nicht machen. Wir benötigen nur das NuGet Package Xam.Plugins.TextToSpeech von James Montemagno. Dieses installieren wir in alle Projekte und können es anschließend direkt verwenden.

Uns werden durch die Installation zwei Methoden zur Verfügung gestellt, welche wir im portablen Teil unserer Xamarin.Forms App verwenden können. Zum einen gibt es eine Methode, welche alle verfügbaren Sprachen zurück liefert und so können wir auch die Ausgabe in unterschiedlichen Sprachen durchführen.

/// <summary>
/// Get all installed and valide lanaguages
/// </summary>
Task<IEnumerable<CrossLocale>> GetInstalledLanguages();

Zum anderen gibt es eine Speak-Methode, welche die eigentliche Sprachausgabe durchführt. Die Signatur der Methode lautet:

/// <summary>
/// Speack back text
/// </summary>
/// <param name="text">Text to speak</param>
/// <param name="crossLocale">Locale of voice</param>
/// <param name="pitch">Pitch of voice (All 0.0 - 2.0f)</param>
/// <param name="speakRate">Speak Rate of voice (All) (0.0 - 2.0f)</param>
/// <param name="volume">Volume of voice (0.0-1.0)</param>
/// <param name="cancelToken">Cancel the current speech</param>
Task Speak(string text, CrossLocale crossLocale = null, float? pitch = null, float? speakRate = null, float? volume = null, CancellationToken cancelToken = default(CancellationToken))

Der einfachste Aufruf ist hierbei einfach die Übergabe des Textes als String und schon wird dieser mit der Standard-Stimme ausgegeben. Es gibt aber noch zahlreiche Anpassungen, wie zum Beispiel die Sprache, der Pitch oder auch die Lautstärke. Der einfachste Aufruf lautet nun wie folgt:

await CrossTextToSpeech.Current.Speak("This text will be spoken!");

Zur Verdeutlichung habe ich eine kleine Sample-App geschrieben, welche zum einen in einer Liste alle verfügbaren Sprachen anzeigt und bei der Auswahl einer Sprache wird ein frei definierbarer Text in der ausgewählten Sprache vorgelesen.

Zu finden ist das Projekt in meinem GitHub-Repository xf-playground. Hier habe ich einen Ordner TextToSpeech angelegt, da ich plane noch weitere Dinge in diesem Repository auszuprobieren.

Da es sich hier um ein reines Test-Projekt handelt, habe ich auf die Verwendung eines ViewModels verzichtet und bilde alles in der Code-Behind Datei der MainPage.xaml ab.

Dieses Beispiel soll verdeutlichen, wie einfach es ist sich ausgewählten Text auf verschiedenen Plattformen vorlesen zu lassen.

Lokalisierung einer Xamarin.Forms App MaskedBehavior: Eingaben in einem bestimmten Format Xamarin Workbooks – Interaktive Dokumentationen schreiben