Skip to content

Commit

Permalink
Automatic language detection for TTS
Browse files Browse the repository at this point in the history
  • Loading branch information
WilliamKarolDiCioccio committed Jun 1, 2024
1 parent 2975523 commit 6904f78
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 12 deletions.
27 changes: 26 additions & 1 deletion server/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions server/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ grpcio = "^1.64.0"
protobuf = "^5.27.0"
pyttsx3 = "^2.90"
pydub = "^0.25.1"
langdetect = "^1.0.9"


[build-system]
Expand Down
43 changes: 32 additions & 11 deletions server/src/server.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,44 @@
import grpc
from concurrent import futures
import io
import time
from concurrent import futures
import pyttsx3
import grpc
from pydub import AudioSegment
import io
from langdetect import detect
import server_pb2
import server_pb2_grpc


class TTSService(server_pb2_grpc.TTSServicer):
def Synthesize(self, request, context):
engine = pyttsx3.init()
def __init__(self):
self.engine = pyttsx3.init()

def detect_language(self, text):
try:
lang = detect(text)
return lang
except Exception as e:
print(f"Error detecting language: {e}")
return "en"

def select_voice(self, engine, lang):
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
engine.setProperty('rate', 150)
for voice in voices:
if lang in voice.id.lower():
return voice.id
return voices[0].id

def Synthesize(self, request, context):
detected_lang = self.detect_language(request.text)
voice_id = self.select_voice(self.engine, detected_lang)

self.engine.setProperty('voice', voice_id)
self.engine.setProperty('rate', 150)

# Save TTS output to a temporary WAV file
temp_wav_file = 'temp.wav'
engine.save_to_file(request.text, temp_wav_file)
engine.runAndWait()
self.engine.save_to_file(request.text, temp_wav_file)
self.engine.runAndWait()

# Convert WAV file to MP3 and load into byte stream
audio = AudioSegment.from_wav(temp_wav_file)
buffer = io.BytesIO()
audio.export(buffer, format='mp3')
Expand All @@ -28,6 +47,7 @@ def Synthesize(self, request, context):

return server_pb2.TTSResponse(track=audio_bytes)


def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
server_pb2_grpc.add_TTSServicer_to_server(TTSService(), server)
Expand All @@ -41,5 +61,6 @@ def serve():
server.stop(0)
print("Server stopped.")


if __name__ == '__main__':
serve()

0 comments on commit 6904f78

Please sign in to comment.