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 befindenAuf 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.