heybaeheef commited on
Commit
09b0f26
ยท
verified ยท
1 Parent(s): ce41e12

Delete audio_processing/effect_chain.py

Browse files
Files changed (1) hide show
  1. audio_processing/effect_chain.py +0 -296
audio_processing/effect_chain.py DELETED
@@ -1,296 +0,0 @@
1
- """
2
- Effect Chain - DiffVox ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜ธํ™˜ ๋ฒ„์ „
3
- ==========================================
4
- LLM์ด ์ถœ๋ ฅํ•˜๋Š” DiffVox ํ˜•์‹ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Pedalboard ์ดํŽ™ํŠธ๋กœ ๋ณ€ํ™˜
5
- """
6
-
7
- import numpy as np
8
- import soundfile as sf
9
- import torch
10
- from typing import Dict, List, Optional
11
- from pedalboard import (
12
- Pedalboard,
13
- Compressor,
14
- Gain,
15
- HighShelfFilter,
16
- LowShelfFilter,
17
- PeakFilter,
18
- Delay,
19
- Reverb,
20
- Distortion,
21
- Limiter
22
- )
23
-
24
-
25
- class ParameterConverter:
26
- """DiffVox ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Pedalboard ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณ€ํ™˜"""
27
-
28
- def __init__(self, sr: int = 44100):
29
- self.sr = sr
30
-
31
- def sigmoid(self, x: float) -> float:
32
- """Sigmoid ๋ณ€ํ™˜"""
33
- return 1.0 / (1.0 + np.exp(-x))
34
-
35
- def minmax(self, x: float, min_val: float, max_val: float) -> float:
36
- """MinMax ๋ณ€ํ™˜ (sigmoid ๊ธฐ๋ฐ˜)"""
37
- return self.sigmoid(x) * (max_val - min_val) + min_val
38
-
39
- def convert_freq(self, original_value: float, min_freq: float = 20.0) -> float:
40
- """์ฃผํŒŒ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€ํ™˜"""
41
- max_freq = self.sr / 2.0 # Nyquist
42
- return self.minmax(original_value, min_freq, max_freq)
43
-
44
- def convert_q(self, original_value: float) -> float:
45
- """Q ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€ํ™˜"""
46
- return self.minmax(original_value, 0.1, 10.0)
47
-
48
- def convert_params(self, raw_params: Dict[str, float]) -> Dict[str, float]:
49
- """
50
- LLM ์ถœ๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜
51
-
52
- LLM ์ถœ๋ ฅ ์˜ˆ์‹œ:
53
- - eq_peak1.params.gain: -0.35 (์ง์ ‘ dB ๊ฐ’)
54
- - eq_peak1.params.parametrizations.freq.original: -2.57 (๋ณ€ํ™˜ ํ•„์š”)
55
- - eq_peak1.params.parametrizations.Q.original: -4.13 (๋ณ€ํ™˜ ํ•„์š”)
56
- """
57
- converted = {}
58
-
59
- # EQ Peak 1
60
- converted["eq_peak1_freq"] = self._get_freq(raw_params, "eq_peak1")
61
- converted["eq_peak1_gain"] = self._get_gain(raw_params, "eq_peak1")
62
- converted["eq_peak1_q"] = self._get_q(raw_params, "eq_peak1")
63
-
64
- # EQ Peak 2
65
- converted["eq_peak2_freq"] = self._get_freq(raw_params, "eq_peak2")
66
- converted["eq_peak2_gain"] = self._get_gain(raw_params, "eq_peak2")
67
- converted["eq_peak2_q"] = self._get_q(raw_params, "eq_peak2")
68
-
69
- # Low Shelf
70
- converted["eq_lowshelf_freq"] = self._get_freq(raw_params, "eq_lowshelf", default=200.0)
71
- converted["eq_lowshelf_gain"] = self._get_gain(raw_params, "eq_lowshelf")
72
-
73
- # High Shelf
74
- converted["eq_highshelf_freq"] = self._get_freq(raw_params, "eq_highshelf", default=8000.0)
75
- converted["eq_highshelf_gain"] = self._get_gain(raw_params, "eq_highshelf")
76
-
77
- # Distortion
78
- dist_raw = raw_params.get("distortion_amount", 0.0)
79
- # sigmoid(x) * 0.1 ํ˜•ํƒœ์˜€์Œ
80
- converted["distortion"] = max(0, self.sigmoid(dist_raw) * 0.1)
81
-
82
- # Delay
83
- converted["delay_time"] = raw_params.get("delay.delay_time", 0.02)
84
- delay_feedback_raw = raw_params.get("delay.feedback", 0.3)
85
- converted["delay_feedback"] = self.sigmoid(delay_feedback_raw)
86
- delay_mix_raw = raw_params.get("delay.mix", 0.2)
87
- converted["delay_mix"] = self.sigmoid(delay_mix_raw)
88
-
89
- # Final Mix
90
- final_mix_raw = raw_params.get("final_wet_mix", 0.5)
91
- converted["final_wet_mix"] = self.sigmoid(final_mix_raw)
92
-
93
- return converted
94
-
95
- def _get_freq(self, params: Dict, prefix: str, default: float = 1000.0) -> float:
96
- """์ฃผํŒŒ์ˆ˜ ๊ฐ’ ์ถ”์ถœ ๋ฐ ๋ณ€ํ™˜"""
97
- # parametrizations ํ˜•์‹ ํ™•์ธ
98
- key_param = f"{prefix}.params.parametrizations.freq.original"
99
- key_direct = f"{prefix}.params.freq"
100
-
101
- if key_param in params:
102
- return self.convert_freq(params[key_param])
103
- elif key_direct in params:
104
- # ์ด๋ฏธ ๋ณ€ํ™˜๋œ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Œ
105
- val = params[key_direct]
106
- if 20 <= val <= self.sr / 2:
107
- return val
108
- else:
109
- return self.convert_freq(val)
110
- return default
111
-
112
- def _get_gain(self, params: Dict, prefix: str) -> float:
113
- """๊ฒŒ์ธ ๊ฐ’ ์ถ”์ถœ (dB, ๋ณ€ํ™˜ ๋ถˆํ•„์š”)"""
114
- key = f"{prefix}.params.gain"
115
- gain = params.get(key, 0.0)
116
- # ๋ฒ”์œ„ ์ œํ•œ (-12dB ~ +12dB)
117
- return max(-12.0, min(12.0, gain))
118
-
119
- def _get_q(self, params: Dict, prefix: str, default: float = 1.0) -> float:
120
- """Q ๊ฐ’ ์ถ”์ถœ ๋ฐ ๋ณ€ํ™˜"""
121
- key_param = f"{prefix}.params.parametrizations.Q.original"
122
- key_direct = f"{prefix}.params.q"
123
- key_direct2 = f"{prefix}.params.Q"
124
-
125
- if key_param in params:
126
- return self.convert_q(params[key_param])
127
- elif key_direct in params:
128
- val = params[key_direct]
129
- if 0.1 <= val <= 10:
130
- return val
131
- else:
132
- return self.convert_q(val)
133
- elif key_direct2 in params:
134
- val = params[key_direct2]
135
- if 0.1 <= val <= 10:
136
- return val
137
- else:
138
- return self.convert_q(val)
139
- return default
140
-
141
-
142
- class EffectChain:
143
- """DiffVox ํ˜ธํ™˜ ์ดํŽ™ํŠธ ์ฒด์ธ"""
144
-
145
- def __init__(self, sample_rate: int = 44100):
146
- self.sample_rate = sample_rate
147
- self.converter = ParameterConverter(sr=sample_rate)
148
-
149
- self.available_effects = [
150
- "eq_peak1", "eq_peak2",
151
- "eq_lowshelf", "eq_highshelf",
152
- "distortion", "delay", "compressor"
153
- ]
154
-
155
- def get_available_effects(self) -> List[str]:
156
- """์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ดํŽ™ํŠธ ๋ชฉ๋ก"""
157
- return self.available_effects
158
-
159
- def _build_pedalboard(self, params: Dict[str, float]) -> Pedalboard:
160
- """๋ณ€ํ™˜๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ Pedalboard ๊ตฌ์„ฑ"""
161
-
162
- effects = []
163
-
164
- # 1. Compressor (ํ•ญ์ƒ ์ ์šฉ)
165
- effects.append(Compressor(
166
- threshold_db=-18.0,
167
- ratio=2.0,
168
- attack_ms=10.0,
169
- release_ms=100.0
170
- ))
171
-
172
- # 2. EQ Peak 1
173
- gain1 = params["eq_peak1_gain"]
174
- if abs(gain1) > 0.1:
175
- freq1 = params["eq_peak1_freq"]
176
- q1 = params["eq_peak1_q"]
177
- print(f" [EQ Peak 1] freq={freq1:.1f}Hz, gain={gain1:.2f}dB, Q={q1:.2f}")
178
- effects.append(PeakFilter(
179
- cutoff_frequency_hz=max(20, min(20000, freq1)),
180
- gain_db=gain1,
181
- q=max(0.1, min(10, q1))
182
- ))
183
-
184
- # 3. EQ Peak 2
185
- gain2 = params["eq_peak2_gain"]
186
- if abs(gain2) > 0.1:
187
- freq2 = params["eq_peak2_freq"]
188
- q2 = params["eq_peak2_q"]
189
- print(f" [EQ Peak 2] freq={freq2:.1f}Hz, gain={gain2:.2f}dB, Q={q2:.2f}")
190
- effects.append(PeakFilter(
191
- cutoff_frequency_hz=max(20, min(20000, freq2)),
192
- gain_db=gain2,
193
- q=max(0.1, min(10, q2))
194
- ))
195
-
196
- # 4. Low Shelf
197
- gain_low = params["eq_lowshelf_gain"]
198
- if abs(gain_low) > 0.1:
199
- freq_low = params["eq_lowshelf_freq"]
200
- print(f" [Low Shelf] freq={freq_low:.1f}Hz, gain={gain_low:.2f}dB")
201
- effects.append(LowShelfFilter(
202
- cutoff_frequency_hz=max(20, min(2000, freq_low)),
203
- gain_db=gain_low,
204
- q=0.707
205
- ))
206
-
207
- # 5. High Shelf
208
- gain_high = params["eq_highshelf_gain"]
209
- if abs(gain_high) > 0.1:
210
- freq_high = params["eq_highshelf_freq"]
211
- print(f" [High Shelf] freq={freq_high:.1f}Hz, gain={gain_high:.2f}dB")
212
- effects.append(HighShelfFilter(
213
- cutoff_frequency_hz=max(1000, min(20000, freq_high)),
214
- gain_db=gain_high,
215
- q=0.707
216
- ))
217
-
218
- # 6. Distortion
219
- dist = params["distortion"]
220
- if dist > 0.005:
221
- drive_db = dist * 200 # 0.1 โ†’ 20dB
222
- print(f" [Distortion] drive={drive_db:.1f}dB")
223
- effects.append(Distortion(drive_db=min(20, drive_db)))
224
-
225
- # 7. Delay
226
- delay_mix = params["delay_mix"]
227
- if delay_mix > 0.01:
228
- delay_time = params["delay_time"]
229
- delay_feedback = params["delay_feedback"]
230
- print(f" [Delay] time={delay_time:.3f}s, feedback={delay_feedback:.2f}, mix={delay_mix:.2f}")
231
- effects.append(Delay(
232
- delay_seconds=max(0.01, min(1.0, delay_time)),
233
- feedback=max(0.0, min(0.9, delay_feedback)),
234
- mix=max(0.0, min(1.0, delay_mix))
235
- ))
236
-
237
- # 8. Limiter (ํ•ญ์ƒ ๋งˆ์ง€๋ง‰)
238
- effects.append(Limiter(threshold_db=-1.0))
239
-
240
- return Pedalboard(effects)
241
-
242
- def process(
243
- self,
244
- input_path: str,
245
- output_path: str,
246
- parameters: Dict[str, float]
247
- ) -> bool:
248
- """์˜ค๋””์˜ค ํŒŒ์ผ ์ฒ˜๋ฆฌ"""
249
- try:
250
- # 1. ์˜ค๋””์˜ค ๋กœ๋“œ
251
- audio, sr = sf.read(input_path)
252
-
253
- # ๋ชจ๋…ธ/์Šคํ…Œ๋ ˆ์˜ค ์ฒ˜๋ฆฌ
254
- if len(audio.shape) == 1:
255
- audio = audio.reshape(-1, 1)
256
-
257
- # float32๋กœ ๋ณ€ํ™˜
258
- audio = audio.astype(np.float32)
259
-
260
- # 2. ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€ํ™˜
261
- print(f"\n [EffectChain] ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€ํ™˜ ์ค‘...")
262
- converted_params = self.converter.convert_params(parameters)
263
-
264
- print(f" [EffectChain] ๋ณ€ํ™˜๋œ ํŒŒ๋ผ๋ฏธํ„ฐ:")
265
- for key, value in converted_params.items():
266
- print(f" {key}: {value:.4f}")
267
-
268
- # 3. Pedalboard ๊ตฌ์„ฑ
269
- print(f"\n [EffectChain] ์ดํŽ™ํŠธ ์ฒด์ธ ๊ตฌ์„ฑ ์ค‘...")
270
- board = self._build_pedalboard(converted_params)
271
-
272
- # 4. ์ดํŽ™ํŠธ ์ ์šฉ
273
- processed = board(audio, sr)
274
-
275
- # 5. Wet/Dry ๋ฏน์Šค
276
- wet_mix = converted_params["final_wet_mix"]
277
- print(f" [Mix] wet={wet_mix:.2f}, dry={1-wet_mix:.2f}")
278
-
279
- # ๊ธธ์ด ๋งž์ถ”๊ธฐ
280
- min_len = min(len(audio), len(processed))
281
- output = audio[:min_len] * (1 - wet_mix) + processed[:min_len] * wet_mix
282
-
283
- # ํด๋ฆฌํ•‘ ๋ฐฉ์ง€
284
- output = np.clip(output, -1.0, 1.0)
285
-
286
- # 6. ์ €์žฅ
287
- sf.write(output_path, output, sr)
288
-
289
- print(f"\n [EffectChain] โœ… ์ฒ˜๋ฆฌ ์™„๋ฃŒ: {output_path}")
290
- return True
291
-
292
- except Exception as e:
293
- print(f" [EffectChain] โŒ ์ฒ˜๋ฆฌ ์‹คํŒจ: {e}")
294
- import traceback
295
- traceback.print_exc()
296
- raise e