TTSandTrack / app.py
Synthetics's picture
Update app.py
41bb682
Raw History Blame Contribute Delete
3.35 kB
import streamlit as st
from pydub import AudioSegment
import tempfile
import os
import asyncio
import anyio
import ffmpeg
from tts_voice import tts_order_voice
import edge_tts
language_dict = tts_order_voice
async def text_to_speech_edge(text, language_code):
voice = language_dict[language_code]
communicate = edge_tts.Communicate(text, voice)
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
tmp_path = tmp_file.name
await communicate.save(tmp_path)
new_temp_path = tmp_path.replace(".mp3", ".wav")
(
ffmpeg.input(tmp_path)
.output(new_temp_path)
.run()
)
return new_temp_path
def processar_audio(trilha_path, texto_narracao, volume_trilha, tonalidade_narracao, language_code):
trilha = AudioSegment.from_file(trilha_path)
# Gerar narração
narrazione_path = asyncio.run(text_to_speech_edge(texto_narracao, language_code))
faixa2 = AudioSegment.from_file(narrazione_path)
# Ajustar a tonalidade da narração
faixa2_tonalidade_ajustada = faixa2._spawn(faixa2.raw_data, overrides={
"frame_rate": int(faixa2.frame_rate * (2 ** (tonalidade_narracao / 12.0)))
})
# Ajustar o volume da trilha
trilha_com_volume = trilha - volume_trilha
# Obter a duração total das faixas
duracao_total = max(len(trilha_com_volume), len(faixa2_tonalidade_ajustada))
print(f'Duração total: {duracao_total}')
# Ajustar o tamanho das faixas para a duração total
trilha_com_volume = trilha_com_volume[:duracao_total]
faixa2_tonalidade_ajustada = faixa2_tonalidade_ajustada[:duracao_total]
# Sobrepor as duas faixas
trilha_mesclada = trilha_com_volume.overlay(faixa2_tonalidade_ajustada, position=0)
# Determinar o ponto de corte (após o final da faixa 2)
ponto_de_corte = len(faixa2_tonalidade_ajustada)
print(f'Ponto de corte: {ponto_de_corte}')
# Cortar a trilha após o ponto de corte
trilha_cortada = trilha_mesclada[:ponto_de_corte]
# Criar um arquivo temporário para salvar a trilha cortada
_, temp_path = tempfile.mkstemp(suffix=".mp3")
trilha_cortada.export(temp_path, format="mp3")
# Remover arquivos temporários
os.remove(narrazione_path)
return temp_path
def main():
trilha_upload = st.file_uploader("Selecione a trilha", type=["mp3", "wav"])
volume_trilha = st.slider("Volume da Trilha", 0, 100, 27, key="volume_trilha")
volume_trilha = 27 - volume_trilha
texto_narracao = st.text_area("Texto da Narração")
language_code = st.selectbox("Selecione o Narrador", list(language_dict.keys()), index=1)
tonalidade_narracao = st.slider("Tonalidade da Narração (em semitons)", -12, 12, 0)
if st.button("Gerar"):
if trilha_upload and texto_narracao:
# Salvar o arquivo temporariamente
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
tmp_path = tmp_file.name
tmp_file.write(trilha_upload.read())
resultado = processar_audio(tmp_path, texto_narracao, volume_trilha, tonalidade_narracao, language_code)
st.audio(resultado, format="audio/mp3")
# Remover arquivo temporário após o processamento
os.remove(tmp_path)
if __name__ == "__main__":
main()