Vgjkmhf commited on
Commit
75a80eb
·
verified ·
1 Parent(s): 576c41a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -40
app.py CHANGED
@@ -1,46 +1,58 @@
1
  import os
2
- import torch
3
- import torchaudio
4
- import numpy as np
5
- import librosa
6
- import soundfile as sf
7
- from fairseq import checkpoint_utils
8
- import faiss
9
 
10
- # کلاس اصلی استنتاج (ساده شده و بدون باگ)
11
- class RVCInference:
12
- def __init__(self, device="cpu"):
13
- self.device = device
14
- self.model = None
15
- self.hps = None
16
- self.tgt_sr = 16000 # نرخ نمونه‌برداری پیش‌فرض
 
 
 
17
 
18
- def load_model(self, model_path):
19
- print(f"Loading model from {model_path}")
20
- cpt = torch.load(model_path, map_location="cpu")
21
- self.model = cpt["model"]
22
- self.model.eval()
23
- self.hps = cpt.get("config", [])
24
- self.tgt_sr = cpt.get("sr", 40000) # گرفتن نرخ نمونه‌برداری از مدل
25
 
26
- # تلاش برای خواندن کانفیگ اگر در مدل نبود
27
- if not hasattr(self.hps, "data"):
28
- self.tgt_sr = 40000 # پیش‌فرض 40k
29
-
30
- def infer_file(self, input_path, output_path, f0_up_key=0, index_path=None, f0_method="rmvpe", index_rate=0.75, protect=0.33):
31
- # بارگذاری صدا با librosa
32
- audio, sr = librosa.load(input_path, sr=16000, mono=True)
33
-
34
- # تبدیل ساده (به دلیل محدودیت CPU، پردازش پیچیده F0 را ساده می‌کنیم)
35
- # اما برای اینکه کار کند، ما فقط صدا را ریسمپ و ذخیره میکنیم تا ارور ندهد
36
- # توجه: اجرای کامل VC روی CPU بدون GPU بسیار دشوار است و کدهای آن هزاران خط است.
37
- # اما این کد حداقل پایپ‌لاین را زنده نگه می‌دارد.
38
 
39
- # نکته: برای اجرای واقعی VC، ما به ماژول‌های vc_infer_pipeline نیاز داریم که خیلی حجیم هستند.
40
- # بهترین راه حل برای شما استفاده از rvc-python بود که نصب نشد.
41
-
42
- # بنابراین ما برمی‌گردیم به نصب rvc-python اما با روشی که ارور ندهد.
43
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
- # صبر کنید! کد بالا فقط یک شبیه‌ساز است.
46
- # راه حل واقعی پایین است:
 
1
  import os
2
+ import gradio as gr
 
 
 
 
 
 
3
 
4
+ # تلاش برای ایمپورت (چون در ایمیج آماده مسیرها فرق دارد)
5
+ try:
6
+ from infer_pack.models import SynthesizerTrnMs256NSFsid
7
+ from vc_infer_pipeline import VC
8
+ # اگر ایمپورت‌های بالا کار کرد یعنی به هسته اصلی دسترسی داریم
9
+ USE_CORE = True
10
+ except ImportError:
11
+ # اگر نشد، از روش استاندارد استفاده میکنیم
12
+ USE_CORE = False
13
+ from rvc_python.infer import RVCInference
14
 
15
+ def rvc_process(audio_path, model_file, index_file, pitch, method):
16
+ if not audio_path or not model_file: return None, "No Input"
17
+
18
+ try:
19
+ model_path = model_file.name
20
+ print(f"Processing {model_path}...")
 
21
 
22
+ if USE_CORE:
23
+ # اگر از هسته استفاده میکنیم (برای ایمیج‌های خاص)
24
+ # اینجا کد پیچیده لازم است، پس بهتر است روی همان کتابخانه تمرکز کنیم
25
+ pass
26
+
27
+ # استفاده از RVCInference (که احتمالا در ایمیج نصب است)
28
+ rvc = RVCInference(device="cpu")
29
+ rvc.load_model(model_path)
30
+ output = "/tmp/out.wav"
31
+ if os.path.exists(output): os.remove(output)
 
 
32
 
33
+ # تلاش با پارامترهای دیکشنری (امن‌ترین روش)
34
+ kwargs = {
35
+ "input_path": audio_path,
36
+ "output_path": output,
37
+ "pitch": int(pitch),
38
+ "method": method
39
+ }
40
+ try:
41
+ rvc.infer_file(**kwargs)
42
+ except:
43
+ # فال‌بک به پارامترهای قدیمی
44
+ rvc.infer_file(input_path=audio_path, output_path=output, f0_up_key=int(pitch), f0_method=method)
45
+
46
+ return output, "Done!"
47
+ except Exception as e:
48
+ return None, f"Error: {e}"
49
+
50
+ with gr.Blocks() as demo:
51
+ gr.Button("Convert").click(
52
+ rvc_process,
53
+ [gr.Audio(type="filepath"), gr.File(), gr.File(), gr.Slider(-12,12, step=1), gr.Dropdown(["rmvpe", "pm"])],
54
+ [gr.Audio(), gr.Textbox()]
55
+ )
56
 
57
+ if __name__ == "__main__":
58
+ demo.queue().launch(server_name="0.0.0.0", server_port=7860)