Spaces:
Running
اجرا روی لوکال
داداش من اینو هرکاری میکنم روی لوکال نمیتونم ازش اجرا بگیرم همش میگه فونم های تولید شده توی توکن ها نیستشون.
اگر اینطور باشه نباید واسه شما هم جواب میداد.
نمیدونم کجای کارم میلنگه. شما پیشنهادی نداری؟
سلام
@aminahmadi0101
امتحان کردی که کل اسپیس رو با تمام محتواش دانلود کنی و بعد فایل اصلی رو ران کنی با گرادیو؟
آره اونو اول از همه امتحان کردم و نشد:
File "D:\20\work\book_reader_glasses\TTS\CuhyTTS\app.py", line 27, in tts
(sr, audio), _ = tts_interface(voice_id, text.strip(), '')
^^^^^^^^^^^
TypeError: cannot unpack non-iterable NoneType object
اینم بگم که در مرحله ی اول کد اجرا میشه و حتی url هم بم میده:
- Running on local URL: http://127.0.0.1:7860
اما وقتی متن رو میدم که به صوت تبدیلش کنه خطا میده
سلام
به محتوای کد app_utils.py نگاه کن
اسپیس من در واقع نسخه بریده شده و کوتاه شده این اسپیس هست
https://huggingface.co/spaces/karim23657/Persian-TTS-sherpa
و بعلاوه اینکه اسپیس من از گرادیو هم استفاده میکنه
این اروری که شما گرفتی یعنی مدل تولید صدا هیچ خروجی کلا نداده پس به نظر من صد درصد اگه خودت پیش نیاز هارو درست نصب کردی (چون اسپیس ها از لینوکس استفاده میکنن و شما ممکنه با ویندوز باشی، بنابرین برای پیش نیاز ها تنظیمات اضافی نیاز هست)، یعنی یه فایلی درست دانلود نمیشه یام بهش دسترسی نداره
همچنین، از دکمه run locally داخل هاگینگ فیس کمک گرفتی؟
اتفاقا از طریق پروژه karim23657/Persian-TTS-sherpa من پروژه ی شمارو پیدا کردم.
پروژه ی شما رو برای پیاده سازی انتخاب کردم چون فقط یه این مدل احتیاج داشتم به این خاطر که دقت این مدل از بقیه بیشتر بود.
جالبه که مدل vits-piper-fa-ganji.onnx اینجا حمشو 63.5 زده ولی وقتی دانلود میشه حجمش 60.5 هست و من یک مقدار به این قضیه هم مشکوکم.
و بله روی ویندوز هستم.
در پاسخ به سوال آخرتون هم باید بگم که run locally هم کمکی نکرد.
من مدل vits-piper-fa-ganji.onnx و tokens.txt رو دانلود کردم وبه کمک چت جی پی تی به یک اسکریپت برای استفاده از این مدل برای تولید ویس رسیدم.
اسکریپت رو اینجا برات میفرستم:
import os
import uuid
import subprocess
import numpy as np
import soundfile as sf
import sherpa_onnx
مسیر مدل
MODEL_DIR = r"D:/20/work/TTS/bestvoice"
MODEL_PATH = os.path.join(MODEL_DIR, "vits-piper-fa-ganji.onnx")
TOKENS_PATH = os.path.join(MODEL_DIR, "tokens.txt")
LEXICON_PATH = os.path.join(MODEL_DIR, "lexicon.txt") # میسازیمش
OUTPUT_PATH = os.path.join(MODEL_DIR, f"output_{uuid.uuid4().hex[:6]}.wav")
بررسی
assert os.path.exists(MODEL_PATH), "model.onnx not found"
assert os.path.exists(TOKENS_PATH), "tokens.txt not found"
ورودی
text = input("🗣 لطفاً متن فارسی را وارد کنید:\n> ").strip()
if not text:
print("⛔ متنی وارد نشده.")
exit()
استخراج فونم با espeak-ng از طریق فایل
input_txt_path = os.path.join(MODEL_DIR, "temp_input.txt")
with open(input_txt_path, "w", encoding="utf-8") as f:
f.write(text)
try:
result = subprocess.run(
["espeak-ng", "-v", "fa", "-x", "-f", input_txt_path],
capture_output=True,
text=True,
check=True
)
phonemes = result.stdout.strip()
if not phonemes:
raise Exception("خروجی espeak-ng خالی بود.")
print(f"🔡 فونم استخراجشده:\n{phonemes}")
except Exception as e:
print(f"⛔ خطا در اجرای espeak-ng:\n{e}")
exit()
finally:
if os.path.exists(input_txt_path):
os.remove(input_txt_path)
ساخت lexicon موقت
print("📄 ساخت lexicon.txt موقت...")
words = text.strip().split()
phones = phonemes.strip().split()
with open(LEXICON_PATH, "w", encoding="utf-8") as f:
for w, p in zip(words, phones):
f.write(f"{w}\t{p}\n")
پیکربندی مدل
vits_config = sherpa_onnx.OfflineTtsVitsModelConfig(
model=MODEL_PATH,
lexicon=LEXICON_PATH,
tokens=TOKENS_PATH,
data_dir="",
dict_dir="",
noise_scale=0.667,
noise_scale_w=0.8,
length_scale=1.0
)
config = sherpa_onnx.OfflineTtsConfig(
model=sherpa_onnx.OfflineTtsModelConfig(vits=vits_config),
max_num_sentences=2
)
tts = sherpa_onnx.OfflineTts(config)
print("🔊 در حال تولید صوت...")
audio_data = tts.generate(text)
samples = np.array(audio_data.samples, dtype=np.float32)
if np.any(samples):
samples /= np.abs(samples).max()
sf.write(OUTPUT_PATH, samples, audio_data.sample_rate, subtype="PCM_16")
print(f"\n✅ فایل صوتی ذخیره شد:\n{OUTPUT_PATH}")
️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣️⃣
در نهایت با اینکه این اسکریپت خیلی عالی به نظر کار میکرد اما به یه ارور خورد:
PS D:\20\work\TTS\bestvoice> python ttsrun.py
🗣 لطفاً متن فارسی را وارد کنید:
یک روز زیبا
🔡 فونم استخراجشده:
j'ek R'u:z zib'A
📄 ساخت lexicon.txt موقت...
🔊 در حال تولید صوت...
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ی. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ک. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ╪▒. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV و. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ╪▓. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ╪▓. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ی. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ب. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx\csrc\lexicon.cc:ConvertTextToTokenIdsNotChinese:317 OOV ا. Ignore it!
C:\a\sherpa-onnx\sherpa-onnx\sherpa-onnx/csrc/offline-tts-vits-impl.h:Generate:214 Failed to convert یک روز زیبا to token IDs
Traceback (most recent call last):
File "D:\20\work\TTS\bestvoice\ttsrun.py", line 81, in
sf.write(OUTPUT_PATH, samples, audio_data.sample_rate, subtype="PCM_16")
File "E:\python-installation-folder\Lib\site-packages\soundfile.py", line 363, in write
with SoundFile(file, 'w', samplerate, channels,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\python-installation-folder\Lib\site-packages\soundfile.py", line 690, in init
self._file = self._open(file, mode_int, closefd)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\python-installation-folder\Lib\site-packages\soundfile.py", line 1265, in _open
raise LibsndfileError(err, prefix="Error opening {0!r}: ".format(self.name))
soundfile.LibsndfileError: Error opening 'D:/20/work/TTS/bestvoice\output_fcc6b9.wav': Internal error : SF_INFO struct incomplete.
سلام
@aminahmadi0101
ببخشید من چند روز خیلی یهو گیرم نمیتونم برم پای سیستم که مشکل رو برسی کنم
لطفا اگه تلگرام داری برو توی این گروه و اونجا ممکنه کسایی باشن که داوطلبانه بهت جواب بدن خیلی از من بهتر
https://t.me/persian_tts_chat
متشکرم