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()