Spaces:
Sleeping
Sleeping
| 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() | |