Spaces:
Sleeping
Sleeping
File size: 3,350 Bytes
f7a0438 83ce026 f7a0438 83ce026 a8e2549 f7a0438 ad16a14 f7a0438 29ac67b 83ce026 376eeaa f7a0438 83ce026 f7a0438 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | 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()
|