mirror of
https://github.com/neonbjb/tortoise-tts.git
synced 2025-12-06 07:12:00 +01:00
84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
import spacy
|
|
import threading
|
|
import socket
|
|
from tortoise.api_fast import TextToSpeech
|
|
from utils.audio import load_voices
|
|
|
|
tts = TextToSpeech()
|
|
nlp = spacy.load("en_core_web_sm")
|
|
|
|
|
|
def generate_audio_stream(text, tts, voice_samples):
|
|
print(f"Generating audio stream...: {text}")
|
|
voice_samples, conditioning_latents = load_voices([voice_samples])
|
|
stream = tts.tts_stream(
|
|
text,
|
|
voice_samples=voice_samples,
|
|
conditioning_latents=conditioning_latents,
|
|
verbose=True,
|
|
stream_chunk_size=40 # Adjust chunk size as needed
|
|
)
|
|
for audio_chunk in stream:
|
|
yield audio_chunk
|
|
|
|
|
|
def split_text(text, max_length=200):
|
|
doc = nlp(text)
|
|
chunks = []
|
|
chunk = []
|
|
length = 0
|
|
|
|
for sent in doc.sents:
|
|
sent_length = len(sent.text)
|
|
if length + sent_length > max_length:
|
|
chunks.append(' '.join(chunk))
|
|
chunk = []
|
|
length = 0
|
|
chunk.append(sent.text)
|
|
length += sent_length + 1
|
|
|
|
if chunk:
|
|
chunks.append(' '.join(chunk))
|
|
|
|
return chunks
|
|
|
|
|
|
def handle_client(client_socket, tts):
|
|
try:
|
|
while True:
|
|
data = client_socket.recv(1024).decode('utf-8')
|
|
if not data:
|
|
break
|
|
character_name, text = data.split('|', 1)
|
|
text_chunks = split_text(text, max_length=200)
|
|
print(text_chunks)
|
|
for chunk in text_chunks:
|
|
audio_stream = generate_audio_stream(chunk, tts, character_name)
|
|
|
|
for audio_chunk in audio_stream:
|
|
audio_data = audio_chunk.cpu().numpy().flatten()
|
|
client_socket.sendall(audio_data.tobytes())
|
|
|
|
client_socket.sendall(b"END_OF_AUDIO")
|
|
|
|
finally:
|
|
client_socket.close()
|
|
print("Client disconnected.")
|
|
|
|
|
|
def start_server():
|
|
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
server.bind(('0.0.0.0', 5000))
|
|
server.listen(5)
|
|
print("Server listening on port 5000")
|
|
|
|
while True:
|
|
client_socket, addr = server.accept()
|
|
print(f"Accepted connection from {addr}")
|
|
client_handler = threading.Thread(target=handle_client, args=(client_socket, tts))
|
|
client_handler.start()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
start_server()
|