تولید موسیقی محلی با هوش مصنوعی، محدودیتهای سنتی خلاقیت را از میان میبرد. ابزارهایی مانند ACE-Step 1.5 میتوانند بهطور کامل روی یک مک اجرا شوند و در عرض چند دقیقه، دستورات متنی را به آهنگهای کامل تبدیل کنند، بدون اینکه نیازی به اعتبار ابری (cloud credits) یا انتظار در صفهای آپلود باشد. این آزادی، مشکل جدیدی به نام «حجم زیاد» ایجاد میکند. وقتی تولید، ارزان و آنی باشد، دیگر از خود نمیپرسید که «آیا میتوانم آهنگ بسازم؟»، بلکه میپرسید «کدام یک از این پنجاه نسخه موجود در درایو من ارزش نگه داشتن دارد؟»
من این را به سختی یاد گرفتم. در یک روز معمولی، من حدود چهار برداشت (take) از ACE-Step 1.5 نیاز دارم تا تنها یک نسخه مناسب پیدا کنم. اما میانگینها دروغ میگویند. در یک جلسه اخیر، برای رسیدن به یک آرایش (arrangement) واحد، ۳۲ برداشت تولید کردم. گوش دادن به سی و دو آهنگ دو دقیقهای، بیش از یک ساعت گوش دادنِ انتقادی است. از آهنگ هفتم، گوشهایم شروع به بخشیدنِ مصوتهای نامشخص کردند. تا آهنگ پانزدهم، در حالی که کلمات حذف شده را کاملاً نادیده میگرفتم، با ملودیها سر تکان میدادم. خستگی شنونده تنبلی نیست؛ بلکه فروپاشی واقعی دقت ادراکی است. من به فیلتری نیاز داشتم که بتواند قبل از گوشهای من کار کند.
بنابراین، یک خط لوله (pipeline) کنترل کیفیت (QA) محلی حول محور mlx-whisper ساختم؛ نسخه بهینهسازی شده برای Apple Silicon از مدل تشخیص گفتار OpenAI. ایده ساده بود: اگر بتوانم هر برداشت را بهطور خودکار به متن تبدیل کنم و آن را با متن اصلی آهنگ مقایسه کنم، به یک «نرخ تطبیق متن» (lyric-match rate) عینی دست مییافتم. آن عدد میتوانست ۳۲ برداشت را به چند نمونه قابل مدیریت کاهش دهد.
خط لوله چگونه کار میکند
این گردش کار دارای چهار مرحله است و من با هر کدام بهصورت غیرقابل مذاکره برخورد میکنم.
تولید (Generate). من صدای خام را با ACE-Step 1.5 ایجاد میکنم. در این مرحله هیچ قضاوتی نمیکنم. هدف، تولید حجم بالاست.
تبدیل به متن (Transcribe). هر فایل WAV وارد mlx-whisper روی مک من میشود. از آنجایی که MLX برای Metal و موتور عصبی (neural engine) اپل ساخته شده است، این فرآیند کاملاً بهصورت محلی اجرا میشود. هیچ هزینه API، تأخیر شبکه و نگرانی امنیتی در مورد ارسال صدای خام به یک سرور از راه دور وجود ندارد. یک دسته ۳۲ فایلی، در حالی که من مشغول درست کردن قهوه هستم، تبدیل به متن میشود.
امتیازدهی (Score). من متن استخراج شده توسط Whisper را با دستور متنی اصلی مقایسه میکنم. نرخ تطبیق، میزان وفاداری را میسنجد: آیا خواننده تمام کلمات را درست ادا کرد، یا خطوط را نادیده گرفت، عبارات را کشید یا هجاها را توهم زد (hallucinate)؟ من درصد همپوشانی را محاسبه میکنم. این یک قضاوت زیباییشناختی نیست؛ بلکه یک حسابرسی دقیق از دقت متنی است.
فیلتر کردن (Filter). من برداشتها را بر اساس آن نرخ تطبیق مرتب میکنم. یکپنجم برتر (top quintile) به گروه آزمایشی من تبدیل میشود. بقیه موارد به یک پوشه ثانویه منتقل میشوند. من هنوز امتیازهای پایین را حذف نکردهام، اما وقت طلایی گوش دادن خود را برای آنها تلف نمیکنم.
هیئت منصفه را مستقل نگه دارید
من یک قانون سخت را دنبال میکنم: مدل تولیدکننده هرگز نباید تکالیف خودش را نمرهگذاری کند. ACE-Step 1.5 خروجی ACE-Step 1.5 را ارزیابی نمیکند. من از یک فرآیند کاملاً مجزا برای تبدیل به متن استفاده میکنم، زیرا مدلی که خودش را چک میکند، همیشه بیش از حد مهربان خواهد بود. آن مدل هم همان نقاط کور را دارد. اگر مدل تولیدکننده تمایل به حذف نشانههای جمع یا نرم کردن صامتهای سخت داشته باشد، یک حلقه خودارزیابی نیز یاد میگیرد که همان نقصها را نادیده بگیرد. یک مدل مستقل تشخیص گفتار، هیچ وفاداری به موسیقی ندارد. آن مدل صرفاً آنچه را که میشنود گزارش میدهد، هرچقدر هم که آن گزارش تند و تیز باشد.
آنچه اعداد آشکار کردند
در آن دسته ۳۲ تایی از برداشتها، این خط لوله دامنه انتخاب را به هشت کاندیدای برتر که ارزش توجه جدی داشتند، محدود کرد. آن هشت مورد بهطور متوسط ۸۳.۹٪ نرخ تطبیق متن داشتند. پس از اینکه بهدرستی به آنها گوش دادم و آنها را بر اساس معیار کیفی خودم امتیازدهی کردم، میانگین آنها ۹۴.۱ از ۱۰۰ شد. این اختلاف، تمام داستان را روایت میکند. دروازه ماشینی، شکستهای ساختاری آشکار — مانند حذف متن، فروپاشی زمانبندی و آرتیفکتهای صوتی — را شناسایی کرد تا امتیازدهی انسانی من بتواند روی مجموعهای از پیش پاکسازی شده انجام شود. اتوماسیون جایگزین قضاوت من نشد، بلکه از آن محافظت کرد.
وقتی ماشین اشتباه میکند
امتیاز پایین همیشه به معنای آهنگ بد نیست. من این را خیلی زود متوجه شدم، زمانی که آهنگی که دوست داشتم، امتیازی بسیار پایینتر از حد نصاب گرفت. متن آهنگ یک ذکر ساده الفبا بود: حروف تکگانه که به صورت صداهای مجزا خوانده میشدند. Whisper بر اساس ساختار جملات طبیعی آموزش دیده است. اگر «A B C D» را به آن بدهید، اغلب کلمات را توهم میزند، حروف تعریف اضافه میکند یا حروف را به فنوکهای (phonemes) نامفهوم تبدیل میکند. تبدیل به متن شکست خورد، اما اجرای خواننده در واقع بسیار شفاف بود.
آن مورد، محدودیت عملی را به من یاد داد. نرخ تطبیق یک پیشفیلتر است، نه یک حکم نهایی. هر برداشتی که امتیاز پایینی بگیرد، باز هم قبل از اینکه آن را دور بریزم، یک آزمون انسانی ده ثانیهای را پشت سر میگذارد. آن عدد شما را به سمت احتمال هدایت میکند، نه قطعیت. اگر با آن امتیاز مانند یک چکش دادگاه برخورد کنید تا یک قطبنما، موسیقی خوب را دور خواهید ریخت.
یک مانع فنی
اگر در حال اجرای MLX روی Apple Silicon هستید، قبل از پردازش دستههای بزرگ (batches)، معماری Python خود را بررسی کنید. یک اشتباه رایج در تنظیمات، اجرای باینری Python از طریق شبیهسازی Rosetta است. اسکریپت همچنان اجرا خواهد شد، اما شتابدهنده سختافزاری که باعث میشود تبدیل گفتار به متن (transcription) محلی قابل تحمل باشد را از دست خواهید داد.
این را در ترمینال خود اجرا کنید:
python3 -c "import platform; print(platform.machine())"
شما باید arm64 را مشاهده کنید. اگر x86_64 چاپ شد، یعنی محیط شما شبیهسازی شده است. به یک نسخه native از Python یا یک محیط native conda سوئیچ کنید، سپس mlx-whisper را دوباره نصب کنید. در دستههای طولانی، تفاوت بین اجرای شبیهسازی شده و native، تفاوت بین تمام شدن کار قبل از ناهار و تمام شدن کار قبل از شام است.
ارزش واقعی
صدای مولد (Generative audio) پاداش پشتکار را میدهد، اما توجه انسان محدود است. هیچ افتخاری در گوش دادن به سی و دو برداشت (take) متوسط، فقط برای اثبات دقیق بودن شما وجود ندارد. با قرار دادن mlx-whisper بین مولد (generator) و گوشهایم، ساعتها زمان خلاقانه متمرکز را دوباره به دست آوردم. من همچنان تصمیم میگیرم که کدام آهنگ باقی بماند و کدام حذف شود. ماشین صرفاً اطمینان حاصل میکند که من آن قضاوت را روی بهترین کاندیداهای ممکن اعمال میکنم.
گزارش کامل پشت این خط لوله (pipeline) در اینجا در دسترس است. اگر در حال ساخت ابزارهای QA محلی مشابه هستید، جامعه GyaanSetu مکان خوبی برای تبادل نظر است.
