יצירת מוזיקה מקומית באמצעות AI מסירה את המגבלות מהיצירתיות. כלים כמו ACE-Step 1.5 יכולים לרוץ לחלוטין על Mac, ולהפוך הנחיות טקסטואליות לשירים מלאים תוך דקות, ללא קרדיטים בענן וללא תורים להעלאה. החופש הזה מוליד בעיה חדשה: נפח. כשניתן לייצר בקלות ובמהירות, מפסיקים לשאול אם אפשר ליצור שיר ומתחילים לתהות איזה מבין חמישים הגרסאות בכונן שלך שווה לשמור.

למדתי זאת בדרך הקשה. ביום ממוצע, אני זקוק לכארבעה ניסיונות (takes) מ-ACE-Step 1.5 כדי למצוא ניסיון אחד ששווה לשמור. אבל ממוצעים משקרים. באחד המפגשים האחרונים, יצרתי שלושים ושניים ניסיונות בחיפוש אחר עיבוד (arrangement) אחד. להאזין לשלושים ושניים שירים של שתי דקות זה יותר משעה של האזנה ביקורתית. בשיר השביעי, האוזניים שלי כבר סלחו להברות מטושטשות. ב-15, הנהנתי לצלילי המנגינה בזמן שפספסתי מילים שנשמטו לחלוטין. עייפות של מאזין אינה עצלנות; היא קריסה אמיתית של הדיוק התפיסתי. הייתי צריך מסנן שיכול לפעול לפני האוזניים שלי.

לכן בניתי תהליך (pipeline) מקומי לבקרת איכות (QA) סביב mlx-whisper, הגרסה המותאמת ל-Apple Silicon של מודל זיהוי הדיבור של OpenAI. הרעיון היה פשוט: אם אוכל לתמלל כל ניסיון באופן אוטומטי ולהשוות אותו למילים המקוריות, יהיה לי שיעור התאמה אובייקטיבי למילים. המספר הזה יכול לדרג את שלושים ושניים הניסיונות לכמות קטנה וניהולית.

כיצד ה-Pipeline עובד

תהליך העבודה מורכב מארבעה שלבים, ואני מתייחס לכל אחד מהם כאל בלתי ניתן למשא ומתן.

יצירה. אני יוצר את האודיו הגולמי עם ACE-Step 1.5. אני לא שופט שום דבר בשלב זה. המטרה היא נפח.

תמלול. כל קובץ WAV מוזן ל-mlx-whisper על ה-Mac שלי. מכיוון ש-MLX נבנה עבור ה-Metal וה-neural engine של Apple, זה רץ לחלוטין באופן מקומי. אין עלויות API, אין השהיית רשת (latency), ואין חששות פרטיות לגבי שליחת אודיו גולמי לשרת מרוחק. מקבץ של שלושים ושניים קבצים עובר תמלול בזמן שאני מכין קפה.

דירוג. אני משווה את תמלול ה-Whisper מול הנחיית המילים המקורית. שיעור ההתאמה מודד נאמנות (fidelity): האם הזמר פגע בכל מילה, או שהוא דילג על שורות, דיבר בטשטוש או "הזיה" (hallucinate) של הברות? אני מחשב אחוז חפיפה. זהו אינו שיפוט אסתטי; זוהי בדיקה קפדנית של דיוק טקסטואלי.

סינון. אני ממיין את הניסיונות לפי שיעור ההתאמה הזה. חמישית העליונה הופכת למאגר ההאזנה (audition pool) שלי. כל השאר עובר לתיקייה משנית. עדיין לא מחקתי את בעלי הציון הנמוך, אבל אני לא מבזבז זמן האזנה יקר עליהם.

שמרו על חבר מושבעים עצמאי

אני פועל לפי כלל נוקשה אחד: מודל היצירה לעולם אינו מעריך את "שיעורי הבית" של עצמו. ACE-Step 1.5 אינו מעריך את הפלט של ACE-Step 1.5. אני משתמש בתהליך נפרד לחלוטין לתמלול, מכיוון שמודל שבודק את עצמו תמיד יהיה אדיב מדי. יש לו את אותן נקודות עיוורות. אם הגנרטור נוטה להשמיט סימני רבים או לרכך עיצורים קשים, לולאת הערכה עצמית תלמד להתעלם מאותן תכונות אופי. למודל עצמאי של זיהוי דיבור אין נאמנות למוזיקה. הוא פשוט מדווח על מה שהוא שומע, לא משנה כמה הדיווח הזה עשוי להיות חריף.

מה המספרים חשפו

במקבץ של שלושים ושניים הניסיונות, ה-pipeline צמצם את השדה לשמונה מועמדים שהיו ראויים לתשומת לב רצינית. השמונה הללו הגיעו לממוצע של 83.9% שיעור התאמה למילים. לאחר שהאזנתי להם כראוי ודירגתי אותם מול מדד האיכות שלי, הם הגיעו לממוצע של 94.1 מתוך 100. הפער הזה מספר את הסיפור כולו. שער המכונה תפס את הכשלים המבניים הברורים — השמטות מילים, קריסות קצב, עיוותי קול — כך שהדירוג האנושי שלי יכול היה לפעול על סט נקי מראש. האוטומציה לא החליפה את השיפוט שלי. היא שימרה אותו.

כשהמכונה טועה

ציון נמוך אינו תמיד מעיד על שיר רע. הבנתי זאת מוקדם כשרצועה שאהבתי קיבלה ציון נמוך בהרבה מהסף. המילים היו שירת אלף-בית פשוטה: אותיות בודדות שהושרלו כצלילים מבודדים. Whisper מאומן על מבנה משפטים טבעי. אם תזינו לו "A B C D", הוא לעיתים קרובות "מזייף" מילים, מכניס תווים או מאחד את האותיות לפונמות מעוותות. התמלול נכשל, אך הביצוע הווקאלי היה למעשה צלול.

המקרה הזה לימד אותי את הגבול הפרקטי. שיעור ההתאמה הוא מסנן מקדים, לא פסק דין סופי. כל ניסיון שקיבל ציון נמוך עדיין עובר האזנה אנושית של עשר שניות לפני שאני זורק אותו. המספר מכוון אתכם לכיוון ההסתברות, לא לוודאות. אם תתייחסו לציון כאל פטיש שופט במקום כמצפן, תזרקו מוזיקה טובה.

מכשול טכני

אם אתם מריצים MLX על Apple Silicon, בדקו את ארכיטקטורת ה-Python שלכם לפני שאתם מעבדים מנות (batches) גדולות. טעות נפוצה בהגדרה היא הרצת קובץ בינארי של Python דרך הדמיית Rosetta. הסקריפט עדיין ירוץ, אך תאבדו את האצת החומרה שהופכת תמלול מקומי למשהו נסבל.

הריצו את הפקודה הבאה בטרמינל שלכם:

python3 -c "import platform; print(platform.machine())"

אתם רוצים לראות arm64. אם מודפס x86_64, הסביבה שלכם היא emulated. עברו לגרסת Python native או לסביבת conda native, ואז התקינו מחדש את mlx-whisper. במנות ארוכות, ההבדל בין הרצה emulated להרצה native הוא ההבדל בין לסיים לפני ארוחת הצהריים לבין לסיים לפני ארוחת הערב.

הערך האמיתי

אודיו גנרטיבי מתגמל על התמדה, אך הקשב האנושי הוא מוגבל. אין שום תהילה בהאזנה ל-32 טייקים בינוניים רק כדי להוכיח שאתם יסודיים. על ידי הצבת mlx-whisper בין הגנרטור לבין האוזניים שלי, "קניתי" לעצמי שעות של זמן יצירתי ממוקד. אני עדיין זה שמחליט איזה שיר יחיה ואיזה ימות. המכונה פשוט מוודאת שאני מחיל את השיפוט הזה על המועמדים הטובים ביותר האפשריים.

המאמר המלא שמאחורי ה-pipeline הזה זמין כאן. אם אתם בונים כלי QA מקומיים דומים, ה-GyaanSetu community הוא מקום טוב להחלפת רעיונות.