Spaces:
Running
Running
| import gradio as gr | |
| import torchaudio | |
| import soundfile as sf | |
| from demucs.pretrained import get_model | |
| from demucs.apply import apply_model | |
| import numpy as np | |
| import subprocess | |
| def process(voice_file_path, song_file_path): | |
| # Загрузка файла песни | |
| mixture, sr = torchaudio.load(song_file_path) | |
| num_channels = mixture.size(0) | |
| # Проверка частоты дискретизации | |
| if sr != 44100: | |
| raise ValueError("Частота дискретизации должна быть 44100 Гц") | |
| # Загрузка модели Demucs | |
| model = get_model('htdemucs') | |
| # Применение модели для разделения | |
| tracks = apply_model(model, mixture, device='cpu') | |
| # Извлечение вокала и музыкального трека | |
| vocal_track = tracks[2].numpy() # вокал обычно третий по порядку в htdemucs | |
| music_track = (tracks[0] + tracks[1] + tracks[3]).numpy() # drums + bass + other | |
| # Сохранение музыкального трека | |
| if num_channels == 1: | |
| music_track = music_track[0] # Преобразование в моно | |
| sf.write('music_track.wav', music_track.T, sr) | |
| # Подготовка вокала для SEED-VC: преобразование в моно, если стерео | |
| if vocal_track.shape[0] == 2: | |
| vocal_mono = np.mean(vocal_track, axis=0) | |
| sf.write('vocal_track_mono.wav', vocal_mono, sr) | |
| source_path = 'vocal_track_mono.wav' | |
| else: | |
| vocal_mono = vocal_track[0] # Уже моно | |
| sf.write('vocal_track_mono.wav', vocal_mono, sr) | |
| source_path = 'vocal_track_mono.wav' | |
| # Запуск SEED-VC для конверсии голоса | |
| subprocess.run([ | |
| 'python', 'seed-vc/inference.py', | |
| '--source', source_path, | |
| '--target', voice_file_path, | |
| '--output', 'converted_vocal', | |
| '--checkpoint', 'seed-uvit-whisper-base' | |
| ]) | |
| # Загрузка преобразованного вокала (моно) | |
| converted_vocal, sr_vocal = sf.read('converted_vocal/output.wav') | |
| # Проверка соответствия частот дискретизации | |
| if sr_vocal != sr: | |
| raise ValueError("Частоты дискретизации не совпадают") | |
| # Если музыкальный трек стерео, преобразовать вокал в стерео | |
| if num_channels == 2: | |
| converted_vocal_stereo = np.array([converted_vocal, converted_vocal]) | |
| else: | |
| converted_vocal_stereo = converted_vocal | |
| # Загрузка музыкального трека | |
| music_track_loaded, _ = sf.read('music_track.wav') | |
| # Объединение вокала и музыки | |
| final_song = converted_vocal_stereo.T + music_track_loaded | |
| # Сохранение финальной песни | |
| sf.write('final_song.wav', final_song, sr) | |
| return 'final_song.wav' | |
| # Создание интерфейса Gradio | |
| with gr.Blocks() as demo: | |
| voice_input = gr.File(label="Загрузите запись вашего голоса") | |
| song_input = gr.File(label="Загрузите песню для модификации") | |
| output = gr.File(label="Финальная песня") | |
| process_button = gr.Button("Обработать") | |
| process_button.click(fn=process, inputs=[voice_input, song_input], outputs=output) | |
| if __name__ == "__main__": | |
| demo.launch() |