وقتی میکروفن در مرورگر کار نمیکند، ابتدا مشخص کنید درخواست اجازه اصلاً انجام میشود، اجازه رد شده یا دستگاه قابل خواندن نیست. این سه وضعیت راهحل یکسان ندارند. نمونه این صفحه فقط دریافت مسیر ورودی را آزمایش میکند و بلافاصله آن را میبندد؛ صدا ضبط یا ارسال نمیشود.
اول محیط اجرا را ببینید
getUserMedia برای محیط امن طراحی شده است. روی سایت عمومی، HTTPS را بررسی کنید؛ localhost برای توسعه میتواند محیط قابل اعتماد باشد. کد باید وجود navigator.mediaDevices و خود متد را نیز کنترل کند. اگر API در دسترس نیست، تلاش تکراری برای روشنکردن میکروفن مشکل را رفع نمیکند.
همچنین صفحه داخل iframe میتواند محدودیت Permissions Policy داشته باشد. در این حالت ممکن است پیام اجازهای که انتظار دارید ظاهر نشود. برنامه نباید رد دسترسی را دور بزند یا مرورگر را وادار به نادیدهگرفتن انتخاب کاربر کند؛ تنظیم درست صفحه میزبان و اجازه آگاهانه لازم است.
یک نمونه کمینه
let stream;
try {
stream = await navigator.mediaDevices.getUserMedia({audio:true, video:false});
// موفقیت یعنی دریافت مسیر، نه تأیید شنیداری ضبط
} finally {
stream?.getTracks().forEach(track => track.stop());
}
این قطعه باید داخل تابع async و پس از اقدام روشن کاربر قرار گیرد. فایل کامل آزمون مجوز کنترل محیط، دکمه، پیام خطا و بستن مسیر را همراه دارد. فایل را در یک محیط توسعه قابل اعتماد اجرا کنید؛ هیچ کتابخانه خارجی بارگذاری نمیکند.
نام خطا را ثبت کنید، نه یک پیام مبهم
| نام | مسیر بررسی |
|---|---|
| NotAllowedError | اجازه کاربر، تنظیم سیستم و سیاست صفحه؛ این نام تنها یک علت یگانه را ثابت نمیکند |
| NotFoundError | ورودی مطابق درخواست در دسترس نیست |
| NotReadableError | با وجود مجوز، خواندن مسیر در سطح سیستم یا مرورگر ممکن نشده است |
| OverconstrainedError | قید خاص مانند دستگاه یا نرخ درخواستی تأمین نمیشود |
در نمونه ما فقط audio:true درخواست شده است. برای عیبیابی، ابتدا قیدهای سخت و غیرضروری را از برنامه خود حذف کنید؛ اگر درخواست کمینه موفق بود، قیدهای لازم را یکبهیک برگردانید. اگر کاربر پیام اجازه را نادیده بگیرد، انتظار درخواست ممکن است ادامه یابد؛ انتظار را بهاشتباه موفقیت یا رد قطعی ننامید.
موفقیت این آزمون چه چیزی را ثابت نمیکند؟
دریافت MediaStream نمیگوید صدای درست، با بلندی کافی و بدون نویز وارد شده است. ابزار این مقاله نه دستگاه را ضبط میکند و نه فایل خروجی میسازد؛ آزمون شنیدن باید جدا و با اجازه انجام شود. در گزارش فنی، دامنه، مرورگر، وجود محیط امن و نام خطا کافی است؛ نام کامل دستگاه یا اطلاعات حساس کاربر را بینیاز جمع نکنید.
اگر مسئله ذخیره قالب ضبط است، مرحله بعد تشخیص نوع ضبط MediaRecorder است. برای تفاوت فایل ورودی و خروجی متن، قرارداد تحویل متن صوت را بخوانید. این آموزش API وب عمومی است و وجود یک ضبطکننده خاص در پنل اپرا را اعلام نمیکند.
برای پروژه صوت فارسی، نیاز دریافت فایل یا میکروفن زنده را در درخواست اپرانگار جدا مطرح کنید. منبع رفتار، محیط امن و خطاها: مستند getUserMedia در MDN. نمونه کد، ساخته تحریریه و نیازمند آزمون در مرورگر مقصد شماست.