چالش‌های طراحی سیستم تبدیل «متن به گفتار»

مدت زیادی میشه که دنبال این هستم که یک «دستیار صوتی هوشمند» بسازم. چند بار این تلاش رو کردم. یک بار کاملا Hard coded و یک بار با کمک کمی هوش مصنوعی. این بار، تصمیم گرفتم جای استفاده از سیستم متن به گفتاری که در سیستم‌عامل وجود داره، این سیستم هم خودم طراحی کنم. در این پست ویرگولی، میخوام در مورد این که این ایده چطور به ذهنم رسید و این که چه چالش‌هایی داشتم صحبت کنم و در نهایت راه‌حلی که خودم رفتم رو بگم. پس، کمربندها رو ببندید!اول از همه بیایم ببینیم چی نیاز داشتم؟! سیستمی که بتونه متنی از ورودی گرفته و اون رو بخونه. بتونه زبان فارسی رو تا حد خوبی بدون مشکل بخونه و حس رباتی نده. صدا، صدای دلخواه باشه و نه صداهای پیش‌ساخته در سیستم‌عامل (به علت محدود بودن صداها در تمامی سیستم‌های عامل). هروقت خواستم بتونم زبان‌ها و صداهای مختلف رو بهش اضافه کنم.و خب، اول از همه سراغ دیتاست صداهای موزیلا رفتم. اما اونجا، بیش از این که روی «متن به گفتار» تاکید و تمرکز باشه روی «گفتار به متن» تاکید و تمرکز بود و طبیعی هم هست. اون رو نگه داشتم برای خیلی خیلی بعد. فعلا، لازمه که روی متن به گفتار فکر کنم. راه‌حل‌های جالبی به ذهنم رسیدند. در ادامه، یک‌سری از این راه‌حل‌ها رو لیست می‌کنم. در نهایت هم میگم که کدوم راه‌حل، منطقی‌تر و درست‌تر بود. شخصی‌سازی espeak از اون‌جایی که دستیار صوتی من، قراره روی رزبری‌پای ران بشه و روی رزبری هم سیستم‌عامل لینوکس نصب کردم، یکی از ایده‌ها این بود که با espeak بازی کنم و صداهاش رو شخصی کنم. بعد از اون، کافی بود که تو کد بگم که با espeak بخونه و صداهایی که خودم طراحی کردم.در این میان، با کتابخونه‌ای به اسم MBROLA آشنا شدم که برای بهبود تلفظ و گفتگو در espeak استفاده میشه و از قضا زبان فارسی هم پشتیبانی می‌کنه. فکر کنم برای این موضوع، صدها خط کد نوشتم که این دو رو پیوند بزنه و صدای قابل قبولی هم خروجی داد. متاسفانه وقتی که از صدای طراحی شده در لایبرری PyTTSX3 استفاده کردم، دیدم که فقط از espeak استفاده می‌کنه و کلا mbrola رو ندید می‌گیره. این گزینه، به طور کل برای من رفت کنار. در این بین البته گشتم ببینم آیا سیستم دیگری داریم که متن رو به گفتار تبدیل کنه و خب چندتا پیدا کردم که متاسفانه پشتیبانی خوبی از فارسی نداشتند. همچنین، ابزار و روشی برای اضافه کردن صدای دلخواه ارائه نکرده بودند، پس به سراغ روش دوم رفتم. استفاده از هوش مصنوعیاین روش روش مورد علاقه خودم بود، با این که ازش استفاده‌ای نکردم. چرا؟ در این روش یک شبکه عصبی میاد و از نمونه داده‌ها نمونه می‌گیره و سعی می‌کنه با اون نقشه‌ای که از صامت‌ها و مصوت‌ها (در واقع این بخش میره تو حوزه واج‌شناسی و آواشناسی که خب بعدا در موردش مفصل خواهم نوشت) بهش دادیم؛ شروع می‌کنه به ساخت صدای جدید. ابزارهای کمی هم براش ارائه نشده، در واقع چیزی که زیاده ابزار برای ساخت متن به گفتار با یادگیری ماشین و ... . اما یک مشکل بزرگی اینجا بود. هیچ کدوم از ابزارها و مدلها و ...؛ از حد آزمایشگاهی بیرون نرفته بودند و فقط و فقط در حد و حدود خاصی می‌شد باهاشون کار کرد. خب می‌دونم که الان باد تو غبغب انداختید که بگید «مهندس خب خودت درستش می‌کردی». حقیقتا این قصد رو داشتم ولی حجم کدهاشون به قدری بالا بود که نمی‌شد به چشم پروژه شخصی نگاهش کرد و باید تیمی روش کار کرد :)) و اما، آخرین راه حل :)آخرین راه‌حلی که به ذهنم رسید، راه حل قشنگی نبود ولی راه‌حل سریعی بود. شاید اگر پروژه جدی‌ای می‌شد یکی می‌اومد می‌گفت «بدهی فنی» داره ایجاد میشه اما نه! صبر کنید. قضیه بیشتر جالب میشه الان. اول با خودم فکر کردم خب ما در زبان چه واحدی داریم که واقعا مهمه؟ وقتی از واج فراتر بریم، کلمه رو داریم. درسته؟ خب چرا بر اساس کلمات نه؟ مشکل سیستم‌های متن به گفتار همینه که با چسبوندن آواها و واج‌ها به هم سعی می‌کنند کلمات رو بسازند. پس بهتره بریم روی سطح کلمه شروع به کار کنیم. موقعی که خیلی ناامید شده بودم از پروژه، چندین کلمه ضبط کردم و سپس با یه اسکریپت ساده پایتون، به هم چسبوندمشون. بعدش چه کردم؟ یه فایل csv ساختم که در اون، هر کلمه به فایلش مپ شده بود. در نهایت اسکریپتی نوشتم که متن رو می‌گیره، اون رو می‌بره تو آشپزخونه خودش؛ فایلا رو می‌چسبونه به هم، جمله رو می‌پزه و پخش می‌کنه. روشی که استفاده کردم واقعا روش بی‌مشکلی نیست. اما در حال حاضر، بهترین روشیه که به ذهنم میرسه. فقط موضوع، داده‌های ورودی و حجم فایل‌های صوتیه که برای اون هم باید فکری کنم. در این مطلب در مورد تبدیل متن به گفتار نوشتم، اما جالبه که روزی که این کد رو زدم روز خیلی خوبی برام بود. چون دقیقا همون شب، ۳-۴ تا از دوستانم داوطلب شدند که صدا ضبط کنن. این به این معناست که به زودی یک سیستم متن به گفتار بسیار خوبی رو عرضه خواهم کرد!در نهایت هم ازتون تشکر می‌کنم که وقت گذاشتید و این مطلب رو خوندید. راستی، اگر شما دستیار صوتی بودید، چه کارایی می‌کردید؟