diff --git a/TTS.gd b/TTS.gd index 1b6f3c9..14dc359 100644 --- a/TTS.gd +++ b/TTS.gd @@ -1,27 +1,35 @@ tool extends Node -const TTS = preload("godot-tts.gdns") +var TTS var tts = null func _ready(): - # Only initialize TTS if it's available or if we're in the editor. - if TTS.can_instance() or Engine.editor_hint: - print_debug("Attempting to load TTS.") - tts = TTS.new() + if not OS.has_feature('JavaScript') and not Engine.has_singleton("AndroidTTS"): + TTS = preload("godot-tts.gdns") + if OS.has_feature('JavaScript'): + pass elif Engine.has_singleton("AndroidTTS"): tts = Engine.get_singleton("AndroidTTS") + elif TTS.can_instance() or Engine.editor_hint: + tts = TTS.new() else: print_debug("TTS not available!") +var javascript_rate = 50 + func set_rate(rate): if tts != null: tts.rate = rate + elif OS.has_feature('JavaScript'): + javascript_rate = rate func get_rate(): if tts != null: return tts.rate + elif OS.has_feature('JavaScript'): + return javascript_rate else: return 0 @@ -31,14 +39,30 @@ func speak(text, interrupt := true): print_debug("%s: %s" % [text, interrupt]) if tts != null: tts.speak(text, interrupt) + elif OS.has_feature('JavaScript'): + var scaled_rate = javascript_rate / 2 + var code = """ + let utterance = new SpeechSynthesisUtterance("%s") + utterance.rate = %s + """ % [text, scaled_rate] + if interrupt: + code += """ + window.speechSynthesis.cancel() + """ + code += "window.speechSynthesis.speak(utterance)" + JavaScript.eval(code) func stop(): if tts != null: tts.stop() + elif OS.has_feature('JavaScript'): + JavaScript.eval("window.speechSynthesis.cancel()") func get_is_rate_supported(): if Engine.get_singleton("AndroidTTS"): return false + elif OS.has_feature('JavaScript'): + return true elif tts != null: return tts.is_rate_supported() else: