লোকাল এআই মিউজিক জেনারেশন সৃজনশীলতার মাপকাঠি বদলে দিচ্ছে। ACE-Step 1.5-এর মতো টুলগুলো সম্পূর্ণভাবে একটি Mac-এ চলতে পারে, যা কোনো ক্লাউড ক্রেডিট বা আপলোড কিউ ছাড়াই কয়েক মিনিটের মধ্যে টেক্সট প্রম্পটকে পূর্ণাঙ্গ গানে রূপান্তরিত করতে পারে। এই স্বাধীনতা একটি নতুন সমস্যার জন্ম দেয়: ভলিউম বা আধিক্য। যখন জেনারেশন সস্তা এবং তাৎক্ষণিক হয়ে যায়, তখন আপনি গান তৈরি করতে পারবেন কি না তা নিয়ে প্রশ্ন না করে বরং আপনার ড্রাইভে থাকা পঞ্চাশটি ভার্সনের মধ্যে কোনটি রাখা উচিত তা নিয়ে ভাবতে শুরু করেন।

আমি এটি কঠিন অভিজ্ঞতার মাধ্যমে শিখেছি। একটি সাধারণ দিনে, একটি ভালো গান খুঁজে পেতে আমার ACE-Step 1.5 থেকে প্রায় চারটি টেক (take) প্রয়োজন হয়। কিন্তু গড় হিসাব সবসময় সঠিক হয় না। সম্প্রতি একটি সেশনে, আমি একটি নির্দিষ্ট অ্যারেঞ্জমেন্ট পাওয়ার জন্য বত্রিশটি টেক জেনারেট করেছিলাম। বত্রিশটি দুই মিনিটের গান শোনা মানে এক ঘণ্টারও বেশি সময় ধরে অত্যন্ত মনোযোগ দিয়ে শোনা। সপ্তম ট্র্যাকের পর থেকে আমার কান অস্পষ্ট স্বরবর্ণকেও ক্ষমা করতে শুরু করেছিল। পনেরোতম ট্র্যাকের সময় আমি সুরের সাথে তাল মেলাচ্ছিলাম ঠিকই, কিন্তু বাদ পড়া শব্দগুলো পুরোপুরি এড়িয়ে যাচ্ছিলাম। শ্রোতার ক্লান্তি কোনো অলসতা নয়; এটি উপলব্ধির নির্ভুলতার একটি প্রকৃত পতন। আমার এমন একটি ফিল্টার প্রয়োজন ছিল যা আমার কান দিয়ে শোনার আগেই কাজ করতে পারে।

তাই আমি mlx-whisper-এর ওপর ভিত্তি করে একটি লোকাল QA পাইপলাইন তৈরি করেছি, যা হলো OpenAI-এর স্পিচ-রিকগনিশন মডেলের Apple Silicon-অপ্টিমাইজড পোর্ট। ধারণাটি ছিল সহজ: আমি যদি প্রতিটি টেক স্বয়ংক্রিয়ভাবে ট্রান্সক্রাইব করতে পারি এবং সেটিকে মূল লিরিক্সের সাথে তুলনা করতে পারি, তবে আমার কাছে একটি বস্তুনিষ্ঠ লিরিক-ম্যাচ রেট থাকবে। সেই সংখ্যাটি বত্রিশটি টেককে একটি নিয়ন্ত্রণযোগ্য সংখ্যায় কমিয়ে আনতে সাহায্য করবে।

পাইপলাইনটি যেভাবে কাজ করে

এই ওয়ার্কফ্লোতে চারটি ধাপ রয়েছে এবং আমি প্রতিটি ধাপকে অনস্বীকার্য হিসেবে বিবেচনা করি।

Generate (তৈরি করা)। আমি ACE-Step 1.5 দিয়ে র-অডিও তৈরি করি। এই পর্যায়ে আমি কোনো বিচার করি না। লক্ষ্য হলো ভলিউম বা আধিক্য।

Transcribe (ট্রান্সক্রাইব করা)। প্রতিটি WAV ফাইল আমার Mac-এ mlx-whisper-এ ইনপুট হিসেবে যায়। যেহেতু MLX তৈরি করা হয়েছে Apple-এর Metal এবং নিউরাল ইঞ্জিনের জন্য, তাই এটি সম্পূর্ণভাবে লোকালি চলে। এখানে কোনো API খরচ নেই, কোনো নেটওয়ার্ক ল্যাটেন্সি নেই এবং রিমোট সার্ভারে র-অডিও পাঠানোর কোনো গোপনীয়তার উদ্বেগ নেই। আমি কফি বানানোর মধ্যেই বত্রিশটি ফাইলের একটি ব্যাচ ট্রান্সক্রাইব হয়ে যায়।

Score (স্কোর করা)। আমি Whisper-এর ট্রান্সক্রিপ্টকে মূল লিরিক প্রম্পটের সাথে তুলনা করি। ম্যাচ রেটটি বিশ্বস্ততা পরিমাপ করে: গায়ক কি প্রতিটি শব্দ সঠিকভাবে গেয়েছেন, নাকি তিনি লাইন বাদ দিয়েছেন, শব্দ অস্পষ্ট করেছেন বা ভুল সিলেবল তৈরি করেছেন? আমি একটি শতাংশ ওভারল্যাপ গণনা করি। এটি কোনো নান্দনিক বিচার নয়; এটি টেক্সট বা পাঠ্যের নির্ভুলতার একটি কঠোর হিসাব।

Filter (ফিল্টার করা)। আমি সেই ম্যাচ রেট অনুযায়ী টেকগুলোকে সাজাই। শীর্ষ অংশটি আমার অডিশন পুল হিসেবে কাজ করে। বাকি সব কিছু একটি সেকেন্ডারি ফোল্ডারে চলে যায়। আমি কম স্কোর পাওয়া টেকগুলো এখনও মুছে ফেলিনি, তবে আমি সেগুলোর জন্য আমার মূল্যবান শোনার সময় নষ্ট করি না।

বিচারকদের নিরপেক্ষ রাখুন

আমি একটি কঠোর নিয়ম মেনে চলি: জেনারেশন মডেল কখনোই নিজের কাজ নিজে মূল্যায়ন করে না। ACE-Step 1.5 তার নিজের আউটপুট মূল্যায়ন করে না। আমি ট্রান্সক্রিপশনের জন্য সম্পূর্ণ আলাদা একটি প্রক্রিয়া ব্যবহার করি কারণ একটি মডেল যা নিজেকে নিজে পরীক্ষা করে, তা সবসময় খুব দয়ালু বা নরম হয়। এর নিজস্ব সীমাবদ্ধতা বা অন্ধবিন্দু থাকে। যদি জেনারেটর বহুবচন নির্দেশক বাদ দিতে বা কঠিন কনসোনেন্টগুলোকে নরম করতে অভ্যস্ত হয়, তবে একটি সেলফ-ইভ্যালুয়েশন লুপ সেই একই ত্রুটিগুলোকে উপেক্ষা করতে শিখে যাবে। একটি স্বাধীন স্পিচ-রিকগনিশন মডেলের সঙ্গীতের প্রতি কোনো আনুগত্য নেই। এটি কেবল যা শোনে তা রিপোর্ট করে, সেই রিপোর্টটি যতই কঠোর হোক না কেন।

সংখ্যাগুলো যা প্রকাশ করল

বত্রিশটি টেক-এর ব্যাচের ক্ষেত্রে, পাইপলাইনটি আটটি প্রার্থীকে বেছে নিয়েছিল যা গুরুত্বের সাথে দেখার মতো ছিল। সেই আটটির গড় লিরিক-ম্যাচ রেট ছিল ৮৩.৯%। আমি যখন সেগুলো সঠিকভাবে শুনলাম এবং আমার নিজস্ব কোয়ালিটি রুব্রিক অনুযায়ী স্কোর করলাম, তখন সেগুলোর গড় স্কোর ছিল ১০০-এর মধ্যে ৯৪.১। এই ব্যবধানটি পুরো বিষয়টি বুঝিয়ে দেয়। মেশিন গেটটি স্পষ্ট কাঠামোগত ত্রুটিগুলো—লিরিক বাদ পড়া, টাইমিংয়ের বিপর্যয়, ভোকাল আর্টিফ্যাক্ট—ধরে ফেলেছিল, যাতে আমার মানুষের মতো স্কোরিং একটি পূর্ব-পরিষ্কার করা সেটের ওপর কাজ করতে পারে। অটোমেশন আমার বিচারবুদ্ধিকে প্রতিস্থাপন করেনি; বরং এটি আমার বিচারবুদ্ধিকে সংরক্ষণ করেছে।

যখন মেশিন ভুল করে

কম স্কোর মানেই সবসময় খারাপ গান নয়। আমি এটি খুব দ্রুত বুঝতে পেরেছিলাম যখন একটি ট্র্যাক যা আমার খুব পছন্দ ছিল, সেটি কাটঅফের চেয়ে অনেক কম স্কোর করেছিল। লিরিক্সগুলো ছিল একটি সাধারণ বর্ণমালা চ্যান্ট: বিচ্ছিন্ন শব্দ হিসেবে একক অক্ষরগুলো গাওয়া। Whisper স্বাভাবিক বাক্য গঠনের ওপর প্রশিক্ষিত। আপনি যদি একে "A B C D" দেন, তবে এটি প্রায়ই শব্দ কল্পনা করে নেয় (hallucinates), আর্টিকেল যোগ করে বা অক্ষরগুলোকে অস্পষ্ট ধ্বনিতে রূপান্তরিত করে ফেলে। ট্রান্সক্রিপশনটি ব্যর্থ হয়েছিল, কিন্তু ভোকাল পারফরম্যান্সটি আসলে ছিল অত্যন্ত স্পষ্ট।

সেই ঘটনাটি আমাকে এর ব্যবহারিক সীমাবদ্ধতা শিখিয়েছে। ম্যাচ রেট হলো একটি প্রি-ফিল্টার, চূড়ান্ত রায় নয়। যে টেকগুলোর স্কোর কম, সেগুলোকেও আমি ডাস্টবিনে ফেলার আগে দশ সেকেন্ডের জন্য মানুষের মাধ্যমে অডিশন করিয়ে নিই। সংখ্যাটি আপনাকে সম্ভাবনার দিকে নির্দেশ করে, নিশ্চিততার দিকে নয়। আপনি যদি স্কোরকে কম্পাসের বদলে একটি বিচারকের হাতুড়ি (gavel) হিসেবে বিবেচনা করেন, তবে আপনি ভালো গান হারিয়ে ফেলবেন।

একটি প্রযুক্তিগত বাধা

আপনি যদি Apple Silicon-এ MLX চালান, তবে বড় ব্যাচ প্রসেস করার আগে আপনার Python architecture পরীক্ষা করে নিন। একটি সাধারণ সেটআপ ভুল হলো Rosetta emulation-এর মাধ্যমে Python binary চালানো। স্ক্রিপ্টটি তবুও কাজ করবে, কিন্তু আপনি সেই hardware acceleration হারাবেন যা লোকাল ট্রান্সক্রিপশনকে সহজসাধ্য করে তোলে।

আপনার টার্মিনালে এটি চালান:

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

আপনি arm64 দেখতে চাইবেন। যদি এটি x86_64 প্রিন্ট করে, তবে আপনার এনভায়রনমেন্টটি emulated। একটি native Python build অথবা একটি native conda environment-এ সুইচ করুন, তারপর mlx-whisper পুনরায় ইনস্টল করুন। বড় ব্যাচের ক্ষেত্রে, emulated এবং native execution-এর মধ্যে পার্থক্য হলো দুপুরের খাবারের আগে কাজ শেষ করা এবং রাতের খাবারের আগে কাজ শেষ করার মধ্যে পার্থক্য।

আসল গুরুত্ব

Generative audio অধ্যবসায়কে পুরস্কৃত করে, কিন্তু মানুষের মনোযোগের একটি সীমা আছে। আপনি যে অত্যন্ত সতর্ক, তা প্রমাণ করার জন্য বত্রিশটি মাঝারি মানের টেক (take) শোনায় কোনো মহিমা নেই। জেনারেটর এবং আমার কানের মাঝে mlx-whisper-কে ব্যবহার করে, আমি ঘণ্টার পর ঘণ্টা মনোযোগ দিয়ে সৃজনশীল কাজ করার সময় ফিরে পেয়েছি। কোন গানটি টিকে থাকবে আর কোনটি বাদ যাবে, সেই সিদ্ধান্ত আমিই নিই। মেশিনটি কেবল নিশ্চিত করে যে আমি যেন সেরা সম্ভাব্য প্রার্থীদের ওপর সেই বিচার প্রয়োগ করতে পারি।

এই পাইপলাইনের পেছনের সম্পূর্ণ বিবরণ এখানে পাওয়া যাচ্ছে। আপনি যদি এই ধরণের লোকাল QA টুল তৈরি করেন, তবে অভিজ্ঞতা বিনিময়ের জন্য GyaanSetu community একটি ভালো জায়গা।