Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
@@ -1,37 +1,129 @@
|
|
1 |
-
import torch
|
2 |
-
import
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
@spaces.GPU
|
18 |
-
def
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
out = gr.Image(label="Generated image", interactive=False)
|
36 |
-
btn.click(generate,inputs=prompt,outputs=out)
|
37 |
-
demo.queue().launch()
|
|
|
1 |
+
import torch as T
|
2 |
+
import torch.nn as nn
|
3 |
+
import torch.nn.functional as F
|
4 |
+
import torchaudio
|
5 |
+
from utils import load_ckpt, print_colored
|
6 |
+
from tokenizer import make_tokenizer
|
7 |
+
from model import get_hertz_dev_config
|
8 |
+
import matplotlib.pyplot as plt
|
9 |
+
|
10 |
+
device = 'cuda' if T.cuda.is_available() else 'cpu'
|
11 |
+
T.cuda.set_device(0)
|
12 |
+
print_colored(f"Using device: {device}", "grey")
|
13 |
+
|
14 |
+
audio_tokenizer = make_tokenizer(device)
|
15 |
+
|
16 |
+
TWO_SPEAKER = False
|
17 |
+
|
18 |
+
model_config = get_hertz_dev_config(is_split=TWO_SPEAKER)
|
19 |
+
|
20 |
+
generator = model_config()
|
21 |
+
generator = generator.eval().to(T.bfloat16).to(device)
|
22 |
+
|
23 |
+
|
24 |
+
|
25 |
+
##############
|
26 |
+
# Load audio
|
27 |
+
|
28 |
+
def load_and_preprocess_audio(audio_path):
|
29 |
+
gr.Info("Loading and preprocessing audio...")
|
30 |
+
# Load audio file
|
31 |
+
audio_tensor, sr = torchaudio.load(audio_path)
|
32 |
+
gr.Info(f"Loaded audio shape: {audio_tensor.shape}")
|
33 |
+
|
34 |
+
if TWO_SPEAKER:
|
35 |
+
if audio_tensor.shape[0] == 1:
|
36 |
+
gr.Info("Converting mono to stereo...")
|
37 |
+
audio_tensor = audio_tensor.repeat(2, 1)
|
38 |
+
gr.Info(f"Stereo audio shape: {audio_tensor.shape}")
|
39 |
+
else:
|
40 |
+
if audio_tensor.shape[0] == 2:
|
41 |
+
gr.Info("Converting stereo to mono...")
|
42 |
+
audio_tensor = audio_tensor.mean(dim=0).unsqueeze(0)
|
43 |
+
gr.Info(f"Mono audio shape: {audio_tensor.shape}")
|
44 |
+
|
45 |
+
# Resample to 16kHz if needed
|
46 |
+
if sr != 16000:
|
47 |
+
gr.Info(f"Resampling from {sr}Hz to 16000Hz...")
|
48 |
+
resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=16000)
|
49 |
+
audio_tensor = resampler(audio_tensor)
|
50 |
+
|
51 |
+
# Clip to 5 minutes if needed
|
52 |
+
max_samples = 16000 * 60 * 5
|
53 |
+
if audio_tensor.shape[1] > max_samples:
|
54 |
+
# gr.Info("Clipping audio to 5 minutes...")
|
55 |
+
raise gr.Erorr("Maximum prompt is 5 minutes")
|
56 |
+
# audio_tensor = audio_tensor[:, :max_samples]
|
57 |
+
|
58 |
+
duration_seconds = audio_tensor.shape[1] / sample_rate
|
59 |
+
|
60 |
+
gr.Info("Audio preprocessing complete!")
|
61 |
+
return audio_tensor.unsqueeze(0), duration_seconds
|
62 |
+
|
63 |
+
##############
|
64 |
+
# Return audio to gradio
|
65 |
+
|
66 |
+
def display_audio(audio_tensor):
|
67 |
+
audio_tensor = audio_tensor.cpu().squeeze()
|
68 |
+
if audio_tensor.ndim == 1:
|
69 |
+
audio_tensor = audio_tensor.unsqueeze(0)
|
70 |
+
audio_tensor = audio_tensor.float()
|
71 |
+
|
72 |
+
# Make a waveform plot
|
73 |
+
# plt.figure(figsize=(4, 1))
|
74 |
+
# plt.plot(audio_tensor.numpy()[0], linewidth=0.5)
|
75 |
+
# plt.axis('off')
|
76 |
+
# plt.show()
|
77 |
+
|
78 |
+
# Make an audio player
|
79 |
+
return (16000, audio_tensor.numpy())
|
80 |
+
|
81 |
+
def get_completion(encoded_prompt_audio, prompt_len):
|
82 |
+
prompt_len_seconds = prompt_len / 8
|
83 |
+
gr.Info(f"Prompt length: {prompt_len_seconds:.2f}s")
|
84 |
+
with T.autocast(device_type='cuda', dtype=T.bfloat16):
|
85 |
+
completed_audio_batch = generator.completion(
|
86 |
+
encoded_prompt_audio,
|
87 |
+
temps=(.8, (0.5, 0.1)), # (token_temp, (categorical_temp, gaussian_temp))
|
88 |
+
use_cache=True)
|
89 |
+
|
90 |
+
completed_audio = completed_audio_batch
|
91 |
+
print_colored(f"Decoding completion...", "blue")
|
92 |
+
if TWO_SPEAKER:
|
93 |
+
decoded_completion_ch1 = audio_tokenizer.data_from_latent(completed_audio[:, :, :32].bfloat16())
|
94 |
+
decoded_completion_ch2 = audio_tokenizer.data_from_latent(completed_audio[:, :, 32:].bfloat16())
|
95 |
+
decoded_completion = T.cat([decoded_completion_ch1, decoded_completion_ch2], dim=0)
|
96 |
+
else:
|
97 |
+
decoded_completion = audio_tokenizer.data_from_latent(completed_audio.bfloat16())
|
98 |
+
gr.Info(f"Decoded completion shape: {decoded_completion.shape}")
|
99 |
+
|
100 |
+
gr.Info("Preparing audio for playback...")
|
101 |
+
|
102 |
+
audio_tensor = decoded_completion.cpu().squeeze()
|
103 |
+
if audio_tensor.ndim == 1:
|
104 |
+
audio_tensor = audio_tensor.unsqueeze(0)
|
105 |
+
audio_tensor = audio_tensor.float()
|
106 |
+
|
107 |
+
if audio_tensor.abs().max() > 1:
|
108 |
+
audio_tensor = audio_tensor / audio_tensor.abs().max()
|
109 |
+
|
110 |
+
return audio_tensor[:, max(prompt_len*2000 - 16000, 0):]
|
111 |
|
112 |
@spaces.GPU
|
113 |
+
def run(audio_path):
|
114 |
+
prompt_audio, prompt_len_seconds = load_and_preprocess_audio(audio_path)
|
115 |
+
prompt_len = prompt_len_seconds * 8
|
116 |
+
gr.Info("Encoding prompt...")
|
117 |
+
with T.autocast(device_type='cuda', dtype=T.bfloat16):
|
118 |
+
if TWO_SPEAKER:
|
119 |
+
encoded_prompt_audio_ch1 = audio_tokenizer.latent_from_data(prompt_audio[:, 0:1].to(device))
|
120 |
+
encoded_prompt_audio_ch2 = audio_tokenizer.latent_from_data(prompt_audio[:, 1:2].to(device))
|
121 |
+
encoded_prompt_audio = T.cat([encoded_prompt_audio_ch1, encoded_prompt_audio_ch2], dim=-1)
|
122 |
+
else:
|
123 |
+
encoded_prompt_audio = audio_tokenizer.latent_from_data(prompt_audio.to(device))
|
124 |
+
gr.Info(f"Encoded prompt shape: {encoded_prompt_audio.shape}")
|
125 |
+
gr.Info("Prompt encoded successfully!")
|
126 |
+
# num_completions = 10
|
127 |
+
completion = get_completion(encoded_prompt_audio, prompt_len)
|
128 |
+
return display_audio(completion)
|
129 |
+
|
|
|
|
|
|