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