wip: add tts debug
This commit is contained in:
parent
b71bedb62a
commit
084bea8f9d
5 changed files with 5746 additions and 396 deletions
6
Makefile
6
Makefile
|
|
@ -7,3 +7,9 @@ tests:
|
||||||
uv run pytest --cov=halig -vv tests --report-log reportlog.json
|
uv run pytest --cov=halig -vv tests --report-log reportlog.json
|
||||||
uv run coverage html
|
uv run coverage html
|
||||||
uv run coverage xml
|
uv run coverage xml
|
||||||
|
|
||||||
|
compile:
|
||||||
|
uv run pyinstaller markovbot.spec
|
||||||
|
|
||||||
|
clean-compile:
|
||||||
|
uv run pyinstaller markovbot.spec --clean
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,10 @@ dependencies = [
|
||||||
"pyinstaller>=6.11.0",
|
"pyinstaller>=6.11.0",
|
||||||
"twitchwebsocket>=1.2.1",
|
"twitchwebsocket>=1.2.1",
|
||||||
"loguru>=0.7.2",
|
"loguru>=0.7.2",
|
||||||
|
"ffmpeg>=1.4",
|
||||||
|
"ffmpeg-python>=0.2.0",
|
||||||
|
"simpleaudio>=1.0.4",
|
||||||
|
"realtimetts[coqui,gtts,minimal,openai,system]>=0.4.17",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.uv]
|
[tool.uv]
|
||||||
|
|
@ -44,7 +48,9 @@ module = [
|
||||||
"nltk.tokenize.treebank",
|
"nltk.tokenize.treebank",
|
||||||
"nltk.tokenize.destructive",
|
"nltk.tokenize.destructive",
|
||||||
"TwitchWebsocket",
|
"TwitchWebsocket",
|
||||||
"tokenizer"
|
"tokenizer",
|
||||||
|
"simpleaudio",
|
||||||
|
"RealtimeTTS"
|
||||||
]
|
]
|
||||||
ignore_missing_imports = true
|
ignore_missing_imports = true
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ from kivy.uix.widget import Widget
|
||||||
|
|
||||||
from src.markovbot_gui.bot_runner import BotRunner
|
from src.markovbot_gui.bot_runner import BotRunner
|
||||||
from src.markovbot_gui.config_window import ConfigWindow
|
from src.markovbot_gui.config_window import ConfigWindow
|
||||||
|
from src.markovbot_gui.tts_window import TTSWindow
|
||||||
|
|
||||||
|
|
||||||
class BotApp(App):
|
class BotApp(App):
|
||||||
|
|
@ -51,6 +52,29 @@ class BotApp(App):
|
||||||
|
|
||||||
popup.open()
|
popup.open()
|
||||||
|
|
||||||
|
def run_tts(self, instance):
|
||||||
|
"""Create a TTS window and open it"""
|
||||||
|
tts_window = TTSWindow(config_path=self.config_path)
|
||||||
|
popup = Popup(
|
||||||
|
title="TTS testing ground",
|
||||||
|
content=tts_window,
|
||||||
|
size_hint=(None, None),
|
||||||
|
size=(dp(600), dp(400)),
|
||||||
|
auto_dismiss=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add close button
|
||||||
|
close_button = Button(
|
||||||
|
text="Close",
|
||||||
|
size_hint=(None, None),
|
||||||
|
size=(dp(100), dp(40)),
|
||||||
|
pos_hint={"center_x": 0.5},
|
||||||
|
)
|
||||||
|
close_button.bind(on_release=popup.dismiss)
|
||||||
|
tts_window.add_widget(close_button)
|
||||||
|
|
||||||
|
popup.open()
|
||||||
|
|
||||||
def build(self):
|
def build(self):
|
||||||
widget = Widget()
|
widget = Widget()
|
||||||
|
|
||||||
|
|
@ -60,6 +84,10 @@ class BotApp(App):
|
||||||
run_button.bind(on_release=self.run_bot)
|
run_button.bind(on_release=self.run_bot)
|
||||||
layout.add_widget(run_button)
|
layout.add_widget(run_button)
|
||||||
|
|
||||||
|
tts_button = Button(text="TTS button")
|
||||||
|
tts_button.bind(on_release=self.run_tts)
|
||||||
|
layout.add_widget(tts_button)
|
||||||
|
|
||||||
config_button = Button(text="Open config")
|
config_button = Button(text="Open config")
|
||||||
config_button.bind(on_release=self.run_config)
|
config_button.bind(on_release=self.run_config)
|
||||||
layout.add_widget(config_button)
|
layout.add_widget(config_button)
|
||||||
|
|
|
||||||
69
src/markovbot_gui/tts_window.py
Normal file
69
src/markovbot_gui/tts_window.py
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from kivy.metrics import dp
|
||||||
|
from kivy.uix.boxlayout import BoxLayout
|
||||||
|
from kivy.uix.button import Button
|
||||||
|
from kivy.uix.textinput import TextInput
|
||||||
|
from RealtimeTTS import (
|
||||||
|
CoquiEngine,
|
||||||
|
GTTSEngine,
|
||||||
|
GTTSVoice,
|
||||||
|
SystemEngine,
|
||||||
|
TextToAudioStream,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TTSWindow(BoxLayout):
|
||||||
|
def __init__(self, config_path: Path, **kwargs):
|
||||||
|
super().__init__(**kwargs)
|
||||||
|
self.config_path = config_path
|
||||||
|
self.orientation = "vertical"
|
||||||
|
|
||||||
|
self.spacing = dp(10)
|
||||||
|
self.padding = dp(20)
|
||||||
|
|
||||||
|
# create a text input for the text to be converted to audio,
|
||||||
|
# and a button to execute the conversion
|
||||||
|
|
||||||
|
text_layout = BoxLayout(orientation="vertical")
|
||||||
|
self.add_widget(text_layout)
|
||||||
|
|
||||||
|
self.text_input = TextInput(multiline=True)
|
||||||
|
text_layout.add_widget(self.text_input)
|
||||||
|
|
||||||
|
gtts_button = Button(text="GTTS")
|
||||||
|
gtts_button.bind(on_release=self.run_gtts)
|
||||||
|
text_layout.add_widget(gtts_button)
|
||||||
|
|
||||||
|
stts_button = Button(text="STTS")
|
||||||
|
stts_button.bind(on_release=self.run_stts)
|
||||||
|
text_layout.add_widget(stts_button)
|
||||||
|
|
||||||
|
ctts_button = Button(text="CTTS")
|
||||||
|
ctts_button.bind(on_release=self.run_ctts)
|
||||||
|
text_layout.add_widget(ctts_button)
|
||||||
|
|
||||||
|
def play(self, stream):
|
||||||
|
stream.feed(self.text_input.text.strip())
|
||||||
|
stream.play(output_wavfile="output.wav", muted=True)
|
||||||
|
import simpleaudio as sa
|
||||||
|
|
||||||
|
wave_obj = sa.WaveObject.from_wave_file("output.wav")
|
||||||
|
play_obj = wave_obj.play()
|
||||||
|
play_obj.wait_done()
|
||||||
|
|
||||||
|
def run_gtts(self, instance):
|
||||||
|
engine = GTTSEngine(voice=GTTSVoice(language="es-ES"))
|
||||||
|
stream = TextToAudioStream(engine, language="es")
|
||||||
|
self.play(stream)
|
||||||
|
|
||||||
|
def run_stts(self, instance):
|
||||||
|
engine = SystemEngine()
|
||||||
|
stream = TextToAudioStream(engine, language="es")
|
||||||
|
self.play(stream)
|
||||||
|
|
||||||
|
def run_ctts(self, instance):
|
||||||
|
engine = CoquiEngine(language="es")
|
||||||
|
engine.download_model()
|
||||||
|
stream = TextToAudioStream(engine, language="es")
|
||||||
|
self.play(stream)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue