مرزهای هجا، جایگاه تکیه و نگاشت املا به صدا در پرتغالی از قواعدی پیروی میکنند که زبانشناسان مدتها پیش از آنکه کسی یک شبکهی عصبی را آموزش دهد مستند کردهاند. وقتی این قواعد صریحاند، ابزار درست یک کتابخانهی کوچک، قطعی و کاملاً آفلاین است که میتوانید آن را بخوانید، ممیزی کنید و هرجا اجرا کنید. این فلسفهی پشت پشتهی NLP کلاسیک پرتغالی ماست: silabificador برای هجابندی و TugaPhone برای گرافم به واج (G2P).
چرا کلاسیک، و چرا اکنون
واجشناسی یکی از حوزههایی است که قواعد قطعی در آن واقعاً میدرخشند. قواعد مرزبندی هجابندی پرتغالی و نظمهای املای آن بهخوبی مستند شدهاند، پس یک موتور قاعدهی دستساز رونویسیهایی تولید میکند که میتوانید خطبهخط بازرسیشان کنید. بدون GPU، بدون دانلود مدل، بدون فراخوانی شبکه. این برای حاکمیت داده اهمیت دارد: یک خطلولهی صوتی لوزوفون نباید مجبور باشد متن خود را به یک API از راه دور بفرستد فقط برای اینکه بفهمد یک واژه چگونه تلفظ میشود. همچنین برای سرعت و اندازه اهمیت دارد — این کتابخانهها از نظر وابستگی سبکاند و روی یک لپتاپ، یک سرور یا یک دستگاه توکار به یک اندازه بهراحتی اجرا میشوند.
silabificador: مرزهای هجا
silabificador یک هجابند سبک پرتغالی است که کاملاً از قواعد دستساز ساخته شده، بدون هیچ وابستگی. رابط آن بههمان اندازه که بهنظر میرسد کوچک است:
from silabificador import syllabify
syllabify("computador")
# ['com', 'pu', 'ta', 'dor']
این کتابخانه بر پایهی دادههای تمیز از Portal da Língua Portuguesa تنظیم و آزموده شد، و روی Portuguese Phonetic Lexicon محک زده شد — یک مجموعهدادهی باز با بیش از ۱۰۰٬۰۰۰ مدخل که از همان منبع برگرفته شده است. قطعهبندی هجا یک گام بنیادی برای تخصیص تکیه، خطتیرهگذاری و رونویسی واجی است، پس درست و سریع انجام دادن آن در همهی لایههای پاییندستی سود میرساند.
TugaPhone: گرافم به واجِ آگاه به گویش
TugaPhone هر متن دلخواه پرتغالی را به IPA تبدیل میکند، و این کار را در سراسر گویشهای عمدهی لوزوفون انجام میدهد: اروپایی (pt-PT)، برزیلی (pt-BR)، آنگولایی (pt-AO)، موزامبیکی (pt-MZ) و تیموری (pt-TL). نکتهی کلیدی اینکه بهجای هموار کردن همه چیز به یک «استاندارد» واحد، تنوع گویشی را حفظ میکند. یک جملهی یکسان بسته به اینکه کجا گفته میشود متفاوت بیرون میآید:
Choveu muito ontem à noite.
pt-PT → ʃuˈvew ˈmũjtu ˈõtɐ̃j a ˈnojt
pt-BR → ʃoˈvew ˈmwĩtʊ ˈõtẽj a ˈnojtʃɪ
pt-AO → ʃoˈvew ˈmũjntʊ ˈõntẽj a ˈnojtɨ
pt-MZ → ʃoˈvew ˈmũjtu ˈõtẽj a ˈnɔjtɨ
pt-TL → ʃoˈvew ˈmujtʊ ˈõntɐ̃j a ˈnojtʰ
در زیر پوسته، TugaPhone موتور مشترک شبکهی نامزدِ orthography2ipa را میراند و دغدغههای ویژهی پرتغالی را از طریق نقاط بسط همان موتور روی آن لایه میکند. برای واژههای شناختهشده به یک واژگان واجی گلچینشده مراجعه میکند (همان Portuguese Phonetic Lexicon بالا)؛ برای هر آنچه در واژگان نیست — نامها، واژههای نوساخته، وامواژههای خارجی — شبکه از قواعد گرافم و واجگونهی آن گویش نامزد تولید میکند.
دو جزئیات ارزش برجسته کردن دارند. نرمالسازی اعداد ارقام را با تطابق درست جنس و شمار به صورتهای گفتاری پرتغالی تبدیل میکند:
from tugaphone.number_utils import normalize_numbers
normalize_numbers("vou comprar 1 casa") # uma casa
normalize_numbers("vou adotar 2 cães") # dois cães
این حتی به قراردادهای مقیاس نیز پایبند است — مقیاس بلندِ biliões برای pt-PT، مقیاس کوتاهِ trilhões برای pt-BR. رفع ابهام همنگاشتها به کتابخانهی bifonia واگذار شده که مالک دانشِ مبتنی بر معناست دربارهٔ اینکه کدام همنگاشتهای ناهمآوا وجود دارند و کدام خوانش را حمل میکنند — پس para بهعنوان حرف اضافه متفاوت از para بهعنوان فعل رفتار میشود — و پیش از آنکه شبکه اصلاً جمله را ببیند، خوانش انتخابشده را با نشانههای نگارشی اضافه علامت میزند.
TugaPhone با راندن شبکهی نامزد مشترک orthography2ipa واجسازی میکند: انتخاب گویش همان انتخاب مشخصهی لِکتِ orthography2ipa است، پس پدیدههای گویشی — بتاسیسم، دوواکههای صعودی پورتو، کامیشدنِ /l/ مادیرایی، پیشروی /u/ آزوری، سندی همخوانِ سایشیِ پایانه، و دیگر موارد — از خودِ شبکه میآیند نه از ویرایشهای پسازواقعهی رشته. TugaPhone تنها آنچه را orthography2ipa عمداً به فراخوان واگذار میکند اضافه میکند، از طریق نقاط بسط خودش: بسط اعداد/ترتیبیهای آگاه به جنس و علامتگذاری همآواهای bifonia بهعنوان مرحلهی نرمالسازی موتور پیش از آنکه شبکه متن را ببیند اجرا میشوند؛ واژگان تلفظیِ گلچینشده از Tugalex برای هر لِکت از طریق orthography2ipa.register_lexicon ثبت میشود، پس یک واژهی پوششدادهشده در همان مسیرِ بازنویسی استثناهای خودِ مشخصه جای میگیرد و شبکه تنها برای واژههایی که واژگان پوشش نمیدهد نامزد تولید میکند؛ هجابندی از افزونهی مبتنی بر silabificador خودِ orthography2ipa میآید، پس تکیه روی همان هجایی مینشیند که TugaPhone در غیر این صورت انتخاب میکرد. قطعههای کوچک و قابل ترکیب که به یک موتور مشترک تغذیه میشوند — هر یک بهتنهایی سودمند.
TugaPhone دربارهی لبههای خود صادق است: پوشش واژگان برای گویشهای آفریقایی و تیموری تُنُکتر است، لهجههای زیرمنطقهای (پورتو، مینیو، براگا و دیگران) تقریبهای آزمایشی از ویژگیهای مستند هستند، و آهنگآوایی در سطح جمله سادهسازی شده است. اینها محدودیتهایی آشکارا مستند شدهاند، نه حالتهای شکست پنهان.
تصویر گستردهتر: orthography2ipa
پرتغالی یک گونه در میان بسیاری گونههاست، و همان الگوی مهندسی تعمیمپذیر است. orthography2ipa یک بستهی Python مبتنی بر دادهی خالص از نگاشتهای گرافم←IPA و واجگونهی زبانشناختی است که ۸۰۷ زبان را در سراسر بیش از ۲۰ خانوادهی زبانی دربر میگیرد. این بسته تمایزی تیز میکشد که هر سامانهی جدی G2P به آن نیاز دارد: یک نقشهی گرافم میگوید که یک املا میتواند کدام واجها را بازنمایی کند، در حالی که یک نقشهی واجگونه میگوید که یک واج در یک بستر معین واقعاً چگونه نمود مییابد. گونههای منطقهای بهصورت مشخصههای خاص خود مدل میشوند که از طریق تبار وزندار با چند نیا بههم پیوند خوردهاند، پس درختهای گویشی بهجای تکرار داده از والدینشان به ارث میبرند.
این همان غریزهی پشت pt-PT، pt-BR، pt-AO، pt-MZ و pt-TL در TugaPhone است: با هر گونهی لوزوفون همچون یک شهروند درجهیک با قواعد خودش رفتار کن، نه انحرافی از یک لهجهی متعارف واحد. داده اعلانی است و منطق نازک و قابلافزونه — میتوانید قواعد را بخوانید، منابعشان را ذکر کنید و به خروجی اعتماد کنید.
امتحانش کنید
هر آنچه اینجاست متنباز و همین امروز قابل نصب است:
pip install tugaphone
pip install git+https://github.com/TigreGotico/silabificador
برای نگاشتهای چندزبانهی گستردهتر، به orthography2ipa نگاه کنید. قطعی، سریع، آفلاین، و ساختهشده برای تمام گسترهی جهان پرتغالیزبان.
این پشتهی واجشناسی پرتغالی بر کار گرافم به IPA ما برای ۸۰۷ زبان بنا میشود و ستون فقرات واجی را برای TTS که روی یک سیبزمینی اجرا میشود و صداهای چندزبانهی Miro و Dii میسازد.