Text-to-Speech

Für den Audio-Schreiben-Testschritt und für das Interaktive Testen kann jeweils ein Text-to-Speech-Service konfiguriert werden. Standardmäßig unterstützt ecu.test aktuell die Sprachausgabe der Windows SAPI. Darüber hinaus können nutzerdefinierte Text-to-Speech-Services über UserPyModules angebunden werden.

Benutzerdefinierte Sprachausgabe

Die Sprachausgabe lässt von einem Text-to-Speech-Service einen Text mit entsprechender Parametrierung in eine Audiodatei umwandeln und spielt diese im Anschluss ab. Um in ecu.test für Sprachausgabe verfügbar zu sein, muss ein Python-Script bestimmte Voraussetzungen erfüllen:

  • Das Script muss sich unterhalb des UserPyModules-Ordners im Workspace befinden

  • Auf oberster Ebene muss MODULE_TYPE = ‚TextToSpeechService‘ definiert sein.

  • Die Datei muss eine Klasse „TextToSpeechService“ enthalten.

  • Diese Klasse muss die Methoden __init__, GetVoices, SpeakToFile, GetCapabilities, GetFileExtension und GetServiceId implementieren.

  • Es darf nicht zwei TextToSpeechServices mit derselben Service Id geben.

  • Stimmen können anhand von Name, Sprache und Geschlecht eindeutig identifiziert werden.

Neu erstellte Text-to-Speech-Services sind nach dem Aktualisieren der Benutzerbibliotheken verfügbar. Dies können Sie in ecu.test im Menü „Extras“ tun.

Minimaler TextToSpeechService anhand eines Beispiels

Dies ist ein Beispiel für eine nutzerdefinierte Sprachausgabe

import numpy as np
import wave

MODULE_TYPE = 'TextToSpeechService'


class TextToSpeechService:
    """
    Test TextToSpeechService that only implements a parameterized sine curve instead of a
    speech output.
    """

    def __init__(self):
        pass

    def GetVoices(self) -> list[tuple[str, str, str]]:
        """
        Returns list of available voices as triple (name, language, gender)
        """
        return [
            ('Harald', 'de', 'MALE'),
            ('Harold', 'en', 'MALE'),
            ('Brigitte', 'de', 'FEMALE'),
            ('Robot', 'en', 'OTHER'),
        ]

    def _GetVoiceFreq(self, voice: str) -> float:
        match voice:
            case 'Harald':
                return 440.
            case 'Harold':
                return 600.
            case 'Brigitte':
                return 1000.
            case 'Robot':
                return 110.

        return 10

    def SpeakToFile(self,
                    text: str,
                    voice: tuple[str, str, str],
                    filePath: str,
                    parameters: dict) -> None:
        """
        This method generates a speech output for the specified text and parameters
        (speed and pitch) with the specified voice (name, language, gender) under the specified
        file path. That file will be used for audio output.
        """
        volume = 0.5
        sampleRate = 48000
        duration = (len(text) / 10.) * parameters['speed']
        f = self._GetVoiceFreq(voice[0]) * parameters['pitch']

        # generate samples
        samples = (np.sin(2 * np.pi * np.arange(sampleRate * duration) * f / sampleRate)).astype(
            np.float32)

        output_bytes = (volume * samples).tobytes()

        with wave.open(filePath, 'wb') as wavefile:
            wavefile.setnchannels(1)
            wavefile.setsampwidth(4)
            wavefile.setframerate(sampleRate)
            wavefile.writeframes(output_bytes)

    @staticmethod
    def GetCapabilities() -> list[str]:
        """
        Marks if UserTextToSpeechService module supports pitch and speed adaptation.
        """
        return ['pitch', 'speed']

    @staticmethod
    def GetFileExtension() -> str:
        """
        Extension of generated speech audio files.
        """
        return 'wav'

    @staticmethod
    def GetServiceId() -> str:
        """
        Service name as to be displayed in the voice selection.
        """
        return "FakeTTS"

Erklärung der verfügbaren Methoden

Klasse „TextToSpeechService“

Diese Klasse muss vom Python-Skript implementiert werden.

__init__

Diese Methode muss ohne Argumente implementiert werden, darf aber leer sein.

GetVoices

Diese Methode liefert eine Liste der Stimmen, die für diesen Text-to-Speech-Service verfügbar sind. Die Angabe erfolgt als Tripel (Name, RFC 5646 Sprachcode, Geschlecht).

SpeakToFile

Diese Methode generiert eine Datei als Sprachausgabe.

  • für den angegebenen Text text

  • in der angegebenen Stimme voice des Moduls, angegeben als Tripel (Name, Sprachcode, Geschlecht).

  • Die Ausgabe erfolgt als Datei unter dem angegebenen Dateipfad filePath.

  • Über die Parameter parameter können ‚speed‘ und ‚pitch‘ in der Sprachausgabe berücksichtigt werden, sofern sie über GetCapabilities() als unterstützt gekennzeichnet wurden.

GetCapabilities

Über diese Methode kann angegeben werden, ob die nutzerspezifische Sprachausgabe die Parametrierung von Tonhöhe und Geschwindigkeit unterstützt.

GetFileExtension

Dateiendung der von der Sprachausgabe erzeugten Audiodatei. Diese Angabe wird benötigt, der temporäre Dateipfad für die Sprachausgabe von ecu.test generiert wird.

GetServiceId

Eindeutiger Bezeichner des Text-to-Speech-Services.