feat: Support dynamic switching between English and Bangla in voice recognition - Default starts in English (en-US), added 'recognise bangla' to switch to Bangla (bn-BD), and 'ইংরেজিতে করো' to switch back to English, enhanced language handlers for multi-language support.

هذا الالتزام موجود في:
AkibHossainOmi
2025-04-27 07:26:13 +06:00
الأصل 79ec677b86
التزام ca9ef96cc5

عرض الملف

@@ -4,70 +4,138 @@ let isWebkitSpeechRecognitionSupported = false;
let recognition; let recognition;
let isVoiceCommandsEnabled = true; let isVoiceCommandsEnabled = true;
let browserLanguage = navigator.language || navigator.userLanguage; let browserLanguage = navigator.language || navigator.userLanguage;
let isVoiceCommandSupported = browserLanguage.includes('en-'); let isVoiceCommandSupported = browserLanguage.includes('en-') || browserLanguage.includes('bn-');
let currentLanguage = 'en';
let currentLangCode = 'en-US';
const speechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; const speechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
/** /**
* Enable real-time voice recognition in the chat, allowing you to execute commands using your voice. * Enable real-time voice recognition in the chat, allowing you to execute commands using your voice.
* Note: Currently, it supports only the English language. * Note: Currently, it supports only the English and Bangla language.
* TODO make it multi languages... * TODO add more languages...
*/ */
const commands = { const languageHandlers = {
shareRoom: 'room', en: {
hideMe: 'hide me', langCode: 'en-US',
showMe: 'show me', commands: {
newRoom: 'new room', shareRoom: 'room',
leaveRoom: 'exit the room', hideMe: 'hide me',
audioOn: 'start the audio', showMe: 'show me',
audioOff: 'stop the audio', newRoom: 'new room',
videoOn: 'start the video', leaveRoom: 'exit the room',
videoOff: 'stop the video', audioOn: 'start the audio',
screenOn: 'start the screen', audioOff: 'stop the audio',
screenOff: 'stop the screen', videoOn: 'start the video',
chatOn: 'open the chat', videoOff: 'stop the video',
chatSend: 'send', screenOn: 'start the screen',
chatOff: 'close the chat', screenOff: 'stop the screen',
pollOn: 'open the poll', chatOn: 'open the chat',
pollOff: 'close the poll', chatSend: 'send',
editorOn: 'open the editor', chatOff: 'close the chat',
editorOff: 'close the editor', pollOn: 'open the poll',
toggleTr: 'toggle transcription', pollOff: 'close the poll',
whiteboardOn: 'open the whiteboard', editorOn: 'open the editor',
whiteboardOff: 'close the whiteboard', editorOff: 'close the editor',
snapshotRoom: 'Snapshot room', toggleTr: 'toggle transcription',
recordingOn: 'start the recording', whiteboardOn: 'open the whiteboard',
recordingPause: 'pause the recording', whiteboardOff: 'close the whiteboard',
recordingResume: 'resume the recording', snapshotRoom: 'Snapshot room',
recordingOff: 'stop the recording', recordingOn: 'start the recording',
settingsOn: 'open the settings', recordingPause: 'pause the recording',
settingsOff: 'close the settings', recordingResume: 'resume the recording',
participantsOn: 'show the participants', recordingOff: 'stop the recording',
participantsOff: 'hide the participants', settingsOn: 'open the settings',
participantsVideoOff: 'stop the participants video', settingsOff: 'close the settings',
participantsAudioOff: 'stop the participants audio', participantsOn: 'show the participants',
participantsKickOut: 'kick out the participants', participantsOff: 'hide the participants',
fileShareOn: 'open a file', participantsVideoOff: 'stop the participants video',
fileShareOff: 'close a file', participantsAudioOff: 'stop the participants audio',
videoShareOn: 'share the video', participantsKickOut: 'kick out the participants',
videoShareOff: 'close the video', fileShareOn: 'open a file',
swapCamera: 'swap the camera', fileShareOff: 'close a file',
raiseHand: 'raise the hand', videoShareOn: 'share the video',
lowerHand: 'lower the hand', videoShareOff: 'close the video',
roomLock: 'lock the room', swapCamera: 'swap the camera',
roomUnlock: 'unlock the room', raiseHand: 'raise the hand',
about: 'show the about', lowerHand: 'lower the hand',
email: 'open email', roomLock: 'lock the room',
google: 'open google', roomUnlock: 'unlock the room',
googleTr: 'open google translate', about: 'show the about',
youtube: 'open youtube', email: 'open email',
facebook: 'open facebook', google: 'open google',
linkedin: 'open linkedin', googleTr: 'open google translate',
twitter: 'open twitter', youtube: 'open youtube',
tiktok: 'open tiktok', facebook: 'open facebook',
github: 'open github', linkedin: 'open linkedin',
survey: 'open survey', twitter: 'open twitter',
stopRecognition: 'stop the voice recognition', tiktok: 'open tiktok',
github: 'open github',
survey: 'open survey',
recognizeBangla: 'recognise bangla',
stopRecognition: 'stop the voice recognition',
},
},
bn: {
langCode: 'bn-BD',
commands: {
shareRoom: 'রুম শেয়ার করো',
hideMe: 'আমাকে লুকাও',
showMe: 'আমাকে দেখাও',
newRoom: 'নতুন রুম',
leaveRoom: 'রুম থেকে বের হও',
audioOn: 'অডিও চালু করো',
audioOff: 'অডিও বন্ধ করো',
videoOn: 'ভিডিও চালু করো',
videoOff: 'ভিডিও বন্ধ করো',
screenOn: 'স্ক্রিন চালু করো',
screenOff: 'স্ক্রিন বন্ধ করো',
chatOn: 'চ্যাট খুলো',
chatSend: 'পাঠাও',
chatOff: 'চ্যাট বন্ধ করো',
pollOn: 'পোল খুলো',
pollOff: 'পোল বন্ধ করো',
editorOn: 'এডিটর খুলো',
editorOff: 'এডিটর বন্ধ করো',
toggleTr: 'ট্রান্সক্রিপশন চালু/বন্ধ করো',
whiteboardOn: 'হোয়াইটবোর্ড খুলো',
whiteboardOff: 'হোয়াইটবোর্ড বন্ধ করো',
snapshotRoom: 'রুমের ছবি তুলো',
recordingOn: 'রেকর্ডিং শুরু করো',
recordingPause: 'রেকর্ডিং বিরতি দাও',
recordingResume: 'রেকর্ডিং আবার শুরু করো',
recordingOff: 'রেকর্ডিং বন্ধ করো',
settingsOn: 'সেটিংস খুলো',
settingsOff: 'সেটিংস বন্ধ করো',
participantsOn: 'অংশগ্রহণকারীদের দেখাও',
participantsOff: 'অংশগ্রহণকারীদের লুকাও',
participantsVideoOff: 'অংশগ্রহণকারীদের ভিডিও বন্ধ করো',
participantsAudioOff: 'অংশগ্রহণকারীদের অডিও বন্ধ করো',
participantsKickOut: 'অংশগ্রহণকারীদের বের করে দাও',
fileShareOn: 'ফাইল খুলো',
fileShareOff: 'ফাইল বন্ধ করো',
videoShareOn: 'ভিডিও শেয়ার করো',
videoShareOff: 'ভিডিও বন্ধ করো',
swapCamera: 'ক্যামেরা পরিবর্তন করো',
raiseHand: 'হাত তুলো',
lowerHand: 'হাত নামাও',
roomLock: 'রুম লক করো',
roomUnlock: 'রুম আনলক করো',
about: 'সম্পর্কিত দেখাও',
email: 'ইমেইল খুলো',
google: 'গুগল খুলো',
googleTr: 'গুগল অনুবাদ খুলো',
youtube: 'ইউটিউব খুলো',
facebook: 'ফেসবুক খুলো',
linkedin: 'লিঙ্কডইন খুলো',
twitter: 'টুইটার খুলো',
tiktok: 'টিকটক খুলো',
github: 'গিটহাব খুলো',
survey: 'সার্ভে খুলো',
recognizeEnglish: 'ইংরেজিতে করো',
stopRecognition: 'ভয়েস রিকগনিশন বন্ধ করো',
},
},
}; };
const browser = { const browser = {
@@ -88,7 +156,7 @@ if (speechRecognition) {
recognition.maxAlternatives = 1; recognition.maxAlternatives = 1;
recognition.continuous = true; recognition.continuous = true;
recognition.lang = browserLanguage; setRecognitionLanguage(recognition, currentLangCode);
console.log('Speech recognition', recognition); console.log('Speech recognition', recognition);
@@ -104,7 +172,7 @@ if (speechRecognition) {
let current = e.resultIndex; let current = e.resultIndex;
let transcript = e.results[current][0].transcript; let transcript = e.results[current][0].transcript;
if (transcript) { if (transcript) {
if (transcript.trim().toLowerCase() != commands.chatSend) { if (transcript.trim().toLowerCase() != languageHandlers[currentLanguage].commands.chatSend) {
chatMessage.value = transcript; chatMessage.value = transcript;
} }
if (isVoiceCommandsEnabled && isVoiceCommandSupported) { if (isVoiceCommandsEnabled && isVoiceCommandSupported) {
@@ -132,8 +200,17 @@ if (speechRecognition) {
console.warn('This browser not supports webkitSpeechRecognition'); console.warn('This browser not supports webkitSpeechRecognition');
} }
function setRecognitionLanguage(recognition, languageCode) {
if (!recognition) {
console.error('Recognition object is not defined.');
return;
}
recognition.lang = languageCode;
console.log(`Voice recognition language set to: ${languageCode}`);
}
function startSpeech() { function startSpeech() {
recognition.lang = browserLanguage; recognition.lang = languageHandlers[currentLanguage]?.langCode || 'en-US';
recognition.start(); recognition.start();
} }
@@ -143,229 +220,243 @@ function stopSpeech() {
function execVoiceCommands(transcript) { function execVoiceCommands(transcript) {
switch (transcript.trim().toLowerCase()) { switch (transcript.trim().toLowerCase()) {
case commands.shareRoom: case languageHandlers[currentLanguage].commands.shareRoom:
printCommand(commands.shareRoom); printCommand(languageHandlers[currentLanguage].commands.shareRoom);
shareButton.click(); shareButton.click();
break; break;
case commands.hideMe: case languageHandlers[currentLanguage].commands.hideMe:
printCommand(commands.hideMe); printCommand(languageHandlers[currentLanguage].commands.hideMe);
hideMeButton.click(); hideMeButton.click();
break; break;
case commands.showMe: case languageHandlers[currentLanguage].commands.showMe:
printCommand(commands.showMe); printCommand(languageHandlers[currentLanguage].commands.showMe);
hideMeButton.click(); hideMeButton.click();
break; break;
case commands.newRoom: case languageHandlers[currentLanguage].commands.newRoom:
printCommand(commands.newRoom); printCommand(languageHandlers[currentLanguage].commands.newRoom);
openURL(browser.newroom); openURL(browser.newroom);
break; break;
case commands.leaveRoom: case languageHandlers[currentLanguage].commands.leaveRoom:
printCommand(commands.leaveRoom); printCommand(languageHandlers[currentLanguage].commands.leaveRoom);
exitButton.click(); exitButton.click();
break; break;
case commands.audioOn: case languageHandlers[currentLanguage].commands.audioOn:
printCommand(commands.audioOn); printCommand(languageHandlers[currentLanguage].commands.audioOn);
startAudioButton.click(); startAudioButton.click();
break; break;
case commands.audioOff: case languageHandlers[currentLanguage].commands.audioOff:
printCommand(commands.audioOff); printCommand(languageHandlers[currentLanguage].commands.audioOff);
stopAudioButton.click(); stopAudioButton.click();
break; break;
case commands.videoOn: case languageHandlers[currentLanguage].commands.videoOn:
printCommand(commands.videoOn); printCommand(languageHandlers[currentLanguage].commands.videoOn);
startVideoButton.click(); startVideoButton.click();
break; break;
case commands.videoOff: case languageHandlers[currentLanguage].commands.videoOff:
printCommand(commands.videoOff); printCommand(languageHandlers[currentLanguage].commands.videoOff);
stopVideoButton.click(); stopVideoButton.click();
break; break;
case commands.screenOn: case languageHandlers[currentLanguage].commands.screenOn:
printCommand(commands.screenOn); printCommand(languageHandlers[currentLanguage].commands.screenOn);
startScreenButton.click(); startScreenButton.click();
break; break;
case commands.screenOff: case languageHandlers[currentLanguage].commands.screenOff:
printCommand(commands.screenOff); printCommand(languageHandlers[currentLanguage].commands.screenOff);
stopScreenButton.click(); stopScreenButton.click();
break; break;
case commands.chatOn: case languageHandlers[currentLanguage].commands.chatOn:
printCommand(commands.chatOn); printCommand(languageHandlers[currentLanguage].commands.chatOn);
chatButton.click(); chatButton.click();
break; break;
case commands.pollOn: case languageHandlers[currentLanguage].commands.pollOn:
printCommand(commands.pollOn); printCommand(languageHandlers[currentLanguage].commands.pollOn);
pollButton.click(); pollButton.click();
break; break;
case commands.pollOff: case languageHandlers[currentLanguage].commands.pollOff:
printCommand(commands.pollOff); printCommand(languageHandlers[currentLanguage].commands.pollOff);
pollCloseBtn.click(); pollCloseBtn.click();
break; break;
case commands.editorOn: case languageHandlers[currentLanguage].commands.editorOn:
printCommand(commands.editorOn); printCommand(languageHandlers[currentLanguage].commands.editorOn);
editorButton.click(); editorButton.click();
break; break;
case commands.editorOff: case languageHandlers[currentLanguage].commands.editorOff:
printCommand(commands.editorOff); printCommand(languageHandlers[currentLanguage].commands.editorOff);
editorCloseBtn.click(); editorCloseBtn.click();
break; break;
case commands.chatSend: case languageHandlers[currentLanguage].commands.chatSend:
printCommand(commands.chatSend); printCommand(languageHandlers[currentLanguage].commands.chatSend);
chatSendButton.click(); chatSendButton.click();
break; break;
case commands.chatOff: case languageHandlers[currentLanguage].commands.chatOff:
printCommand(commands.chatOff); printCommand(languageHandlers[currentLanguage].commands.chatOff);
chatCloseButton.click(); chatCloseButton.click();
break; break;
case commands.toggleTr: case languageHandlers[currentLanguage].commands.toggleTr:
transcriptionButton.click(); transcriptionButton.click();
break; break;
case commands.whiteboardOn: case languageHandlers[currentLanguage].commands.whiteboardOn:
printCommand(commands.whiteboardOn); printCommand(languageHandlers[currentLanguage].commands.whiteboardOn);
whiteboardButton.click(); whiteboardButton.click();
break; break;
case commands.whiteboardOff: case languageHandlers[currentLanguage].commands.whiteboardOff:
printCommand(commands.whiteboardOff); printCommand(languageHandlers[currentLanguage].commands.whiteboardOff);
whiteboardCloseBtn.click(); whiteboardCloseBtn.click();
break; break;
case commands.snapshotRoom: case languageHandlers[currentLanguage].commands.snapshotRoom:
printCommand(commands.snapshotRoom); printCommand(languageHandlers[currentLanguage].commands.snapshotRoom);
snapshotRoomButton.click(); snapshotRoomButton.click();
break; break;
case commands.recordingOn: case languageHandlers[currentLanguage].commands.recordingOn:
printCommand(commands.recordingOn); printCommand(languageHandlers[currentLanguage].commands.recordingOn);
startRecButton.click(); startRecButton.click();
break; break;
case commands.recordingPause: case languageHandlers[currentLanguage].commands.recordingPause:
printCommand(commands.recordingPause); printCommand(languageHandlers[currentLanguage].commands.recordingPause);
pauseRecButton.click(); pauseRecButton.click();
break; break;
case commands.recordingResume: case languageHandlers[currentLanguage].commands.recordingResume:
printCommand(commands.recordingResume); printCommand(languageHandlers[currentLanguage].commands.recordingResume);
recordingResume.click(); recordingResume.click();
break; break;
case commands.recordingOff: case languageHandlers[currentLanguage].commands.recordingOff:
printCommand(commands.recordingOff); printCommand(languageHandlers[currentLanguage].commands.recordingOff);
stopRecButton.click(); stopRecButton.click();
break; break;
case commands.settingsOn: case languageHandlers[currentLanguage].commands.settingsOn:
printCommand(commands.settingsOn); printCommand(languageHandlers[currentLanguage].commands.settingsOn);
settingsButton.click(); settingsButton.click();
break; break;
case commands.settingsOff: case languageHandlers[currentLanguage].commands.settingsOff:
printCommand(commands.settingsOff); printCommand(languageHandlers[currentLanguage].commands.settingsOff);
mySettingsCloseBtn.click(); mySettingsCloseBtn.click();
break; break;
case commands.participantsOn: case languageHandlers[currentLanguage].commands.participantsOn:
printCommand(commands.participantsOn); printCommand(languageHandlers[currentLanguage].commands.participantsOn);
chatButton.click(); chatButton.click();
break; break;
case commands.participantsOff: case languageHandlers[currentLanguage].commands.participantsOff:
printCommand(commands.participantsOff); printCommand(languageHandlers[currentLanguage].commands.participantsOff);
chatCloseButton.click(); chatCloseButton.click();
break; break;
case commands.participantsVideoOff: case languageHandlers[currentLanguage].commands.participantsVideoOff:
printCommand(commands.participantsVideoOff); printCommand(languageHandlers[currentLanguage].commands.participantsVideoOff);
rc.peerAction('me', socket.id, 'hide', true, true); rc.peerAction('me', socket.id, 'hide', true, true);
break; break;
case commands.participantsAudioOff: case languageHandlers[currentLanguage].commands.participantsAudioOff:
printCommand(commands.participantsAudioOff); printCommand(languageHandlers[currentLanguage].commands.participantsAudioOff);
rc.peerAction('me', socket.id, 'mute', true, true); rc.peerAction('me', socket.id, 'mute', true, true);
break; break;
case commands.participantsKickOut: case languageHandlers[currentLanguage].commands.participantsKickOut:
printCommand(commands.participantsKickOut); printCommand(languageHandlers[currentLanguage].commands.participantsKickOut);
rc.peerAction('me', socket.id, 'eject', true, true); rc.peerAction('me', socket.id, 'eject', true, true);
break; break;
case commands.fileShareOn: case languageHandlers[currentLanguage].commands.fileShareOn:
printCommand(commands.fileShareOn); printCommand(languageHandlers[currentLanguage].commands.fileShareOn);
fileShareButton.click(); fileShareButton.click();
break; break;
case commands.fileShareOff: case languageHandlers[currentLanguage].commands.fileShareOff:
printCommand(commands.fileShareOff); printCommand(languageHandlers[currentLanguage].commands.fileShareOff);
sendAbortBtn.click(); sendAbortBtn.click();
break; break;
case commands.videoShareOn: case languageHandlers[currentLanguage].commands.videoShareOn:
printCommand(commands.videoShareOn); printCommand(languageHandlers[currentLanguage].commands.videoShareOn);
videoShareButton.click(); videoShareButton.click();
break; break;
case commands.videoShareOff: case languageHandlers[currentLanguage].commands.videoShareOff:
printCommand(commands.videoShareOff); printCommand(languageHandlers[currentLanguage].commands.videoShareOff);
videoCloseBtn.click(); videoCloseBtn.click();
break; break;
case commands.swapCamera: case languageHandlers[currentLanguage].commands.swapCamera:
printCommand(commands.swapCamera); printCommand(languageHandlers[currentLanguage].commands.swapCamera);
swapCameraButton.click(); swapCameraButton.click();
break; break;
case commands.raiseHand: case languageHandlers[currentLanguage].commands.raiseHand:
printCommand(commands.raiseHand); printCommand(languageHandlers[currentLanguage].commands.raiseHand);
raiseHandButton.click(); raiseHandButton.click();
break; break;
case commands.lowerHand: case languageHandlers[currentLanguage].commands.lowerHand:
printCommand(commands.lowerHand); printCommand(languageHandlers[currentLanguage].commands.lowerHand);
lowerHandButton.click(); lowerHandButton.click();
break; break;
case commands.roomLock: case languageHandlers[currentLanguage].commands.roomLock:
printCommand(commands.roomLock); printCommand(languageHandlers[currentLanguage].commands.roomLock);
lockRoomButton.click(); lockRoomButton.click();
break; break;
case commands.roomUnlock: case languageHandlers[currentLanguage].commands.roomUnlock:
printCommand(commands.roomUnlock); printCommand(languageHandlers[currentLanguage].commands.roomUnlock);
unlockRoomButton.click(); unlockRoomButton.click();
break; break;
case commands.about: case languageHandlers[currentLanguage].commands.about:
printCommand(commands.about); printCommand(languageHandlers[currentLanguage].commands.about);
aboutButton.click(); aboutButton.click();
break; break;
case commands.email: case languageHandlers[currentLanguage].commands.email:
printCommand(commands.email); printCommand(languageHandlers[currentLanguage].commands.email);
openURL(browser.email, true); openURL(browser.email, true);
sound('open'); sound('open');
break; break;
case commands.google: case languageHandlers[currentLanguage].commands.google:
printCommand(commands.google); printCommand(languageHandlers[currentLanguage].commands.google);
openURL(browser.google, true); openURL(browser.google, true);
sound('open'); sound('open');
break; break;
case commands.googleTr: case languageHandlers[currentLanguage].commands.googleTr:
printCommand(commands.googleTr); printCommand(languageHandlers[currentLanguage].commands.googleTr);
openURL(browser.googleTr, true); openURL(browser.googleTr, true);
sound('open'); sound('open');
break; break;
case commands.youtube: case languageHandlers[currentLanguage].commands.youtube:
printCommand(commands.youtube); printCommand(languageHandlers[currentLanguage].commands.youtube);
openURL(browser.youtube, true); openURL(browser.youtube, true);
sound('open'); sound('open');
break; break;
case commands.facebook: case languageHandlers[currentLanguage].commands.facebook:
printCommand(commands.facebook); printCommand(languageHandlers[currentLanguage].commands.facebook);
openURL(browser.facebook, true); openURL(browser.facebook, true);
sound('open'); sound('open');
break; break;
case commands.linkedin: case languageHandlers[currentLanguage].commands.linkedin:
printCommand(commands.linkedin); printCommand(languageHandlers[currentLanguage].commands.linkedin);
openURL(browser.linkedin, true); openURL(browser.linkedin, true);
sound('open'); sound('open');
break; break;
case commands.twitter: case languageHandlers[currentLanguage].commands.twitter:
printCommand(commands.twitter); printCommand(languageHandlers[currentLanguage].commands.twitter);
openURL(browser.twitter, true); openURL(browser.twitter, true);
sound('open'); sound('open');
break; break;
case commands.tiktok: case languageHandlers[currentLanguage].commands.tiktok:
printCommand(commands.tiktok); printCommand(languageHandlers[currentLanguage].commands.tiktok);
openURL(browser.tiktok, true); openURL(browser.tiktok, true);
sound('open'); sound('open');
break; break;
case commands.github: case languageHandlers[currentLanguage].commands.github:
printCommand(commands.github); printCommand(languageHandlers[currentLanguage].commands.github);
openURL(browser.github, true); openURL(browser.github, true);
sound('open'); sound('open');
break; break;
case commands.survey: case languageHandlers[currentLanguage].commands.survey:
printCommand(commands.survey); printCommand(languageHandlers[currentLanguage].commands.survey);
survey.enabled && openURL(survey.url, true); survey.enabled && openURL(survey.url, true);
sound('open'); sound('open');
break; break;
case commands.stopRecognition: case languageHandlers[currentLanguage].commands.recognizeBangla:
printCommand(commands.stopRecognition); printCommand(languageHandlers[currentLanguage].commands.recognizeBangla);
currentLanguage = 'bn';
setRecognitionLanguage(recognition, languageHandlers[currentLanguage].langCode);
recognition.stop();
setTimeout(() => recognition.start(), 300);
break;
case languageHandlers[currentLanguage].commands.recognizeEnglish:
printCommand(languageHandlers[currentLanguage].commands.recognizeBangla);
currentLanguage = 'en';
setRecognitionLanguage(recognition, languageHandlers[currentLanguage].langCode);
recognition.stop();
setTimeout(() => recognition.start(), 300);
break;
case languageHandlers[currentLanguage].commands.stopRecognition:
printCommand(languageHandlers[currentLanguage].commands.stopRecognition);
chatSpeechStopButton.click(); chatSpeechStopButton.click();
break; break;
// ... // ...