malek-messaoudii
Update files
674469e
raw
history blame
1.44 kB
import logging
import io
from gtts import gTTS
import numpy as np
import wave
logger = logging.getLogger(__name__)
async def generate_tts(text: str) -> bytes:
"""
Convert text to speech using Google Text-to-Speech (gTTS).
Returns MP3 audio bytes.
"""
try:
if not text or len(text) > 500:
raise ValueError("Text must be between 1-500 characters")
logger.info(f"TTS: Generating audio for '{text[:50]}...'")
# Generate audio using gTTS
tts = gTTS(text=text, lang='en', slow=False)
# Save to bytes buffer
audio_buffer = io.BytesIO()
tts.write_to_fp(audio_buffer)
audio_bytes = audio_buffer.getvalue()
logger.info(f"✓ TTS Success: {len(audio_bytes)} bytes generated")
return audio_bytes
except Exception as e:
logger.error(f"✗ TTS Error: {str(e)}")
# Return fallback silent audio
return generate_silent_wav()
def generate_silent_wav() -> bytes:
"""Generate 1-second silent WAV file as fallback"""
sample_rate = 22050
duration = 1.0
silence = np.zeros(int(sample_rate * duration), dtype=np.int16)
buffer = io.BytesIO()
with wave.open(buffer, 'wb') as wav:
wav.setnchannels(1)
wav.setsampwidth(2)
wav.setframerate(sample_rate)
wav.writeframes(silence.tobytes())
return buffer.getvalue()