همهٔ مقاله‌ها

· Casimiro Ferreira· 5 دقیقه مطالعه

درست ادا کردن: ابهام‌زدایی از هم‌نویسه‌های ناهم‌آوای پرتغالی برای TTS

  • Datasets
  • Portuguese
  • TTS
  • Grapheme-to-Phoneme
  • NLP
  • Accessibility
  • FOSS

درست ادا کردن: ابهام‌زدایی از هم‌نویسه‌های ناهم‌آوای پرتغالی برای TTS

وقتی یک صدای تبدیل متن به گفتار عبارت “Tenho sede” را می‌خواند، یک شنونده پرتغالی انتظار دارد معنای تشنگی (thirst) را بشنود. اما دقیقاً همان املا، sede، می‌تواند به معنای ستاد مرکزی (headquarters) هم باشد — و این دو با واکه‌های متفاوتی تلفظ می‌شوند. آن را با واکه اشتباه بگویید و صدا نه‌تنها ناجور به گوش می‌رسد، بلکه واژه‌ای متفاوت را با صدای بلند ادا می‌کند. برای کسی که برای خواندن صفحه به TTS تکیه می‌کند، این همان مرز میان قابل‌فهم و گیج‌کننده است.

این یک مسئله front-end است — همان مرحله grapheme-to-phoneme که تصمیم می‌گیرد یک واژه به چه صداهایی نگاشت می‌شود، مدت‌ها پیش از آنکه هر vocoder عصبی آن صداها را به صوت تبدیل کند. هیچ میزان کیفیت vocoder این را حل نمی‌کند. اگر front-end تلفظ اشتباه را برگزیند، صدا واژه اشتباه را به‌روشنی ادا می‌کند.

هم‌نویسه‌های ناهم‌آوا: املای یکسان، صدای متفاوت، معنای متفاوت

پرتغالی اروپایی پر است از واژه‌هایی که یکسان نوشته می‌شوند اما با کیفیت واکه‌ای متفاوت تلفظ می‌شوند — یک واکه باز در برابر یک واکه بسته — که در آن انتخاب درست به معنا بستگی دارد، نه صرفاً به دستور زبان. چند نمونه:

  • sedeتشنگی (thirst) (e بسته، ˈsedɨ) در برابر ستاد مرکزی/مقر (headquarters/seat) (e باز، ˈsɛdɨ). هر دو اسم هستند.
  • formaقالب / ظرف پخت (mould / baking tin) (o بسته، ˈfoɾmɐ، نوشته‌شده به‌صورت fôrma) در برابر شکل / شیوه (shape / way) (o باز، ˈfɔɾmɐ).
  • molhoسس (sauce) (o بسته) در برابر دسته/بافه (bundle) (o باز).
  • corteدربار سلطنتی (royal court) (o بسته) در برابر یک برش (a cut) (o باز).

یک سیستم TTS ساده‌انگارانه به ازای هر املا به یک تلفظ واحد پایبند می‌شود. بنابراین تشنگی را با واکه ستاد مرکزی می‌خواند — هر بار — و شنونده واژه اشتباه را می‌شنود.

چرا “کافی است نقش دستوری واژه را برچسب بزنیم” کارساز نیست

راه‌حل بدیهی این است که یک برچسب‌گذار نقش دستوری (POS) روی جمله اجرا کنیم و تلفظ را بر پایه POS برگزینیم. این برای برخی جفت‌ها کمک می‌کند، اما به‌طور ساختاری هرگاه دو معنا نقش دستوری یکسانی داشته باشند شکست می‌خورد.

دوباره sede را در نظر بگیرید. تشنگی و ستاد مرکزی هر دو اسم‌اند. یک برچسب‌گذار POS آن‌ها را یکسان برچسب می‌زند — هیچ نشانه دستوری برای تمایز آن‌ها وجود ندارد — پس تنها می‌تواند رایج‌ترین خوانش را حدس بزند. ما دقیقاً همین را اندازه گرفتیم: روی مجموعه آزمون ما، هم spaCy و هم Stanza روی معنای تشنگی از sede نمره ۰٪ می‌گیرند. آن‌ها همیشه ستاد مرکزی را برمی‌گزینند. همین سقف ساختاری در corte (برش در برابر دربار)، forma (قالب در برابر شکل) و molho (سس در برابر بافه) هم پدیدار می‌شود: وقتی معنا درون یک نقش دستوری واحد شکاف می‌خورد، دستور زبان نمی‌تواند آن را ببیند.

مجموعه‌داده: برچسب‌زدن معنا، نه دستور زبان

پس ما یک مجموعه‌داده باز ساختیم که همان چیزی را برچسب می‌زند که واقعاً اهمیت دارد — معنا. bifonia-pt-homographs شامل ۵۶٬۸۹۱ جمله پرتغالی اروپایی است که ۲۷ هم‌نویسه ناهم‌آوا را پوشش می‌دهد. هر جمله با واژه، معنای آن (مفهوم)، نقش دستوری‌اش، تلفظ IPA آن، و یک صورت بازسازی‌شده با نشانه‌های تشدید/زیرنویسه (برای نمونه sêde در برابر séde) برچسب خورده است که خوانش موردنظر را روی کاغذ بدون ابهام می‌سازد.

کلید دسته‌بندی، معناست — و کل هدف همین است. یک رکورد واحد چنین است:

{
  "word": "sede",
  "sense": "thirst",
  "pos": "NOUN",
  "ipa": "ˈsedɨ",
  "sentence": "Depois da corrida tinha tanta sede que bebi um litro de água."
}

تلفظ‌ها به‌جای حدس‌زدن، در برابر فرهنگ‌لغت infopédia (Porto Editora) راستی‌آزمایی شدند، و تقسیم‌های train/test بر پایه (word, meaning) طبقه‌بندی شده‌اند تا یک مدل پایین‌دستی — مثلاً یک BiLSTM — هر مفهوم را در هر دو نیمه ببیند. این مجموعه روی Hugging Face با نام TigreGotico/bifonia-pt-homographs منتشر شده است.

تا چه اندازه می‌توان آن را حل کرد؟

با داده‌های برچسب‌خورده بر پایه معنا، توانستیم اندازه بگیریم که رویکردهای مختلف در انتخاب معنای درست — و در نتیجه تلفظ درست — چه عملکردی دارند:

رویکرددقت
همیشه رایج‌ترین مفهوم را حدس بزن≈۵۳٪
POS از spaCy ← معنا≈۶۶٪
POS از Stanza ← معنا≈۷۵٪
قاعده bifonia + حل‌کننده معنا≈۹۴٪

رویکردهای مبتنی بر POS دقیقاً جایی که انتظارش را دارید متوقف می‌شوند: می‌توانند بر پایه دستور زبان مسیریابی کنند اما هرگز بر پایه معنا، پس شکاف‌های درون یک اسم واحد از دسترس خارج می‌مانند. حل‌کننده ما — کتابخانه bifonia، سبک و کاملاً بدون وابستگی — به ≈۹۴٪ می‌رسد و از همه مهم‌تر در مورد sede/تشنگی که برچسب‌گذارهای POS در آن ۰٪ می‌گیرند، به ۱۰۰٪ می‌رسد.

نکته اصلی فقط عدد نیست. این است که یک مؤلفه کوچک، سریع و کاملاً باز، برچسب‌گذارهای عصبی سنگین POS را در این وظیفه شکست می‌دهد — چون معنا را حل می‌کند، نه صرفاً دستور زبان را. بدون GPU، بدون دانلود مدل، بدون هیچ فراخوانی شبکه.

چرا اهمیت دارد

تلفظ درست بنیادین است، نه آرایشی. صفحه‌خوان‌ها و دستیارهای صوتی همان راهی هستند که کاربران نابینا و صرفاً-صوتی از طریق آن جهان را می‌خوانند، و یک front-end که واژه‌های رایج را نادرست تلفظ می‌کند، بی‌سروصدا هر جمله‌ای را که لمس می‌کند تنزل می‌دهد. رفع ابهام‌زدایی از ناهم‌آواها در سرچشمه به این معناست که صدا همان چیزی را می‌گوید که متن معنا می‌دهد.

چون مجموعه‌داده باز است و حل‌کننده کوچک و قابل‌fork، هر کسی که یک front-end برای TTS پرتغالی می‌سازد می‌تواند بدون یک مدل غول‌آسا این را درست انجام دهد — و همین رویکرد به‌تمیزی به یک زبان خویشاوند مانند Galician منتقل می‌شود، جایی که تمایز واکه باز/بسته همان دام را می‌سازد. داده‌های برچسب‌خورده کارکردی دوگانه هم دارند: دقیقاً همان چیزی هستند که برای آموزش مدل‌های آماری فشرده — مانند یک دسته‌بند به‌ازای هر واژه — لازم است، برای تیم‌هایی که پیکره را دارند و می‌خواهند در کنار حل‌کننده مبتنی بر قاعده، یک حل‌کننده یادگرفته‌شده هم داشته باشند.

امتحانش کنید

مجموعه‌داده روی Hugging Face در TigreGotico/bifonia-pt-homographs قرار دارد، و حل‌کننده در bifonia زندگی می‌کند. این کار در دل کار گسترده‌تر آواشناسی پرتغالی جای می‌گیرد که پشت NLP کلاسیک برای پرتغالی و پشته grapheme-to-IPA برای بیش از ۳۵۰ زبان قرار دارد — قطعه‌های کوچک و قطعی که یک صدا را وادار می‌کنند زبانی را همان‌گونه تلفظ کند که گویشورانش واقعاً آن را ادا می‌کنند.