وجود SpeechSynthesis در مرورگر به معنی وجود صدای فارسیِ آماده نیست. باید فهرست صداهای گزارششده، برچسب زبان و زمان بارگذاریِ همان محیط را ببینید. این راهنما فقط فهرست را میخواند؛ متنی به موتور گفتار نمیفرستد، میکروفن نمیگیرد و فایل صوتی تولید نمیکند.
سه وضعیت را یک پاسخ نکنیم
| مشاهده | برداشت محدود | قدم بعد |
|---|---|---|
| API وجود ندارد | این مسیر در محیطِ فعلی در دسترس نیست | مسیر جایگزین و دستگاه مقصد را بررسی کنید |
| فهرست اولیه خالی است | فعلاً صدایی گزارش نشده | رویداد voiceschanged و بازهٔ بررسیِ محدود را کنترل کنید |
| برچسب fa یا fa-IR گزارش میشود | یک گزینه با برچسب فارسی موجود است | تلفظ، پخش واقعی و نیاز محصول را جدا آزمایش کنید |
برچسب زبان، تضمین کیفیت تلفظ یا موفقیت پخش نیست. نبود صدای فارسی در یک مرورگر هم شاهد نبود آن در همهٔ دستگاهها نیست. وابستگی به صداهای قابل دسترس در دستگاه و مرورگر را از یک سرویس با خروجی ازپیشتولیدشده جدا کنید.
مشاهدهٔ واقعیِ همین محیط
در بررسی محدودِ Edge بهشکل headless در۳نوامبر۲۰۲۶، API وجود داشت؛ ابتدا۰صدا و پس از۲ثانیه۳صدا گزارش شد. یک رویداد voiceschanged دیده شد و تعداد برچسبهای فارسی۰بود. در تمام این آزمون speak فراخوانی نشد، صوت پخش نشد و درخواستهای شبکهٔ صفحه مسدود بودند. این مشاهده، پیمایش کاربران یا آزمون قابلیت سیستمعاملِ همهٔ دستگاهها نیست.
بنابراین عبارت درست این است: «در این بررسیِ محدود، گزینهٔ فارسی گزارش نشد.» از آن نتیجه نمیگیریم نصب فارسی در دستگاه شما غیرممکن است. همچنین فهرستِ اولیهٔ خالی، در همین مثال با فهرستِ نهایی فرق داشت؛ تصمیم فوری از خواندنِ اول میتوانست گمراهکننده باشد.
کدِ محدود برای بررسی روی دستگاه خودتان
فایل TXT همراه، تابع inspectPersianVoices دارد. آن را در محیط توسعهٔ صفحهٔ آزمایشی خود یا Console مرورگر روی صفحهای که مجاز به بررسی آن هستید اجرا کنید. تابع از getVoices استفاده و تا بازهٔ پیشفرض۲ثانیه به تغییر فهرست گوش میدهد؛ شنونده و timer در پایان پاک میشوند. نام فایل TXT است تا کد بهعنوان ابزار نصبشده یا برنامهٔ اجرایی خودکار معرفی نشود.
inspectPersianVoices().then(result => {
const persian = result.voices.filter(v => /^fa(?:-|$)/i.test(v.lang));
console.table(persian);
});شرط زبان، fa یا ادامهٔ دارای خط تیره را میپذیرد؛ رشتهٔ fak را صرفاً چون با دو حرف مشابه شروع میشود فارسی حساب نمیکند. اگر بازه تمام شد، reason برابر bounded_check_finished است؛ این نام به معنی «عدم وجود دائمی» نیست. فقط یک بررسیِ زماندار پایان یافته است.
localService چه میگوید؟
طبق MDN، این ویژگی مشخص میکند صدا از سرویس محلی عرضه میشود یا سرویس دوردست. مقدار آن را همراه نام و زبان ثبت کنید؛ صرف وجود API را وعدهٔ آفلاینبودن همهٔ صداها نکنید. این نمونه فقط فهرست میگیرد؛ بررسیِ محل واقعی پردازشِ متن هنگام پخش یا سیاست شبکهٔ یک محصول را انجام نداده است.
چه چیزی برای تصمیم محصول باقی میماند؟
اگر قرار است کاربران روی موبایل و دسکتاپ متن فارسی بشنوند، یک نمونهٔ مجاز و کوتاه را بعداً روی دستگاههای مقصد با اقدامِ آگاهانهٔ کاربر پخش و نتیجه را ثبت کنید. صدا، زبان، اعداد، نفی و خطای پخش را جدا بررسی کنید. این آموزش چنین آزمون شنیداریای را انجام نداده است.
اگر به فایلِ صدای فارسیِ قابل تحویل نیاز دارید، مسیر اپراگو را با متن، مدت موردنیاز و روش تحویل با تیم بررسی کنید؛ فهرست صداهای مرورگر، فهرست صداهای اپراگو نیست. برای آمادهکردن متن، راهنمای تبدیل متن نوشتاری به متن شنیدنی قدم بعدی است.
فایل تمرین و منبع
کد JavaScript فقط برای دیدن فهرست صدا؛ بدون پخش یا میکروفن · مشاهدهٔ واقعیِ یک مرورگر headless؛ پیمایش دستگاههای کاربران نیست
منابع در ۳ نوامبر ۲۰۲۶ خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.