Synthetics commited on
Commit
f7a0438
·
1 Parent(s): 730469e

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -0
app.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from pydub import AudioSegment
3
+ import tempfile
4
+ import os
5
+ import asyncio
6
+ import anyio
7
+ import ffmpeg
8
+ from tts_voice import tts_order_voice
9
+ import edge_tts
10
+
11
+ language_dict = tts_order_voice
12
+
13
+ async def text_to_speech_edge(text, language_code):
14
+ voice = language_dict[language_code]
15
+ communicate = edge_tts.Communicate(text, voice)
16
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
17
+ tmp_path = tmp_file.name
18
+
19
+ await communicate.save(tmp_path)
20
+
21
+ new_temp_path = tmp_path.replace(".mp3", ".wav")
22
+ (
23
+ ffmpeg.input(tmp_path)
24
+ .output(new_temp_path)
25
+ .run()
26
+ )
27
+ return new_temp_path
28
+
29
+ def processar_audio(trilha, texto_narracao, volume_trilha, tonalidade_narracao, language_code):
30
+ trilha = AudioSegment.from_file(trilha.name)
31
+
32
+ # Gerar narração
33
+ narrazione_path = asyncio.run(text_to_speech_edge(texto_narracao, language_code))
34
+
35
+ faixa2 = AudioSegment.from_file(narrazione_path)
36
+
37
+ # Ajustar a tonalidade da narração
38
+ faixa2_tonalidade_ajustada = faixa2._spawn(faixa2.raw_data, overrides={
39
+ "frame_rate": int(faixa2.frame_rate * (2 ** (tonalidade_narracao / 12.0)))
40
+ })
41
+
42
+ # Ajustar o volume da trilha
43
+ trilha_com_volume = trilha - volume_trilha
44
+
45
+ # Obter a duração total das faixas
46
+ duracao_total = max(len(trilha_com_volume), len(faixa2_tonalidade_ajustada))
47
+
48
+ print(f'Duração total: {duracao_total}')
49
+
50
+ # Ajustar o tamanho das faixas para a duração total
51
+ trilha_com_volume = trilha_com_volume[:duracao_total]
52
+ faixa2_tonalidade_ajustada = faixa2_tonalidade_ajustada[:duracao_total]
53
+
54
+ # Sobrepor as duas faixas
55
+ trilha_mesclada = trilha_com_volume.overlay(faixa2_tonalidade_ajustada, position=0)
56
+
57
+ # Determinar o ponto de corte (após o final da faixa 2)
58
+ ponto_de_corte = len(faixa2_tonalidade_ajustada)
59
+
60
+ print(f'Ponto de corte: {ponto_de_corte}')
61
+
62
+ # Cortar a trilha após o ponto de corte
63
+ trilha_cortada = trilha_mesclada[:ponto_de_corte]
64
+
65
+ # Criar um arquivo temporário para salvar a trilha cortada
66
+ _, temp_path = tempfile.mkstemp(suffix=".mp3")
67
+ trilha_cortada.export(temp_path, format="mp3")
68
+
69
+ # Remover arquivos temporários
70
+ os.remove(narrazione_path)
71
+
72
+ return temp_path
73
+
74
+ def main():
75
+ st.title("Mesclar e alterar a tonalidade da voz")
76
+
77
+ trilha = st.file_uploader("Selecione a trilha", type=["mp3", "wav"])
78
+ texto_narracao = st.text_area("Texto da Narração")
79
+ volume_trilha = st.slider("Volume da Trilha", 0, 100, 27)
80
+ tonalidade_narracao = st.slider("Tonalidade da Narração (em semitons)", -12, 12, 0)
81
+ language_code = st.selectbox("Selecione o Narrador", list(language_dict.keys()), index=1)
82
+
83
+ if st.button("Processar"):
84
+ if trilha and texto_narracao:
85
+ resultado = processar_audio(trilha, texto_narracao, volume_trilha, tonalidade_narracao, language_code)
86
+ st.audio(resultado, format="audio/mp3", caption="Resultado")
87
+
88
+ if __name__ == "__main__":
89
+ main()