@huluvu424242/honey-speech
Version:
Text to Speech component wich is reading texts from DOM elements.
103 lines (102 loc) • 3.51 kB
JavaScript
import { Logger } from "./logger";
import { Synthese } from "./sprachsynthese";
export class Sprachausgabe {
constructor(onSpeakerStarted, onSpeakerFinished, onSpeakerPaused, onSpeakerResume, onSpeakerFailed, audioLang, audioPitch, audioRate, audioVolume, voiceName) {
this.onSpeakerStarted = (ev) => onSpeakerStarted(ev);
this.onSpeakerFinished = (ev) => onSpeakerFinished(ev);
this.onSpeakerPaused = (ev) => onSpeakerPaused(ev);
this.onSpeakerResume = (ev) => onSpeakerResume(ev);
this.onSpeakerFailed = (ev) => onSpeakerFailed(ev);
this.audioLang = audioLang;
this.audioPitch = audioPitch;
this.audioRate = audioRate;
this.audioVolume = audioVolume;
this.voiceName = voiceName;
this.stimme = undefined;
Logger.infoMessage("####constructor finished");
}
getDefaultStimme() {
var namedMatch;
var langMatches = [];
var langDefaultMatch;
var defaultMatch;
const voices = Sprachausgabe.synthese.getVoices();
Logger.infoMessage("Found voices:" + JSON.stringify(voices));
if (!voices)
return null;
for (var i = 0; i < voices.length; i++) {
if (voices[i].name === this.voiceName ||
voices[i].lang === this.audioLang ||
voices[i].default) {
Logger.debugMessage("voice matched:" + voices[i].name + voices[i].lang);
if (voices[i].name === this.voiceName) {
namedMatch = voices[i];
}
if (voices[i].lang === this.audioLang &&
voices[i].default) {
langDefaultMatch = voices[i];
}
if (voices[i].lang === this.audioLang) {
langMatches.push(voices[i]);
}
if (voices[i].default) {
defaultMatch = voices[i];
}
}
}
// Auswertung
if (namedMatch) {
return namedMatch;
}
if (langDefaultMatch) {
return langDefaultMatch;
}
if (langMatches && langMatches.length > 0) {
return langMatches[0];
}
if (defaultMatch) {
return defaultMatch;
}
return voices[0];
}
erzeugeVorleser(text) {
Logger.infoMessage("erzeugeVorleser started");
const vorleser = new SpeechSynthesisUtterance(text);
vorleser.onend = this.onSpeakerFinished;
vorleser.onstart = this.onSpeakerStarted;
vorleser.onpause = this.onSpeakerPaused;
vorleser.onresume = this.onSpeakerResume;
vorleser.onerror = this.onSpeakerFailed;
vorleser.pitch = this.audioPitch;
vorleser.rate = this.audioRate;
vorleser.volume = this.audioVolume;
vorleser.voice = this.stimme;
vorleser.lang = this.audioLang;
return vorleser;
}
textVorlesen(zuLesenderText) {
if (!this.stimme) {
this.stimme = this.getDefaultStimme();
Logger.infoMessage("set default voice to " + this.stimme);
}
if (zuLesenderText) {
const texte = zuLesenderText.match(/(\S+\s){1,20}/g);
texte.forEach(text => {
const vorleser = this.erzeugeVorleser(text);
Logger.infoMessage("speaker lang used:" + vorleser.lang);
if (vorleser.voice) {
Logger.infoMessage("speaker voice used:" + vorleser.voice.name);
Logger.infoMessage("speaker voice lang:" + vorleser.voice.lang);
}
else {
Logger.infoMessage("no voice matched for text: " + zuLesenderText);
}
Sprachausgabe.synthese.sprachSynthese.speak(vorleser);
});
}
}
cancel() {
Sprachausgabe.synthese.sprachSynthese.cancel();
}
}
Sprachausgabe.synthese = new Synthese();