From 6bd67afb1a6f24aeffdcef04edd24762633e8b37 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Fri, 15 Apr 2022 16:45:21 +0100 Subject: [PATCH] Finish up the basic Rigel TTS --- rigel/requirements.txt | 1 + rigel/server.py | 7 +++++- rigel/tcp.py | 48 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/rigel/requirements.txt b/rigel/requirements.txt index 0a95692..31e7542 100644 --- a/rigel/requirements.txt +++ b/rigel/requirements.txt @@ -1,2 +1,3 @@ tts==0.6 python-dotenv +simpleaudio diff --git a/rigel/server.py b/rigel/server.py index d3cfa01..5960f88 100755 --- a/rigel/server.py +++ b/rigel/server.py @@ -23,7 +23,12 @@ from tcp import start, synth def main(): config = dotenv.dotenv_values(sys.argv[1]) - asyncio.run(start(config, synth(config))) + + try: + asyncio.run(start(config, synth(config))) + except KeyboardInterrupt: + sys.exit() + if __name__ == "__main__": main() diff --git a/rigel/tcp.py b/rigel/tcp.py index 90be2fa..5301d2f 100644 --- a/rigel/tcp.py +++ b/rigel/tcp.py @@ -14,13 +14,51 @@ # You should have received a copy of the GNU General Public License import asyncio +import numpy as np # pylint: disable=redefined-outer-name, unused-argument from pathlib import Path +import simpleaudio as sa + from TTS.utils.manage import ModelManager from TTS.utils.synthesizer import Synthesizer +def to_wav_data(wav): + wav_norm = np.array(wav) * (32767 / max(0.01, np.max(np.abs(wav)))) + return wav_norm.astype(np.int16) + + +def play(wav): + #p = pyaudio.PyAudio() + try: + # open stream + # stream = p.open(format=p.get_format_from_width(wav.getsampwidth()), + # channels=wav.getnchannels(), + # rate=wav.getframerate(), + # output=True) + # stream = p.open(format=pyaudio.paInt16, + # channels=1, + # rate=22050, + # output=True) + + # stream.write(to_wav_data(wav)) + + # # stop stream + # stream.stop_stream() + # stream.close() + # close PyAudio + # Start audio + play = sa.play_buffer(to_wav_data(wav), 1, 2, 22050) + + # Wait for audio playback to finish before exiting + play.wait_done() + + finally: + play.stop() + #p.terminate() + + def synth(config): path = Path(__file__).parent / ".models.json" manager = ModelManager(path) @@ -51,12 +89,16 @@ def synth(config): ) async def tcp_handler(reader, writer): - data = await reader.readuntil(b'\0') + # Read till EOF + data = await reader.read(-1) message = data.decode() - #wav = synthesizer.tts(message, speaker_idx, "None", None) + wav = synthesizer.tts(message, speaker_idx, "None", None) + + play(wav) + print(f"Received {message!r}") - writer.write("Ok") + writer.write(b"Ok") await writer.drain() writer.close()