UNPKG

@huluvu424242/honey-speech

Version:

Text to Speech component wich is reading texts from DOM elements.

103 lines (102 loc) 3.51 kB
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();