Local AI music generation removes the meter from creativity. Tools like ACE-Step 1.5 can run entirely on a Mac, turning text prompts into full songs in minutes with no cloud credits and no upload queues. That freedom breeds a new problem: volume. When generation is cheap and instant, you stop asking whether you can make a song and start wondering which of the fifty versions on your drive is worth keeping.
I learned this the hard way. On an average day, I need about four takes from ACE-Step 1.5 to find one keeper. But averages lie. In one recent session, I generated thirty-two takes chasing a single arrangement. Listening to thirty-two two-minute songs is over an hour of critical listening. By the seventh track, my ears were forgiving smeared vowels. By the fifteenth, I was nodding along to melodies while missing dropped words entirely. Listener fatigue is not laziness; it is a real collapse in perceptual accuracy. I needed a filter that could run before my ears did.
So I built a local QA pipeline around mlx-whisper, the Apple Silicon-optimized port of OpenAI’s speech-recognition model. The idea was simple: if I could transcribe every take automatically and compare it to the original lyrics, I would have an objective lyric-match rate. That number could rank the thirty-two takes down to a manageable handful.
How the Pipeline Works
The workflow has four stages, and I treat each one as non-negotiable.
Generate. I create the raw audio with ACE-Step 1.5. I do not judge anything at this stage. The goal is volume.
Transcribe. Every WAV file feeds into mlx-whisper on my Mac. Because MLX is built for Apple’s Metal and the neural engine, this runs entirely locally. There are no API costs, no network latency, and no privacy concerns about shipping raw audio to a remote server. A thirty-two-file batch transcribes while I make coffee.
Score. I compare the Whisper transcript against the original lyric prompt. The match rate measures fidelity: did the singer hit every word, or did it skip lines, slur phrases, or hallucinate syllables? I calculate a percentage overlap. This is not an aesthetic judgment; it is a strict accounting of textual accuracy.
Filter. I sort the takes by that match rate. The top quintile becomes my audition pool. Everything else goes to a secondary folder. I have not deleted the low scorers yet, but I do not waste prime listening time on them.
Keep the Jury Independent
I follow one hard rule: the generation model never scores its own homework. ACE-Step 1.5 does not evaluate ACE-Step 1.5 output. I use an entirely separate process for transcription because a model that checks itself will always be too kind. It shares the same blind spots. If the generator tends to drop plural markers or softens hard consonants, a self-evaluation loop will learn to ignore those same quirks. An independent speech-recognition model has no loyalty to the music. It simply reports what it hears, however harsh that report might be.
What the Numbers Revealed
On the batch of thirty-two takes, the pipeline narrowed the field to eight candidates that were worth serious attention. Those eight averaged an 83.9% lyric-match rate. After I listened to them properly and scored them against my own quality rubric, they averaged 94.1 out of 100. That spread tells the whole story. The machine gate caught the obvious structural failures—lyric drops, timing collapses, vocal artifacts—so that my human scoring could operate on a pre-cleaned set. The automation did not replace my judgment. It conserved it.
When the Machine Misfires
A low score is not always a bad song. I caught this early when a track I loved scored far below the cutoff. The lyrics were a simple alphabet chant: single letters sung as isolated sounds. Whisper is trained on natural sentence structure. Feed it "A B C D" and it often hallucinates words, inserts articles, or collapses the letters into garbled phonemes. The transcription failed, but the vocal performance was actually crisp.
That case taught me the practical limit. The match rate is a pre-filter, not a final verdict. Any take that scores low still gets a ten-second human audition before I trash it. The number points you toward probability, not certainty. If you treat the score as a gavel rather than a compass, you will throw away good music.
A Technical Speed Bump
Nếu bạn đang chạy MLX trên Apple Silicon, hãy kiểm tra kiến trúc Python của mình trước khi xử lý các lô dữ liệu lớn. Một lỗi thiết lập phổ biến là chạy tệp thực thi Python thông qua trình giả lập Rosetta. Script vẫn sẽ chạy, nhưng bạn sẽ mất đi khả năng tăng tốc phần cứng vốn giúp việc chuyển đổi âm thanh thành văn bản tại chỗ trở nên khả thi.
Chạy lệnh này trong terminal của bạn:
python3 -c "import platform; print(platform.machine())"
Bạn cần thấy arm64. Nếu nó hiển thị x86_64, môi trường của bạn đang được giả lập. Hãy chuyển sang bản build Python gốc hoặc môi trường conda gốc, sau đó cài đặt lại mlx-whisper. Với các lô dữ liệu dài, sự khác biệt giữa thực thi giả lập và thực thi gốc chính là sự khác biệt giữa việc hoàn thành trước bữa trưa và hoàn thành trước bữa tối.
Giá trị thực sự
Âm thanh tạo sinh đòi hỏi sự kiên trì, nhưng sự chú ý của con người là hữu hạn. Chẳng có gì vẻ vang khi phải nghe tới ba mươi hai bản thu trung bình chỉ để chứng minh rằng bạn là người kỹ lưỡng. Bằng cách đặt mlx-whisper giữa bộ tạo và tai mình, tôi đã lấy lại được hàng giờ đồng hồ tập trung sáng tạo. Tôi vẫn là người quyết định bài hát nào được giữ lại và bài hát nào bị loại bỏ. Máy móc chỉ đơn giản đảm bảo rằng tôi đang áp dụng sự phán đoán đó cho những ứng cử viên tiềm năng nhất.
Bài viết đầy đủ về quy trình này có sẵn tại đây. Nếu bạn đang xây dựng các công cụ QA cục bộ tương tự, cộng đồng GyaanSetu là một nơi tốt để trao đổi kinh nghiệm.
