owiedotch commited on
Commit
f18f98b
1 Parent(s): d17cb8b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +114 -0
app.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import spaces
3
+ import torch
4
+ import dac
5
+ import numpy as np
6
+ from pydub import AudioSegment
7
+ from audiotools import AudioSignal
8
+ import io
9
+ import soundfile as sf
10
+
11
+ class DACApi:
12
+ def __init__(self, model_type="44khz", model_bitrate="16kbps"):
13
+ self.model_type = model_type
14
+ self.model_bitrate = model_bitrate
15
+ self.model_path = dac.utils.download(model_type, model_bitrate)
16
+ print("Loading DAC model...")
17
+ self.model = dac.DAC.load(self.model_path)
18
+ self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
19
+ self.model.to(self.device)
20
+
21
+ @spaces.GPU
22
+ def encode_audio(self, input_file):
23
+ # Convert MP3 to WAV if necessary
24
+ if input_file.name.lower().endswith('.mp3'):
25
+ print("Converting MP3 to WAV...")
26
+ audio = AudioSegment.from_mp3(input_file.name)
27
+ input_wav = io.BytesIO()
28
+ audio.export(input_wav, format="wav")
29
+ input_wav.seek(0)
30
+ else:
31
+ input_wav = input_file
32
+
33
+ # Load audio signal
34
+ signal = AudioSignal(input_wav)
35
+
36
+ # Compress audio
37
+ print("Compressing audio...")
38
+ compressed = self.model.compress(signal)
39
+
40
+ output = io.BytesIO()
41
+ compressed.save(output)
42
+ output.seek(0)
43
+ return output
44
+
45
+ @spaces.GPU
46
+ def decode_audio(self, input_file):
47
+ # Load compressed audio
48
+ print("Loading compressed audio...")
49
+ compressed = dac.DACFile.load(input_file.name)
50
+
51
+ # Decompress audio
52
+ print("Decompressing audio...")
53
+ decompressed = self.model.decompress(compressed)
54
+
55
+ output = io.BytesIO()
56
+ decompressed.write(output, format='wav')
57
+ output.seek(0)
58
+ return output
59
+
60
+ @spaces.GPU
61
+ def stream_audio(self, input_file):
62
+ # Load compressed audio
63
+ print("Loading compressed audio...")
64
+ compressed = dac.DACFile.load(input_file.name)
65
+
66
+ # Decompress audio
67
+ print("Decompressing audio...")
68
+ decompressed = self.model.decompress(compressed)
69
+
70
+ audio_data = decompressed.audio_data.cpu().numpy().squeeze().T
71
+ sample_rate = decompressed.sample_rate
72
+
73
+ return (sample_rate, audio_data)
74
+
75
+ dac_api = DACApi()
76
+
77
+ def encode(audio):
78
+ compressed = dac_api.encode_audio(audio)
79
+ return compressed
80
+
81
+ def decode(audio):
82
+ decompressed = dac_api.decode_audio(audio)
83
+ return decompressed
84
+
85
+ def stream(audio):
86
+ sample_rate, audio_data = dac_api.stream_audio(audio)
87
+ return (sample_rate, audio_data)
88
+
89
+ # Gradio interface
90
+ with gr.Blocks() as demo:
91
+
92
+ with gr.Tab("Encode"):
93
+ with gr.Row():
94
+ input_audio = gr.Audio(type="filepath", label="Input Audio")
95
+ output_file = gr.File(label="Compressed DAC File")
96
+ encode_button = gr.Button("Encode")
97
+ encode_button.click(encode, inputs=[input_audio], outputs=[output_file])
98
+
99
+ with gr.Tab("Decode"):
100
+ with gr.Row():
101
+ input_file = gr.File(label="Compressed DAC File")
102
+ output_audio = gr.Audio(label="Decompressed Audio")
103
+ decode_button = gr.Button("Decode")
104
+ decode_button.click(decode, inputs=[input_file], outputs=[output_audio])
105
+
106
+ with gr.Tab("Stream"):
107
+ with gr.Row():
108
+ stream_input = gr.File(label="Compressed DAC File")
109
+ stream_output = gr.Audio(label="Streamed Audio")
110
+ stream_button = gr.Button("Stream")
111
+ stream_button.click(stream, inputs=[stream_input], outputs=[stream_output])
112
+
113
+ if __name__ == "__main__":
114
+ demo.launch()