🚀 Auto-deploy: BotVPS atualizado em 24/03/2026 11:44:43
This commit is contained in:
@@ -4,6 +4,8 @@ from pydub import AudioSegment
|
|||||||
from gtts import gTTS
|
from gtts import gTTS
|
||||||
import uuid
|
import uuid
|
||||||
import re
|
import re
|
||||||
|
from elevenlabs import generate, save, Voice, VoiceSettings
|
||||||
|
from elevenlabs.client import ElevenLabs
|
||||||
|
|
||||||
def transcribe_audio(file_path: str) -> str:
|
def transcribe_audio(file_path: str) -> str:
|
||||||
"""Converte áudio (qualquer formato compatível com pydub) para WAV e transcreve com Google Speech."""
|
"""Converte áudio (qualquer formato compatível com pydub) para WAV e transcreve com Google Speech."""
|
||||||
@@ -24,19 +26,38 @@ def transcribe_audio(file_path: str) -> str:
|
|||||||
os.remove(temp_wav)
|
os.remove(temp_wav)
|
||||||
|
|
||||||
def text_to_speech(text: str) -> str:
|
def text_to_speech(text: str) -> str:
|
||||||
"""Sintetiza texto em áudio MP3, removendo tags visuais e emojis."""
|
"""Sintetiza texto em áudio MP3 usando ElevenLabs (voz masculina) ou gTTS como fallback."""
|
||||||
# Limpeza para narração
|
# Limpeza para narração
|
||||||
texto_limpo = text.replace("🤖", "").replace("🧑🏫", "").replace("*", "").replace("`", "")
|
texto_limpo = text.replace("🤖", "").replace("🧑🏫", "").replace("*", "").replace("`", "")
|
||||||
# Remove o bloco <REFINED> se houver, pois ele é para leitura visual apenas
|
|
||||||
texto_limpo = re.sub(r'<REFINED>.*?</REFINED>', '', texto_limpo, flags=re.DOTALL).strip()
|
texto_limpo = re.sub(r'<REFINED>.*?</REFINED>', '', texto_limpo, flags=re.DOTALL).strip()
|
||||||
|
|
||||||
# Se sobrar texto vazio após limpar o refinado (raro), fala algo genérico
|
|
||||||
if not texto_limpo:
|
if not texto_limpo:
|
||||||
texto_limpo = "Relatório processado. Os detalhes estão no painel visual."
|
texto_limpo = "Relatório processado. Os detalhes estão no painel visual."
|
||||||
|
|
||||||
filename = f"audio_reply_{uuid.uuid4().hex[:8]}.mp3"
|
filename = f"audio_reply_{uuid.uuid4().hex[:8]}.mp3"
|
||||||
filepath = os.path.join("/tmp", filename)
|
filepath = os.path.join("/tmp", filename)
|
||||||
|
|
||||||
|
api_key = os.getenv("ELEVENLABS_API_KEY")
|
||||||
|
voice_id = os.getenv("ELEVENLABS_VOICE_ID", "ErMmoak87FvRAs60I6g0") # Marco (Male, PT-BR) as default
|
||||||
|
|
||||||
|
if api_key:
|
||||||
|
try:
|
||||||
|
client = ElevenLabs(api_key=api_key)
|
||||||
|
audio = client.generate(
|
||||||
|
text=texto_limpo,
|
||||||
|
voice=voice_id,
|
||||||
|
model="eleven_multilingual_v2"
|
||||||
|
)
|
||||||
|
# Salvando o resultado para arquivo
|
||||||
|
with open(filepath, "wb") as f:
|
||||||
|
for chunk in audio:
|
||||||
|
if chunk:
|
||||||
|
f.write(chunk)
|
||||||
|
return filename
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[VOICE] Erro ElevenLabs: {e}. Usando fallback gTTS.")
|
||||||
|
|
||||||
|
# Fallback gTTS (Voz feminina lenta mas gratuita)
|
||||||
tts = gTTS(text=texto_limpo, lang='pt-br', tld='com.br', slow=False)
|
tts = gTTS(text=texto_limpo, lang='pt-br', tld='com.br', slow=False)
|
||||||
tts.save(filepath)
|
tts.save(filepath)
|
||||||
return filename
|
return filename
|
||||||
|
|||||||
Reference in New Issue
Block a user