voice_list.gd 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. extends Control
  2. ## The utterance ID to use for text to speech.
  3. var id := 0
  4. var ut_map := {}
  5. var vs: Array[Dictionary]
  6. func _ready() -> void:
  7. # Get voice data.
  8. vs = DisplayServer.tts_get_voices()
  9. var root: TreeItem = $Tree.create_item()
  10. $Tree.set_hide_root(true)
  11. $Tree.set_column_title(0, "Name")
  12. $Tree.set_column_title(1, "Language")
  13. $Tree.set_column_titles_visible(true)
  14. for v in vs:
  15. var child: TreeItem = $Tree.create_item(root)
  16. child.set_text(0, v["name"])
  17. child.set_metadata(0, v["id"])
  18. child.set_text(1, v["language"])
  19. $Log.text += "%d voices available.\n" % [vs.size()]
  20. $Log.text += "=======\n"
  21. # Ensure the first voice added to the list is preselected.
  22. $Tree.get_root().get_child(0).select(0)
  23. # Add callbacks.
  24. DisplayServer.tts_set_utterance_callback(DisplayServer.TTS_UTTERANCE_STARTED, _on_utterance_start)
  25. DisplayServer.tts_set_utterance_callback(DisplayServer.TTS_UTTERANCE_ENDED, _on_utterance_end)
  26. DisplayServer.tts_set_utterance_callback(DisplayServer.TTS_UTTERANCE_CANCELED, _on_utterance_error)
  27. DisplayServer.tts_set_utterance_callback(DisplayServer.TTS_UTTERANCE_BOUNDARY, _on_utterance_boundary)
  28. func _process(_delta: float) -> void:
  29. $ButtonPause.button_pressed = DisplayServer.tts_is_paused()
  30. if DisplayServer.tts_is_speaking():
  31. $ColorRect.color = Color(0.9, 0.3, 0.1)
  32. else:
  33. $ColorRect.color = Color(1, 1, 1)
  34. func _on_utterance_boundary(pos: int, ut_id: int) -> void:
  35. $RichTextLabel.text = "[bgcolor=yellow][color=black]" + ut_map[ut_id].substr(0, pos) + "[/color][/bgcolor]" + ut_map[ut_id].substr(pos, -1)
  36. func _on_utterance_start(ut_id: int) -> void:
  37. $Log.text += "Utterance %d started.\n" % [ut_id]
  38. func _on_utterance_end(ut_id: int) -> void:
  39. $RichTextLabel.text = "[bgcolor=yellow][color=black]" + ut_map[ut_id] + "[/color][/bgcolor]"
  40. $Log.text += "Utterance %d ended.\n" % [ut_id]
  41. ut_map.erase(ut_id)
  42. func _on_utterance_error(ut_id: int) -> void:
  43. $RichTextLabel.text = ""
  44. $Log.text += "Utterance %d canceled/failed.\n" % [ut_id]
  45. ut_map.erase(ut_id)
  46. func _on_button_stop_pressed() -> void:
  47. DisplayServer.tts_stop()
  48. func _on_button_pause_pressed() -> void:
  49. if $ButtonPause.pressed:
  50. DisplayServer.tts_pause()
  51. else:
  52. DisplayServer.tts_resume()
  53. func _on_button_speak_pressed() -> void:
  54. if $Tree.get_selected():
  55. $Log.text += "Utterance %d queried.\n" % [id]
  56. ut_map[id] = $Utterance.text
  57. DisplayServer.tts_speak($Utterance.text, $Tree.get_selected().get_metadata(0), $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id, false)
  58. id += 1
  59. else:
  60. OS.alert("No voice selected.\nSelect a voice in the list, then try using Speak again.")
  61. func _on_button_int_speak_pressed() -> void:
  62. if $Tree.get_selected():
  63. $Log.text += "Utterance %d interrupted.\n" % [id]
  64. ut_map[id] = $Utterance.text
  65. DisplayServer.tts_speak($Utterance.text, $Tree.get_selected().get_metadata(0), $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id, true)
  66. id += 1
  67. else:
  68. OS.alert("No voice selected.\nSelect a voice in the list, then try using Interrupt again.")
  69. func _on_button_clear_log_pressed() -> void:
  70. $Log.text = ""
  71. func _on_HSliderRate_value_changed(value: float) -> void:
  72. $HSliderRate/Value.text = "%.2fx" % value
  73. func _on_HSliderPitch_value_changed(value: float) -> void:
  74. $HSliderPitch/Value.text = "%.2fx" % value
  75. func _on_HSliderVolume_value_changed(value: float) -> void:
  76. $HSliderVolume/Value.text = "%d%%" % value
  77. func _on_Button_pressed() -> void:
  78. var vc: PackedStringArray
  79. #demo - en
  80. vc = DisplayServer.tts_get_voices_for_language("en")
  81. if not vc.is_empty():
  82. ut_map[id] = "Beware the Jabberwock, my son!"
  83. ut_map[id + 1] = "The jaws that bite, the claws that catch!"
  84. DisplayServer.tts_speak("Beware the Jabberwock, my son!", vc[0], $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id)
  85. DisplayServer.tts_speak("The jaws that bite, the claws that catch!", vc[0], $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id + 1)
  86. id += 2
  87. #demo - es
  88. vc = DisplayServer.tts_get_voices_for_language("es")
  89. if not vc.is_empty():
  90. ut_map[id] = "¡Cuidado, hijo, con el Fablistanón!"
  91. ut_map[id + 1] = "¡Con sus dientes y garras, muerde, apresa!"
  92. DisplayServer.tts_speak("¡Cuidado, hijo, con el Fablistanón!", vc[0], $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id)
  93. DisplayServer.tts_speak("¡Con sus dientes y garras, muerde, apresa!", vc[0], $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id + 1)
  94. id += 2
  95. #demo - ru
  96. vc = DisplayServer.tts_get_voices_for_language("ru")
  97. if not vc.is_empty():
  98. ut_map[id] = "О, бойся Бармаглота, сын!"
  99. ut_map[id + 1] = "Он так свирлеп и дик!"
  100. DisplayServer.tts_speak("О, бойся Бармаглота, сын!", vc[0], $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id)
  101. DisplayServer.tts_speak("Он так свирлеп и дик!", vc[0], $HSliderVolume.value, $HSliderPitch.value, $HSliderRate.value, id + 1)
  102. id += 2
  103. func _on_LineEditFilterName_text_changed(_new_text: String) -> void:
  104. $Tree.clear()
  105. var root: TreeItem = $Tree.create_item()
  106. for v in vs:
  107. if (
  108. $LineEditFilterName.text.is_empty() or $LineEditFilterName.text.to_lower() in v["name"].to_lower()
  109. ) and (
  110. $LineEditFilterLang.text.is_empty() or $LineEditFilterLang.text.to_lower() in v["language"].to_lower()
  111. ):
  112. var child: TreeItem = $Tree.create_item(root)
  113. child.set_text(0, v["name"])
  114. child.set_metadata(0, v["id"])
  115. child.set_text(1, v["language"])