Uniaff commited on
Commit
88610ff
·
verified ·
1 Parent(s): 77e9d69

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -19
app.py CHANGED
@@ -1,17 +1,22 @@
1
  import os
2
  import sys
3
- import uuid
4
  import subprocess
5
  import gradio as gr
6
  from pydub import AudioSegment
7
  import tempfile
8
  from scipy.io.wavfile import write, read
9
  from TTS.api import TTS
10
- import numpy as np # Добавлен импорт NumPy
 
 
 
11
 
12
  # Установка переменных окружения для принятия лицензионных условий
13
  os.environ["COQUI_TOS_AGREED"] = "1"
14
 
 
 
 
15
  # Глобальные переменные и настройки
16
  language_options = {
17
  "English (en)": "en",
@@ -42,6 +47,7 @@ other_language = {
42
  "Bulgarian": "bul",
43
  }
44
 
 
45
  tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")
46
 
47
  # Функции для голосового клонирования
@@ -58,66 +64,132 @@ def check_audio_length(audio_path, max_duration=120):
58
  return False
59
 
60
  def synthesize_and_convert_voice(text, language_iso, voice_audio_path, speed):
 
61
  tts_synthesis = TTS(model_name=f"tts_models/{language_iso}/fairseq/vits")
62
  wav_data = tts_synthesis.tts(text, speed=speed)
63
-
64
  # Преобразование wav_data из списка в NumPy массив с типом float32
65
  wav_data_np = np.array(wav_data, dtype=np.float32)
66
-
67
  # Нормализация данных, если необходимо
68
  max_val = np.max(np.abs(wav_data_np))
69
  if max_val > 1.0:
70
  wav_data_np = wav_data_np / max_val
71
-
72
  # Масштабирование до int16 для записи в WAV файл
73
  wav_data_int16 = np.int16(wav_data_np * 32767)
74
-
75
- tts_conversion = TTS(model_name="voice_conversion_models/multilingual/vctk/freevc24", progress_bar=False)
76
 
77
- # Запись wav_data_int16 во временный файл
78
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_tts_wav_file:
79
  temp_tts_wav_path = temp_tts_wav_file.name
80
- write(temp_tts_wav_path, 22050, wav_data_int16) # Используем массив int16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
 
82
  # Подготовка временного выходного файла
83
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_output_wav_file:
84
  temp_output_wav_path = temp_output_wav_file.name
85
 
86
  # Преобразование голоса
87
- tts_conversion.voice_conversion_to_file(temp_tts_wav_path, target_wav=voice_audio_path,
88
  file_path=temp_output_wav_path)
89
 
90
- # Чтение преобразованного аудио из temp_output_wav_path
91
  output_sample_rate, output_audio_data = read(temp_output_wav_path)
92
 
93
  # Удаление временных файлов
94
  os.remove(temp_tts_wav_path)
 
95
  os.remove(temp_output_wav_path)
96
 
97
  return (output_sample_rate, output_audio_data)
98
 
 
99
  def synthesize_speech(text, speaker_wav_path, language_iso, speed):
100
- # Генерация речи с помощью tts и сохранение во временный файл
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_tts_output:
102
  temp_tts_output_path = temp_tts_output.name
103
- tts.tts_to_file(text=text, file_path=temp_tts_output_path, speed=speed,
104
- speaker_wav=speaker_wav_path, language=language_iso)
 
 
 
 
 
105
 
106
- tts_conversion = TTS(model_name="voice_conversion_models/multilingual/vctk/freevc24", progress_bar=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
 
108
  # Подготовка временного выходного файла
109
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_output_wav_file:
110
  temp_output_wav_path = temp_output_wav_file.name
111
 
112
  # Преобразование голоса
113
- tts_conversion.voice_conversion_to_file(temp_tts_output_path, target_wav=speaker_wav_path,
114
- file_path=temp_output_wav_path)
 
 
 
115
 
116
- # Чтение преобразованного аудио из temp_output_wav_path
117
  output_sample_rate, output_audio_data = read(temp_output_wav_path)
118
 
119
  # Удаление временных файлов
 
120
  os.remove(temp_tts_output_path)
 
121
  os.remove(temp_output_wav_path)
122
 
123
  return (output_sample_rate, output_audio_data)
@@ -283,7 +355,6 @@ with gr.Blocks() as app:
283
  generate,
284
  inputs=[video, audio, checkpoint, no_smooth, resize_factor, pad_top, pad_bottom, pad_left, pad_right, save_as_video],
285
  outputs=result,
286
- # concurrency_limit=30
287
  )
288
 
289
  def launch_gradio():
 
1
  import os
2
  import sys
 
3
  import subprocess
4
  import gradio as gr
5
  from pydub import AudioSegment
6
  import tempfile
7
  from scipy.io.wavfile import write, read
8
  from TTS.api import TTS
9
+ import numpy as np
10
+ import torch
11
+ import torchaudio
12
+ from resemble_enhance.enhancer.inference import denoise
13
 
14
  # Установка переменных окружения для принятия лицензионных условий
15
  os.environ["COQUI_TOS_AGREED"] = "1"
16
 
17
+ # Определение устройства (CUDA или CPU)
18
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
19
+
20
  # Глобальные переменные и настройки
21
  language_options = {
22
  "English (en)": "en",
 
47
  "Bulgarian": "bul",
48
  }
49
 
50
+ # Инициализация модели TTS
51
  tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")
52
 
53
  # Функции для голосового клонирования
 
64
  return False
65
 
66
  def synthesize_and_convert_voice(text, language_iso, voice_audio_path, speed):
67
+ # Синтез речи с помощью TTS
68
  tts_synthesis = TTS(model_name=f"tts_models/{language_iso}/fairseq/vits")
69
  wav_data = tts_synthesis.tts(text, speed=speed)
70
+
71
  # Преобразование wav_data из списка в NumPy массив с типом float32
72
  wav_data_np = np.array(wav_data, dtype=np.float32)
73
+
74
  # Нормализация данных, если необходимо
75
  max_val = np.max(np.abs(wav_data_np))
76
  if max_val > 1.0:
77
  wav_data_np = wav_data_np / max_val
78
+
79
  # Масштабирование до int16 для записи в WAV файл
80
  wav_data_int16 = np.int16(wav_data_np * 32767)
 
 
81
 
82
+ # Сохранение синтезированного аудио во временный файл
83
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_tts_wav_file:
84
  temp_tts_wav_path = temp_tts_wav_file.name
85
+ write(temp_tts_wav_path, 22050, wav_data_int16)
86
+
87
+ # Загрузка синтезированного аудио
88
+ wav_tensor, sample_rate = torchaudio.load(temp_tts_wav_path)
89
+
90
+ # Преобразование в моно, если аудио стерео
91
+ if wav_tensor.dim() > 1 and wav_tensor.size(0) > 1:
92
+ wav_tensor = wav_tensor.mean(dim=0, keepdim=True)
93
+
94
+ # Применение денойзинга (не перемещаем wav_tensor на устройство)
95
+ denoised_wav_tensor, denoised_sample_rate = denoise(wav_tensor.squeeze(), sample_rate, device)
96
+
97
+ # Сохранение денойзенного аудио во временный файл
98
+ with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_denoised_wav_file:
99
+ temp_denoised_wav_path = temp_denoised_wav_file.name
100
+ torchaudio.save(temp_denoised_wav_path, denoised_wav_tensor.unsqueeze(0).cpu(), denoised_sample_rate)
101
+
102
+ # Преобразование голоса с использованием денойзенного аудио
103
+ tts_conversion = TTS(model_name="voice_conversion_models/multilingual/vctk/freevc24", progress_bar=False)
104
 
105
  # Подготовка временного выходного файла
106
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_output_wav_file:
107
  temp_output_wav_path = temp_output_wav_file.name
108
 
109
  # Преобразование голоса
110
+ tts_conversion.voice_conversion_to_file(temp_denoised_wav_path, target_wav=voice_audio_path,
111
  file_path=temp_output_wav_path)
112
 
113
+ # Чтение преобразованного аудио
114
  output_sample_rate, output_audio_data = read(temp_output_wav_path)
115
 
116
  # Удаление временных файлов
117
  os.remove(temp_tts_wav_path)
118
+ os.remove(temp_denoised_wav_path)
119
  os.remove(temp_output_wav_path)
120
 
121
  return (output_sample_rate, output_audio_data)
122
 
123
+
124
  def synthesize_speech(text, speaker_wav_path, language_iso, speed):
125
+ # Загрузка аудио говорящего
126
+ speaker_wav_tensor, speaker_sample_rate = torchaudio.load(speaker_wav_path)
127
+
128
+ # Преобразование в моно, если аудио стерео
129
+ if speaker_wav_tensor.dim() > 1 and speaker_wav_tensor.size(0) > 1:
130
+ speaker_wav_tensor = speaker_wav_tensor.mean(dim=0, keepdim=True)
131
+
132
+ # Применение денойзинга к аудио говорящего
133
+ denoised_speaker_wav_tensor, denoised_speaker_sample_rate = denoise(
134
+ speaker_wav_tensor.squeeze(), speaker_sample_rate, device
135
+ )
136
+
137
+ # Сохранение денойзенного аудио говорящего во временный файл
138
+ with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_denoised_speaker_file:
139
+ temp_denoised_speaker_path = temp_denoised_speaker_file.name
140
+ torchaudio.save(
141
+ temp_denoised_speaker_path,
142
+ denoised_speaker_wav_tensor.unsqueeze(0).cpu(),
143
+ denoised_speaker_sample_rate
144
+ )
145
+
146
+ # Генерация речи с помощью TTS и сохранение во временный файл
147
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_tts_output:
148
  temp_tts_output_path = temp_tts_output.name
149
+ tts.tts_to_file(
150
+ text=text,
151
+ file_path=temp_tts_output_path,
152
+ speed=speed,
153
+ speaker_wav=temp_denoised_speaker_path,
154
+ language=language_iso
155
+ )
156
 
157
+ # Загрузка сгенерированного аудио
158
+ wav_tensor, sample_rate = torchaudio.load(temp_tts_output_path)
159
+
160
+ # Преобразование в моно, если аудио стерео
161
+ if wav_tensor.dim() > 1 and wav_tensor.size(0) > 1:
162
+ wav_tensor = wav_tensor.mean(dim=0, keepdim=True)
163
+
164
+ # Сохранение сгенерированного аудио во временный файл для voice cloning
165
+ with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_vc_input_file:
166
+ temp_vc_input_path = temp_vc_input_file.name
167
+ torchaudio.save(temp_vc_input_path, wav_tensor.cpu(), sample_rate)
168
+
169
+ # Инициализация модели voice conversion
170
+ tts_conversion = TTS(
171
+ model_name="voice_conversion_models/multilingual/vctk/freevc24",
172
+ progress_bar=False
173
+ )
174
 
175
  # Подготовка временного выходного файла
176
  with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as temp_output_wav_file:
177
  temp_output_wav_path = temp_output_wav_file.name
178
 
179
  # Преобразование голоса
180
+ tts_conversion.voice_conversion_to_file(
181
+ temp_vc_input_path,
182
+ target_wav=temp_denoised_speaker_path,
183
+ file_path=temp_output_wav_path
184
+ )
185
 
186
+ # Чтение преобразованного аудио
187
  output_sample_rate, output_audio_data = read(temp_output_wav_path)
188
 
189
  # Удаление временных файлов
190
+ os.remove(temp_denoised_speaker_path)
191
  os.remove(temp_tts_output_path)
192
+ os.remove(temp_vc_input_path)
193
  os.remove(temp_output_wav_path)
194
 
195
  return (output_sample_rate, output_audio_data)
 
355
  generate,
356
  inputs=[video, audio, checkpoint, no_smooth, resize_factor, pad_top, pad_bottom, pad_left, pad_right, save_as_video],
357
  outputs=result,
 
358
  )
359
 
360
  def launch_gradio():