Spaces:
Running
Running
File size: 3,273 Bytes
4d751e5 a51ab70 4d751e5 a51ab70 8635c9e a51ab70 4d751e5 a51ab70 4d751e5 a51ab70 4d751e5 a51ab70 4d751e5 a51ab70 4d751e5 a51ab70 4d751e5 a51ab70 617fd8f a51ab70 617fd8f a51ab70 |
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 |
import torchaudio
import soundfile as sf
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 Гц")
# Применение модели для разделения
tracks = apply_model('htdemucs', mixture, device='cpu')
# Извлечение вокала и музыкального трека
vocal_track = tracks['vocals'].numpy()
music_track = (tracks['drums'] + tracks['bass'] + tracks['other']).numpy()
# Сохранение музыкального трека
if num_channels == 1:
music_track = music_track[0] # Преобразование в моно
sf.write('music_track.wav', music_track, 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 + music_track_loaded
# Сохранение финальной песни
sf.write('final_song.wav', final_song, sr)
return 'final_song.wav'
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() |