কল্পনা করুন, আপনি সিউলের কোনো সরবরাহকারী বা সাও পাওলোর কোনো গ্রাহকের সাথে একটি ভিডিও কলে যোগ দিচ্ছেন এবং ঠিক সেভাবেই কথা বলছেন যেভাবে আপনি পাশের ঘরে থাকা কোনো সহকর্মীর সাথে কথা বলেন। কোনো দোভাষী মিউট হয়ে বসে নেই। চ্যাট বক্সে টাইপ করার জন্য কেউ কিবোর্ডের ওপর ঝুঁকে নেই। রিয়েল-টাইম AI ভয়েস ট্রান্সলেশন এখন এটি সম্ভব করে তুলছে। মানুষের মধ্যকার সংযোগকে প্রতিস্থাপন করার পরিবর্তে, এটি মানুষের মাঝে থাকা বাধার দেয়ালগুলো সরিয়ে দিচ্ছে। কিন্তু এমন একটি সিস্টেম তৈরি করা যা সত্যিই একটি স্বাভাবিক কথোপকথনের মতো মনে হয়, তা অত্যন্ত কঠিন। আপনি কেবল শব্দ পরিবর্তন করছেন না; আপনি সফটওয়্যারের ভেতরে মানুষের কথার প্রবাহকে পুনর্গঠন করছেন।
পাইপলাইনের পাঁচটি স্তর
একটি কার্যকর সিস্টেম পাঁচটি স্বতন্ত্র অংশে বিভক্ত। এর একটিকেও বাদ দিলে বা দুর্বল করলে পুরো ধারণাটি ভেঙে পড়বে।
Voice Communication Layer হলো এর ভিত্তি। এটি মাইক্রোফোন ক্যাপচার, নয়েজ সাপ্রেশন (noise suppression), ইকো ক্যানসেলেশন (echo cancellation) এবং ইন্টারনেটের মাধ্যমে প্যাকেট ট্রান্সমিশন পরিচালনা করে। এটিকে একটি ডিজিটাল ফোন লাইন হিসেবে ভাবুন। যদি এই লেয়ারটি প্যাকেট ড্রপ করে বা জिटर (jitter) তৈরি করে, তবে পাইপলাইনের বাকি অংশগুলো অকেজো হয়ে পড়বে। বেশিরভাগ টিম এখানে WebRTC ব্যবহার করে কারণ এটি পিয়ার-টু-পিয়ার কানেকশন পরিচালনা করতে পারে এবং এতে বিল্ট-ইন অ্যাকোস্টিক সুরক্ষা ব্যবস্থা রয়েছে।
এরপর আসে Speech-to-Text (STT)। আপনাকে আগত শব্দকে যত দ্রুত সম্ভব লিখিত শব্দে রূপান্তর করতে হবে। স্ট্রিমিং STT ইঞ্জিনগুলো নীরবতার জন্য অপেক্ষা করে না। সিলেবল (syllable) আসার সাথে সাথেই তারা আংশিক ট্রান্সক্রিপ্ট প্রদান করে। এই আচরণটি অত্যন্ত জরুরি। যদি আপনার STT মডিউল কোনো বিরতি না পাওয়া পর্যন্ত বাফার করে, তবে আপনি ইতিমধ্যেই মূল্যবান মিলিসেকেন্ড হারিয়ে ফেলেছেন। আধুনিক স্ট্রিমিং ইমপ্লিমেন্টেশনগুলো আগত অডিও ক্রমাগত প্রসেস করে এবং আরও প্রেক্ষাপট (context) পাওয়ার সাথে সাথে তাদের অনুমানগুলো সংশোধন করে।
Machine Translation (MT) মাঝখানে অবস্থান করে। এটি কাঁচা টেক্সট গ্রহণ করে এবং তা লক্ষ্য ভাষায় (target language) পুনরায় লেখে। শুরুর দিকের সিস্টেমগুলো কেবল শব্দ বা বাক্যাংশ পরিবর্তনের চেয়ে বেশি কিছু করতে পারত না। বর্তমানের ট্রান্সফরমার-ভিত্তিক (transformer-based) মডেলগুলো সিনট্যাক্স এবং লং-রেঞ্জ ডিপেন্ডেন্সি (long-range dependencies) অনেক ভালোভাবে সামলাতে পারে, তবে এগুলোর জন্য সতর্ক ইন্টিগ্রেশন প্রয়োজন। আপনার এমন একটি MT মডিউল প্রয়োজন যা স্ট্রিমিং ইনপুট গ্রহণ করতে পারে, যাতে বক্তা কথা শেষ করার আগেই এটি বাক্যাংশের অনুবাদ শুরু করতে পারে।
এরপর রয়েছে Text-to-Speech (TTS)। এখানেই আপনার সিস্টেম তার নিজস্ব কণ্ঠস্বর খুঁজে পায়। পুরনো কনক্যাটিনেটিভ (concatenative) TTS শুনতে অনেকটা হাইওয়ে এক্সিট ঘোষণা করা কোনো GPS-এর মতো লাগত। নিউরাল TTS মডেলগুলো সরাসরি স্পেকট্রোগ্রাম (spectrogram) বা র (raw) ওয়েভফর্ম প্রেডিক্ট করার মাধ্যমে পুরো বিষয়টি বদলে দিয়েছে। এগুলো এমন কণ্ঠস্বর তৈরি করে যা ওঠানামা করে এবং প্রাণবন্ত মনে হয়। এগুলো কিছুটা আবেগীয় ভাবও (emotional coloring) বজায় রাখতে পারে, যা অত্যন্ত গুরুত্বপূর্ণ; কারণ রোবোটিক একঘেয়ে সুরে দেওয়া একটি নিরস ক্ষমা প্রার্থনা অনিচ্ছাকৃতভাবে বিদ্রূপাত্মক মনে হতে পারে।
সবশেষে, Audio Streaming লেয়ারটি অনুবাদিত কথাটি শ্রোতার কাছে পৌঁছে দেয়। এখানে টাইমিংও অত্যন্ত গুরুত্বপূর্ণ। সিন্থেসাইজড অডিওর সাথে নেটওয়ার্ক টাইমিংয়ের সামঞ্জস্য থাকতে হবে যাতে এটি খুব দ্রুত এসে ইকো (echo) তৈরি না করে, অথবা খুব দেরিতে এসে শ্রোতাকে নীরবতার মাঝে ফেলে না রাখে।
ল্যাটেন্সি বা বিলম্বের সমস্যা
ল্যাটেন্সি হলো আপনার সবচেয়ে বড় শত্রু। মানুষের কথোপকথন কেবল সামান্য বিরতি সহ্য করতে পারে। যদি সিস্টেমটি অনুবাদ শুরু করার আগে ব্যবহারকারীর পুরো বাক্য শেষ করার জন্য অপেক্ষা করে, তবে কথোপকথনটি ধীর এবং বিচ্ছিন্ন মনে হবে। মানুষ একে অপরের কথার ওপর কথা বলতে শুরু করবে, অথবা আরও খারাপ হলো, তারা ওয়াকি-টকির মতো যান্ত্রিক ছন্দে কথা বলা শুরু করবে। আপনার লক্ষ্য হওয়া উচিত এন্ড-টু-এন্ড (end-to-end) মোট ল্যাটেন্সি এক সেকেন্ডের নিচে রাখা।
এই লক্ষ্যমাত্রা অর্জনের জন্য আপনাকে অডিওকে ছোট ছোট চাঙ্কে (chunk) প্রসেস করতে হবে। চাঙ্কের আকার ২০ মিলিসেকেন্ড থেকে ১০০ মিলিসেকেন্ডের মধ্যে রাখুন। ২০ মিলিসেকেন্ড একটি ব্যঞ্জনবর্ণের শব্দের (consonant sound) প্রায় স্থায়িত্ব ধারণ করে। ১০০ মিলিসেকেন্ড প্রায় দেড়টি সিলেবল ধারণ করে। এই চাঙ্কগুলোকে একটি স্ট্রিমিং পাইপলাইনে ইনপুট দিন যাতে STT, অনুবাদ এবং TTS সবই আংশিক তথ্যের ওপর ভিত্তি করে কাজ করতে পারে। কোনো কিছুকেই একটি বাক্য শেষ হওয়ার জন্য অপেক্ষা করতে দেওয়া উচিত নয়।
প্রতিটি ধাপে স্ট্রিমিং অডিও প্রসেসিং ব্যবহার করুন। এর মানে হলো STT ইঞ্জিন ক্রমাগত আংশিক ট্রান্সক্রিপ্ট প্রদান করবে, MT ইঞ্জিন একটি সুসংগত ক্লজ (clause) গঠনের জন্য যথেষ্ট শব্দ পাওয়ার সাথে সাথেই তার অংশগুলো অনুবাদ করবে এবং TTS ইঞ্জিন বাক্যের দ্বিতীয় অংশটি ডিকোড হওয়ার আগেই প্রথম অংশটি বলা শুরু করবে।
এক সেকেন্ডের কম ল্যাটেন্সি অর্জনের জন্য প্রতিটি ধাপে—ক্যাপচার, এনকোড, ট্রান্সমিট, কিউ (queue), প্রসেস, সিন্থেসাইজ এবং প্লেব্যাক—কঠোর শৃঙ্খলা প্রয়োজন। প্রতিটি ধাপে অপ্রয়োজনীয় বাফারিং বাদ দিন। উদাহরণস্বরূপ, একান্ত প্রয়োজন না হলে এমন নয়েজ-রিমুভাল অ্যালগরিদম ব্যবহার করবেন না যার জন্য আধা সেকেন্ডের 'লুকঅ্যাহেড' (lookahead) প্রয়োজন। র (raw) PCM-এর পরিবর্তে Opus-এর মতো দক্ষ কমপ্রেশন প্রোটোকল ব্যবহার করুন। নেটওয়ার্ক রাউন্ড ট্রিপ ছোট রাখতে কলকারীদের ভৌগোলিকভাবে কাছাকাছি থাকা এজ সার্ভারে (edge servers) ইনফারেন্স (inference) চালান।
যেখানে AI মডেলগুলো এখনও হিমশিম খাচ্ছে
AI এমন কিছু নির্দিষ্ট বাধা নিয়ে আসে যা সাধারণ কপি-পেস্ট করা অনুবাদকদের (clipboard translators) কখনও মোকাবিলা করতে হয়নি।
প্রেক্ষাপট বোঝা সত্যিই কঠিন। ইংরেজিতে 'duck' শব্দটি একটি প্রাণী হতে পারে, মাথা নিচু করার একটি ক্রিয়া হতে পারে, এমনকি কিছু উপভাষায় এটি আদরের সম্বোধনও হতে পারে। একটি ইঞ্জিন যদি শব্দটি বিচ্ছিন্নভাবে দেখে, তবে সেটি ভুল অনুমান করতে পারে। স্ট্রিমিং অ্যামপ্লিফিকেশন (Streaming amplification) বিষয়টিকে আরও কঠিন করে তোলে কারণ পুরো বাক্যটি অর্থ স্পষ্ট করার আগেই সিস্টেমটিকে একটি শব্দ নিয়ে সিদ্ধান্ত নিতে হয়। কিছু টিম এই সমস্যা সমাধানের জন্য STT ইঞ্জিনে ছোট 'রোলব্যাক উইন্ডো' (rollback windows) তৈরি করে, যা পরে অডিওর পরিবর্তনের ভিত্তিতে ট্রান্সক্রিপ্ট সংশোধন করার সুযোগ দেয়।
ইঞ্জিনিয়াররা যতটা আশা করেন, কণ্ঠস্বরের স্বাভাবিকতা তার চেয়েও বেশি গুরুত্বপূর্ণ। মানুষ রোবোটিক শব্দ অপছন্দ করে। নিউরাল TTS মডেলগুলো মানুষের কথার প্রসোডি প্যাটার্ন (prosody patterns) ক্লোন করার মাধ্যমে কণ্ঠে আবেগ বজায় রাখে। যদি মূল বক্তা উত্তেজিত বা চিন্তিত থাকেন, তবে অনুবাদিত আউটপুটটিও যেন আবহাওয়ার রিপোর্টের মতো যান্ত্রিক না হয়ে সেই শক্তি বা আবেগ বহন করে। সোর্স অডিও থেকে পাংচুয়েশন কিউ (punctuation cues) বা ইনটোনেশন মার্কারগুলো (intonation markers) TTS মডিউলে পাস করলে সেই মানবিক ছোঁয়া বজায় রাখতে সাহায্য করে।
কথোপকথন সবসময় অগোছালো হয়। মানুষ একে অপরকে বাধা দেয়, কথা গুছিয়ে বলতে গিয়ে থেমে যায়, "uh" বলে বা অসম্পূর্ণ বাক্য শুরু করে। এই বিরতিগুলো বুদ্ধিমত্তার সাথে সামলানোর জন্য আপনার সিস্টেমে Voice Activity Detection (VAD) থাকা প্রয়োজন। একটি ভালো VAD প্রকৃত কথা এবং ব্যাকগ্রাউন্ড নয়েজের মধ্যে পার্থক্য করতে পারে, সেইসাথে একটি বাক্যের মাঝখানের সংক্ষিপ্ত বিরতি এবং কথা শেষ হওয়ার মধ্যকার পার্থক্যও বুঝতে পারে। যদি VAD অতিরিক্ত সংবেদনশীল হয়, তবে এটি উত্তরের শুরুর অংশ কেটে ফেলে। আর যদি এটি খুব বেশি সতর্ক হয়, তবে এটি ট্রান্সলেশন ইঞ্জিনে নীরবতা পাঠিয়ে দেয়, যা কম্পিউটেশন নষ্ট করে এবং কথোপকথনের প্রবাহে অদ্ভুত গ্যাপ তৈরি করে।
স্কেল এবং নিরাপত্তা
প্রথম আর্কিটেকচারাল স্কেচ থেকেই স্কেলিংয়ের কথা মাথায় রেখে তৈরি করুন। একটি মনোলিথ (monolith) সিস্টেম যা একটি কল মসৃণভাবে অনুবাদ করতে পারে, তা হাজার হাজার সমসাময়িক কথোপকথনের চাপে ভেঙে পড়বে। মাইক্রোসার্ভিসেস (microservices) ব্যবহার করুন যাতে আপনি প্রতিটি ধাপ স্বাধীনভাবে স্কেল করতে পারেন। যদি আপনার TTS কিউ (queue) ব্যাকআপ হয়ে যায় কারণ একটি ভাষার ধ্বনিগত জটিলতা অন্যটির চেয়ে বেশি, তবে আপনি STT ক্লাস্টার স্পর্শ না করেই আরও বেশি TTS ওয়ার্কার (workers) চালু করতে পারবেন। যদি আপনার MT সার্ভিস কোনো নির্দিষ্ট ভাষা জোড়ার ক্ষেত্রে হিমশিম খায়, তবে আপনি কেবল সেই কম্পোনেন্টটি আলাদা করে স্কেল করতে পারবেন।
নিরাপত্তা নিয়ে কোনো আপস করা যাবে না। ভয়েস ডেটা হলো বায়োমেট্রিক এবং অত্যন্ত ব্যক্তিগত। ট্রান্সমিটের সময় র (raw) অডিও সুরক্ষিত রাখতে এন্ড-টু-এন্ড এনক্রিপশন ব্যবহার করুন। যদি আপনার কাছে কোনো নির্দিষ্ট এবং প্রকাশ্য কারণ না থাকে, যেমন মডেল উন্নতির জন্য ব্যবহারকারীর স্পষ্ট সম্মতি, তবে র অডিও ডেটা সংরক্ষণ করবেন না। এমনকি সেক্ষেত্রেও, রেকর্ডিংগুলো এনক্রিপ্ট করে রাখুন এবং একটি নির্দিষ্ট সময়সূচী অনুযায়ী সেগুলো মুছে ফেলুন। একটি ভয়েস ট্রান্সলেশন সিস্টেম যদি কলের বিষয়বস্তু ফাঁস করে বা গোপনে কথোপকথন জমিয়ে রাখে, তবে তা ব্যবহারকারীর আস্থা চিরতরে নষ্ট করে দেয়।
তৈরি করা শুরু করুন
ডেভেলপারদের কাছে এখন ওপেন-সোর্স STT মডেল, ক্লাউড-ভিত্তিক MT API এবং প্রি-ট্রেইনড নিউরাল TTS চেকপয়েন্ট রয়েছে, যা কয়েক বছর আগেও পাওয়া অসম্ভব ছিল। প্রয়োজনীয় সব উপকরণ এখন হাতের কাছেই আছে। আর্কিটেকচারটিও এখন বোঝা সম্ভব।
ছোট থেকে শুরু করুন। মাইক্রোফোনের দুই সেকেন্ডের অডিও একটি স্ট্রিমিং STT ইঞ্জিনের মাধ্যমে প্রবাহিত করুন।
