ছুটির পর প্রথম দিন, Slack মেসেজ দেখে চমকে গেলাম — একটা Audio Recording সমস্যার গল্প

দীর্ঘ ছুটি শেষে অফিসের প্রথম দিন। সকালে Slack খুলে দেখি — বেশ কিছু urgent message জমে আছে। Marking team জানাচ্ছে, spoken question এর audio play হচ্ছে না ঠিকমতো, duration দেখাচ্ছে NaN:NaN। মানে audio file আছে, play ও হচ্ছে কোনোভাবে, কিন্তু কত সেকেন্ডের recording সেটাই বোঝা যাচ্ছে না।
মনটা একটু খারাপ হলো। কারণ ছুটিতে যাওয়ার আগে আমিই একটা improvement release করেছিলাম — spoken question এর audio recording এর file size কমানোর জন্য।
## আগে কী ছিল, কী করতে চেয়েছিলাম
আমাদের প্রোডাক্টে একটা feature আছে — spoken question। Candidate মাইক্রোফোনে উত্তর বলে, সেটা record হয়ে server এ upload হয়। পরে examiner সেই audio শুনে marking করেন।
আগে recording হতো WAV format এ। WAV uncompressed format — audio quality ভালো, কিন্তু file size অনেক বড়। একটা ২ মিনিটের recording ও হয়ে যেতো অনেক MB। এটা upload এ সময় নেয়, bandwidth খরচ করে, storage ও বেশি লাগে।
তাই আমরা plan করলাম compressed format এ যাবো। প্রথমে Opus নিয়ে কিছু spike করলাম। Opus খুবই efficient codec, file size অনেক ছোট হয়। কিন্তু একটা সমস্যা দেখলাম — Opus এর recorded file এ duration metadata ঠিকমতো থাকে না। Browser এ play করলে duration Infinity দেখায়।
তারপর চোখ পড়লো AAC এর দিকে। AAC compressed, file size ছোট, আর Chrome এ audio/mp4 (AAC) MediaRecorder support করে। Test করলাম Chrome এ — সুন্দর কাজ করছে। Duration ঠিকঠাক আসছে, file size ছোট, upload ও দ্রুত হচ্ছে।
Release করে দিলাম, ছুটিতে চলে গেলাম। মনে হলো সব ঠিক আছে।
## সমস্যাটা কোথায় ছিল
ছুটি থেকে ফিরে যখন investigate শুরু করলাম, ধীরে ধীরে পুরো ছবিটা পরিষ্কার হলো।
আমাদের প্রোডাক্টে candidate দুইভাবে exam দেয় — একটা সাধারণ Chrome browser এ, আরেকটা আমাদের নিজস্ব desktop application এ যেটা Electron দিয়ে তৈরি। আর এখানেই গোলমাল হলো।
Chrome আর Chromium — দুটো দেখতে একই রকম, কিন্তু একটা গুরুত্বপূর্ণ পার্থক্য আছে। Chrome হলো Google এর commercial product, যেখানে Google AAC codec এর license নিয়ে integrate করে দিয়েছে। কিন্তু Chromium হলো open-source version, যেখানে patent/licensing restriction এর কারণে AAC codec থাকে না।
আর Electron? Electron তো Chromium এর উপর ই তৈরি — Chrome এর উপর না।
তাই যা হলো:
- Chrome browser এ exam দিলে: audio/mp4 (AAC) ঠিকঠাক কাজ করছে
- Electron desktop app এ exam দিলে: audio/mp4 request করা হচ্ছে, কিন্তু MediaRecorder চুপচাপ Opus codec এ fallback করে দিচ্ছে — কোনো error না দিয়ে!
মানে file upload হচ্ছে .m4a নামে, S3 এ Content-Type বসছে audio/mp4, কিন্তু ভেতরে আসলে WebM/Opus data। এই WebM/Opus file এ duration metadata নেই। তাই marking panel এ audio player duration দেখাচ্ছে Infinity, আর UI তে Infinity * 1000 calculate করতে গিয়ে দেখাচ্ছে NaN:NaN।
সবচেয়ে ভয়ের ব্যাপার হলো — MediaRecorder কোনো error throw করেনি। সে চুপচাপ অন্য codec এ record করে দিয়েছে। Silent failure — সবচেয়ে বিপজ্জনক ধরনের bug।
## AI এর কাছে সাহায্য চাইলাম
সমস্যাটা বুঝতে পারার পর আমি AI এর সাহায্য নিলাম। সমস্যার context, code structure, Electron version সব details share করলাম। AI বেশ ভালো কিছু solution propose করলো:
১. Electron build এ FFmpeg binary replace করা — Electron এর default FFmpeg build এ proprietary codec থাকে না। codec-enabled FFmpeg binary দিয়ে replace করলে AAC support পাওয়া যাবে।
২. Electron version upgrade করা — আমাদের Electron version বেশ পুরোনো। নতুন version এ upgrade করলে আরো অনেক সুবিধা পাওয়া যাবে।
৩. S3 তে থাকা ভুল format এর file গুলো migrate করা — Python script দিয়ে S3 scan করে WebM file detect করা (EBML header check), তারপর FFmpeg দিয়ে batch transcode করে আসল AAC/M4A তে convert করা।
সত্যি বলতে, এই solution গুলো technically সবই সঠিক এবং comprehensive। AI চমৎকারভাবে analyze করে দিয়েছিল।
কিন্তু একটা বড় সমস্যা ছিল — সময়।
আমাদের SLA আছে। Client কে নির্দিষ্ট সময়ের মধ্যে fix দিতে হবে। Electron build পরিবর্তন করা, FFmpeg binary manage করা, CI/CD pipeline update করা, তিনটা platform (macOS, Windows, Linux) এ test করা — এসব করতে অনেক সময় লাগবে। আর S3 migration তো আরো বড় কাজ। Licensing compliance check ও দরকার হবে AAC codec এর জন্য।
## আসল সমাধান — যেটা দিন বাঁচিয়ে দিলো
AI এর propose করা solution গুলো মাথায় রেখে আমি আবার সমস্যাটা গভীরভাবে ভাবলাম। AI কে আমার চিন্তার process share করলাম, একসাথে আলোচনা করলাম। তখন একটা জিনিস মাথায় এলো —
আমাদের আসল সমস্যা কী? Duration দেখা যাচ্ছে না।
আমাদের আসল target কী ছিল? File size কমানো।
Opus codec এ file size ঠিকই কম হচ্ছে — সেটা তো কাজ করছে! সমস্যা শুধু duration metadata তে। তাহলে Opus এর duration সমস্যাটাই যদি solve করা যায়?
Browser এর একটা interesting behavior আছে — যদি audio এর currentTime কে অনেক বড় একটা value তে set করা হয় (যেমন 1e101), তাহলে browser বাধ্য হয় পুরো file scan করে আসল duration বের করতে। তারপর currentTime আবার 0 তে ফিরিয়ে আনলেই হলো — এখন duration এ সঠিক মান থাকবে।
javascript
private static resolveFormat(): AudioRecordingFormat {
if (typeof MediaRecorder !== 'undefined'
&& MediaRecorder.isTypeSupported('audio/mp4')) {
return AudioRecorderUtil.AAC_FORMAT;
}
return AudioRecorderUtil.WAV_FALLBACK_FORMAT;
}
এতে ভবিষ্যতে আর silent fallback হবে না। Browser AAC support না করলে সরাসরি WAV এ যাবে।
SLA এর মধ্যেই fix deliver করা গেলো। Client খুশি, team খুশি, আমিও স্বস্তি পেলাম।
## শেখার জিনিস — AI কে blindly trust করবেন না
এই পুরো অভিজ্ঞতা থেকে আমি একটা গুরুত্বপূর্ণ জিনিস আবারও বুঝলাম:
AI অসাধারণ tool, কিন্তু সে আপনার architecture knowledge আর experience এর বিকল্প না।
AI আমাকে technically correct solution দিয়েছিল — FFmpeg replace, Electron upgrade, S3 migration। এগুলো সবই valid approach। কিন্তু AI জানতো না আমাদের SLA কতটা tight, Electron build pipeline কতটা complex, আর migration করতে কত resource লাগবে।
AI কে যখন আমি আমার perspective থেকে সমস্যাটা ভাবতে বললাম — "আমাদের আসল target কী, আর সবচেয়ে কম effort এ কীভাবে solve করা যায়" — তখন সে অনেক ভালো সাহায্য করতে পারলো।
এটাই পার্থক্য:
- AI blindly use করলে: আপনি পাবেন generic, comprehensive কিন্তু often over-engineered solution
- AI smartly use করলে: আপনি পাবেন আপনার context এ সবচেয়ে effective solution
কিছু পরামর্শ যেটা আমি নিজে follow করি:
1. সমস্যা প্রথমে নিজে বোঝার চেষ্টা করুন — AI কে সমস্যা explain করার আগে নিজে ভাবুন। আপনার domain knowledge, system architecture এর understanding — এগুলো AI এর কাছে নেই।
2. AI কে context দিন — শুধু "এটা fix করো" না বলে, বলুন কেন এটা সমস্যা, কী constraint আছে, কতটুকু সময় আছে। যত ভালো context দেবেন, তত ভালো output পাবেন।
3. AI এর output কে starting point হিসেবে নিন, final answer হিসেবে না — AI যা বলে সেটা verify করুন, আপনার experience দিয়ে filter করুন।
4. Problem solving skill develop করতে থাকুন — AI আপনার tool, আপনার replacement না। আজকে AI যে solution দিতে পারেনি সেটা আপনার experience থেকে এসেছে। এই skill টা অমূল্য।
5. Silent failure সম্পর্কে সচেতন থাকুন — এই incident এর মূলে ছিল MediaRecorder এর silent fallback। যেকোনো system এ silent failure সবচেয়ে বিপজ্জনক। সবসময় verify করুন — আপনি যা expect করছেন, সত্যিই কি তাই হচ্ছে?
## শেষ কথা
Technology প্রতিনিয়ত বদলাচ্ছে। AI আমাদের কাজকে অনেক সহজ এবং দ্রুত করে দিচ্ছে — এটা অস্বীকার করার উপায় নেই। কিন্তু একজন ভালো developer হতে হলে এখনো দরকার — গভীর understanding, critical thinking, আর সমস্যা সমাধানের দক্ষতা।
AI কে ব্যবহার করুন, কিন্তু smartly। নিজের শেখা বন্ধ করবেন না। কারণ শেষ পর্যন্ত, একটা ছোট্ট currentTime = 1e101 যে দিন বাঁচিয়ে দিতে পারে — সেটা বুঝতে হলে আপনার নিজের অভিজ্ঞতা আর বোঝাপড়া লাগবে।
AI আপনার সেরা সহকর্মী হতে পারে — কিন্তু driver's seat এ আপনাকেই থাকতে হবে।
Comments (0)
Login to leave a comment.