الملفات
codepill-sfu/public/js/SpeechRec.js
2025-04-27 08:10:10 +02:00

1093 أسطر
49 KiB
JavaScript

'use strict';
let recognition;
let isVoiceCommandsEnabled = true;
let currentLanguage = 'en';
let currentLangCode = 'en-US';
const browserLanguage = navigator.language || navigator.userLanguage;
const isVoiceCommandSupported =
browserLanguage.includes('en-') ||
browserLanguage.includes('bn-') ||
browserLanguage.includes('es-') ||
browserLanguage.includes('fr-') ||
browserLanguage.includes('it-') ||
browserLanguage.includes('de-') ||
browserLanguage.includes('ja-') ||
browserLanguage.includes('pt-') ||
browserLanguage.includes('zh-') ||
browserLanguage.includes('ar-');
const speechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
/**
* Enable real-time voice recognition in the chat, allowing you to execute commands using your voice.
* const supportedLanguages = ['en', 'bn', 'es', 'fr', 'it', 'de', 'ja', 'pt', 'zh', 'ar'];
*/
const languageHandlers = {
en: {
langCode: 'en-US',
commands: {
shareRoom: 'room',
hideMe: 'hide me',
showMe: 'show me',
newRoom: 'new room',
leaveRoom: 'exit the room',
audioOn: 'start the audio',
audioOff: 'stop the audio',
videoOn: 'start the video',
videoOff: 'stop the video',
screenOn: 'start the screen',
screenOff: 'stop the screen',
chatOn: 'open the chat',
chatSend: 'send',
chatOff: 'close the chat',
pollOn: 'open the poll',
pollOff: 'close the poll',
editorOn: 'open the editor',
editorOff: 'close the editor',
toggleTr: 'toggle transcription',
whiteboardOn: 'open the whiteboard',
whiteboardOff: 'close the whiteboard',
snapshotRoom: 'Snapshot room',
recordingOn: 'start the recording',
recordingPause: 'pause the recording',
recordingResume: 'resume the recording',
recordingOff: 'stop the recording',
settingsOn: 'open the settings',
settingsOff: 'close the settings',
participantsOn: 'show the participants',
participantsOff: 'hide the participants',
participantsVideoOff: 'stop the participants video',
participantsAudioOff: 'stop the participants audio',
participantsKickOut: 'kick out the participants',
fileShareOn: 'open a file',
fileShareOff: 'close a file',
videoShareOn: 'share the video',
videoShareOff: 'close the video',
swapCamera: 'swap the camera',
raiseHand: 'raise the hand',
lowerHand: 'lower the hand',
roomLock: 'lock the room',
roomUnlock: 'unlock the room',
about: 'show the about',
email: 'open email',
google: 'open google',
googleTr: 'open google translate',
youtube: 'open youtube',
facebook: 'open facebook',
linkedin: 'open linkedin',
twitter: 'open twitter',
tiktok: 'open tiktok',
github: 'open github',
survey: 'open survey',
recognizeBangla: 'recognize bangla',
recognizeItalian: 'recognize italian',
recognizeSpanish: 'recognize spanish',
recognizeFrench: 'recognize french',
recognizeGerman: 'recognize german',
recognizeJapanese: 'recognize japanese',
recognizePortuguese: 'recognize portuguese',
recognizeChinese: 'recognize chinese',
recognizeArabic: 'recognize arabic',
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: 'ইংরেজিতে করো',
recognizeItalian: 'ইতালীয় চেনা',
recognizeSpanish: 'স্পেনীয় চেনা',
recognizeFrench: 'ফরাসি চেনা',
recognizeGerman: 'জার্মান চেনা',
recognizeJapanese: 'জাপানি চেনা',
recognizePortuguese: 'পর্তুগিজ চেনা',
recognizeChinese: 'চীনা চেনা',
recognizeArabic: 'আরবি চেনা',
stopRecognition: 'ভয়েস রিকগনিশন বন্ধ করো',
},
},
es: {
langCode: 'es-ES',
commands: {
shareRoom: 'compartir sala',
hideMe: 'esconderme',
showMe: 'muéstrame',
newRoom: 'nueva sala',
leaveRoom: 'salir de la sala',
audioOn: 'activar audio',
audioOff: 'desactivar audio',
videoOn: 'activar video',
videoOff: 'desactivar video',
screenOn: 'activar pantalla',
screenOff: 'desactivar pantalla',
chatOn: 'abrir chat',
chatSend: 'enviar',
chatOff: 'cerrar chat',
pollOn: 'abrir encuesta',
pollOff: 'cerrar encuesta',
editorOn: 'abrir editor',
editorOff: 'cerrar editor',
toggleTr: 'alternar transcripción',
whiteboardOn: 'abrir pizarra',
whiteboardOff: 'cerrar pizarra',
snapshotRoom: 'capturar sala',
recordingOn: 'comenzar grabación',
recordingPause: 'pausar grabación',
recordingResume: 'reanudar grabación',
recordingOff: 'detener grabación',
settingsOn: 'abrir configuraciones',
settingsOff: 'cerrar configuraciones',
participantsOn: 'mostrar participantes',
participantsOff: 'ocultar participantes',
participantsVideoOff: 'desactivar video de participantes',
participantsAudioOff: 'desactivar audio de participantes',
participantsKickOut: 'expulsar participantes',
fileShareOn: 'abrir archivo',
fileShareOff: 'cerrar archivo',
videoShareOn: 'compartir video',
videoShareOff: 'dejar de compartir video',
swapCamera: 'cambiar cámara',
raiseHand: 'levantar la mano',
lowerHand: 'bajar la mano',
roomLock: 'bloquear la sala',
roomUnlock: 'desbloquear la sala',
about: 'mostrar información',
email: 'abrir correo',
google: 'abrir google',
googleTr: 'abrir google translate',
youtube: 'abrir youtube',
facebook: 'abrir facebook',
linkedin: 'abrir linkedin',
twitter: 'abrir twitter',
tiktok: 'abrir tiktok',
github: 'abrir github',
survey: 'abrir encuesta',
recognizeEnglish: 'reconocer inglés',
recognizeBangla: 'reconocer bengalí',
recognizeItalian: 'reconocer italiano',
recognizeSpanish: 'reconocer español',
recognizeFrench: 'reconocer francés',
recognizeGerman: 'reconocer alemán',
recognizeJapanese: 'reconocer japonés',
recognizePortuguese: 'reconocer portugués',
recognizeChinese: 'reconocer chino',
recognizeArabic: 'reconocer árabe',
stopRecognition: 'detener el reconocimiento de voz',
},
},
fr: {
langCode: 'fr-FR',
commands: {
shareRoom: 'partager la salle',
hideMe: 'cachez-moi',
showMe: 'montrez-moi',
newRoom: 'nouvelle salle',
leaveRoom: 'quitter la salle',
audioOn: "activer l'audio",
audioOff: "désactiver l'audio",
videoOn: 'activer la vidéo',
videoOff: 'désactiver la vidéo',
screenOn: "activer l'écran",
screenOff: "désactiver l'écran",
chatOn: 'ouvrir le chat',
chatSend: 'envoyer',
chatOff: 'fermer le chat',
pollOn: 'ouvrir le sondage',
pollOff: 'fermer le sondage',
editorOn: "ouvrir l'éditeur",
editorOff: "fermer l'éditeur",
toggleTr: 'basculer la transcription',
whiteboardOn: 'ouvrir le tableau blanc',
whiteboardOff: 'fermer le tableau blanc',
snapshotRoom: 'prendre une capture de la salle',
recordingOn: "commencer l'enregistrement",
recordingPause: "mettre en pause l'enregistrement",
recordingResume: "reprendre l'enregistrement",
recordingOff: "arrêter l'enregistrement",
settingsOn: 'ouvrir les paramètres',
settingsOff: 'fermer les paramètres',
participantsOn: 'afficher les participants',
participantsOff: 'masquer les participants',
participantsVideoOff: 'désactiver la vidéo des participants',
participantsAudioOff: "désactiver l'audio des participants",
participantsKickOut: 'expulser les participants',
fileShareOn: 'ouvrir le fichier',
fileShareOff: 'fermer le fichier',
videoShareOn: 'partager la vidéo',
videoShareOff: 'arrêter le partage de la vidéo',
swapCamera: 'changer de caméra',
raiseHand: 'lever la main',
lowerHand: 'baisser la main',
roomLock: 'verrouiller la salle',
roomUnlock: 'déverrouiller la salle',
about: 'montrer à propos',
email: 'ouvrir email',
google: 'ouvrir google',
googleTr: 'ouvrir google translate',
youtube: 'ouvrir youtube',
facebook: 'ouvrir facebook',
linkedin: 'ouvrir linkedin',
twitter: 'ouvrir twitter',
tiktok: 'ouvrir tiktok',
github: 'ouvrir github',
survey: 'ouvrir enquête',
recognizeEnglish: 'reconnaître anglais',
recognizeBangla: 'reconnaître bengali',
recognizeItalian: 'reconnaître italien',
recognizeSpanish: 'reconnaître espagnol',
recognizeFrench: 'reconnaître français',
recognizeGerman: 'reconnaître allemand',
recognizeJapanese: 'reconnaître japonais',
recognizePortuguese: 'reconnaître portugais',
recognizeChinese: 'reconnaître chinois',
recognizeArabic: 'reconnaître arabe',
stopRecognition: 'arrêter la reconnaissance vocale',
},
},
it: {
langCode: 'it-IT',
commands: {
shareRoom: 'condividi sala',
hideMe: 'nascondimi',
showMe: 'fammi vedere',
newRoom: 'nuova sala',
leaveRoom: 'esci dalla sala',
audioOn: 'attiva audio',
audioOff: 'disattiva audio',
videoOn: 'attiva video',
videoOff: 'disattiva video',
screenOn: 'attiva schermo',
screenOff: 'disattiva schermo',
chatOn: 'apri chat',
chatSend: 'invia',
chatOff: 'chiudi chat',
pollOn: 'apri sondaggio',
pollOff: 'chiudi sondaggio',
editorOn: 'apri editor',
editorOff: 'chiudi editor',
toggleTr: 'attiva/disattiva trascrizione',
whiteboardOn: 'apri lavagna',
whiteboardOff: 'chiudi lavagna',
snapshotRoom: 'scatta foto della sala',
recordingOn: 'avvia registrazione',
recordingPause: 'metti in pausa registrazione',
recordingResume: 'riprendi registrazione',
recordingOff: 'ferma registrazione',
settingsOn: 'apri impostazioni',
settingsOff: 'chiudi impostazioni',
participantsOn: 'mostra partecipanti',
participantsOff: 'nascondi partecipanti',
participantsVideoOff: 'disattiva video partecipanti',
participantsAudioOff: 'disattiva audio partecipanti',
participantsKickOut: 'espelli partecipanti',
fileShareOn: 'apri file',
fileShareOff: 'chiudi file',
videoShareOn: 'condividi video',
videoShareOff: 'interrompi condivisione video',
swapCamera: 'cambia fotocamera',
raiseHand: 'alza mano',
lowerHand: 'abbassa mano',
roomLock: 'blocca sala',
roomUnlock: 'sblocca sala',
about: 'mostra informazioni',
email: 'apri email',
google: 'apri google',
googleTr: 'apri google translate',
youtube: 'apri youtube',
facebook: 'apri facebook',
linkedin: 'apri linkedin',
twitter: 'apri twitter',
tiktok: 'apri tiktok',
github: 'apri github',
survey: 'apri sondaggio',
recognizeEnglish: 'riconoscere inglese',
recognizeBangla: 'riconoscere bengalese',
recognizeItalian: 'riconoscere italiano',
recognizeSpanish: 'riconoscere spagnolo',
recognizeFrench: 'riconoscere francese',
recognizeGerman: 'riconoscere tedesco',
recognizeJapanese: 'riconoscere giapponese',
recognizePortuguese: 'riconoscere portoghese',
recognizeChinese: 'riconoscere cinese',
recognizeArabic: 'riconoscere arabo',
stopRecognition: 'ferma riconoscimento vocale',
},
},
de: {
langCode: 'de-DE',
commands: {
shareRoom: 'Raum teilen',
hideMe: 'verstecke mich',
showMe: 'zeige mich',
newRoom: 'neuer Raum',
leaveRoom: 'Raum verlassen',
audioOn: 'Audio aktivieren',
audioOff: 'Audio deaktivieren',
videoOn: 'Video aktivieren',
videoOff: 'Video deaktivieren',
screenOn: 'Bildschirm aktivieren',
screenOff: 'Bildschirm deaktivieren',
chatOn: 'Chat öffnen',
chatSend: 'senden',
chatOff: 'Chat schließen',
pollOn: 'Umfrage öffnen',
pollOff: 'Umfrage schließen',
editorOn: 'Editor öffnen',
editorOff: 'Editor schließen',
toggleTr: 'Transkription umschalten',
whiteboardOn: 'Whiteboard öffnen',
whiteboardOff: 'Whiteboard schließen',
snapshotRoom: 'Raum schnappen',
recordingOn: 'Aufnahme starten',
recordingPause: 'Aufnahme pausieren',
recordingResume: 'Aufnahme fortsetzen',
recordingOff: 'Aufnahme stoppen',
settingsOn: 'Einstellungen öffnen',
settingsOff: 'Einstellungen schließen',
participantsOn: 'Teilnehmer anzeigen',
participantsOff: 'Teilnehmer verstecken',
participantsVideoOff: 'Teilnehmer Video deaktivieren',
participantsAudioOff: 'Teilnehmer Audio deaktivieren',
participantsKickOut: 'Teilnehmer rauswerfen',
fileShareOn: 'Datei öffnen',
fileShareOff: 'Datei schließen',
videoShareOn: 'Video teilen',
videoShareOff: 'Video teilen stoppen',
swapCamera: 'Kamera wechseln',
raiseHand: 'Hand heben',
lowerHand: 'Hand senken',
roomLock: 'Raum sperren',
roomUnlock: 'Raum entsperren',
about: 'Info anzeigen',
email: 'E-Mail öffnen',
google: 'Google öffnen',
googleTr: 'Google Übersetzer öffnen',
youtube: 'YouTube öffnen',
facebook: 'Facebook öffnen',
linkedin: 'LinkedIn öffnen',
twitter: 'Twitter öffnen',
tiktok: 'TikTok öffnen',
github: 'GitHub öffnen',
survey: 'Umfrage öffnen',
recognizeEnglish: 'Englisch erkennen',
recognizeBangla: 'Bangla erkennen',
recognizeItalian: 'Italienisch erkennen',
recognizeSpanish: 'Spanisch erkennen',
recognizeFrench: 'Französisch erkennen',
recognizeGerman: 'Deutsch erkennen',
recognizeJapanese: 'Japanisch erkennen',
recognizePortuguese: 'Portugiesisch erkennen',
recognizeChinese: 'Chinesisch erkennen',
recognizeArabic: 'Arabisch erkennen',
stopRecognition: 'Spracherkennung stoppen',
},
},
pt: {
langCode: 'pt-BR',
commands: {
shareRoom: 'compartilhar sala',
hideMe: 'me esconda',
showMe: 'me mostre',
newRoom: 'nova sala',
leaveRoom: 'sair da sala',
audioOn: 'ativar áudio',
audioOff: 'desativar áudio',
videoOn: 'ativar vídeo',
videoOff: 'desativar vídeo',
screenOn: 'ativar tela',
screenOff: 'desativar tela',
chatOn: 'abrir chat',
chatSend: 'enviar',
chatOff: 'fechar chat',
pollOn: 'abrir enquete',
pollOff: 'fechar enquete',
editorOn: 'abrir editor',
editorOff: 'fechar editor',
toggleTr: 'alternar transcrição',
whiteboardOn: 'abrir quadro branco',
whiteboardOff: 'fechar quadro branco',
snapshotRoom: 'tirar foto da sala',
recordingOn: 'iniciar gravação',
recordingPause: 'pausar gravação',
recordingResume: 'retomar gravação',
recordingOff: 'parar gravação',
settingsOn: 'abrir configurações',
settingsOff: 'fechar configurações',
participantsOn: 'mostrar participantes',
participantsOff: 'ocultar participantes',
participantsVideoOff: 'desativar vídeo dos participantes',
participantsAudioOff: 'desativar áudio dos participantes',
participantsKickOut: 'expulsar participantes',
fileShareOn: 'abrir arquivo',
fileShareOff: 'fechar arquivo',
videoShareOn: 'compartilhar vídeo',
videoShareOff: 'parar de compartilhar vídeo',
swapCamera: 'trocar câmera',
raiseHand: 'levantar mão',
lowerHand: 'abaixar mão',
roomLock: 'trancar sala',
roomUnlock: 'destrancar sala',
about: 'mostrar sobre',
email: 'abrir e-mail',
google: 'abrir google',
googleTr: 'abrir google translate',
youtube: 'abrir youtube',
facebook: 'abrir facebook',
linkedin: 'abrir linkedin',
twitter: 'abrir twitter',
tiktok: 'abrir tiktok',
github: 'abrir github',
survey: 'abrir pesquisa',
recognizeEnglish: 'reconhecer inglês',
recognizeBangla: 'reconhecer bengali',
recognizeItalian: 'reconhecer italiano',
recognizeSpanish: 'reconhecer espanhol',
recognizeFrench: 'reconhecer francês',
recognizeGerman: 'reconhecer alemão',
recognizeJapanese: 'reconhecer japonês',
recognizePortuguese: 'reconhecer português',
recognizeChinese: 'reconhecer chinês',
recognizeArabic: 'reconhecer árabe',
stopRecognition: 'parar reconhecimento de voz',
},
},
ja: {
langCode: 'ja-JP',
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: 'Googleを開く',
googleTr: 'Google翻訳を開く',
youtube: 'YouTubeを開く',
facebook: 'Facebookを開く',
linkedin: 'LinkedInを開く',
twitter: 'Twitterを開く',
tiktok: 'TikTokを開く',
github: 'GitHubを開く',
survey: 'アンケートを開く',
recognizeEnglish: '英語に切り替え',
recognizeBangla: 'ベンガル語に切り替え',
recognizeItalian: 'イタリア語に切り替え',
recognizeSpanish: 'スペイン語に切り替え',
recognizeFrench: 'フランス語に切り替え',
recognizeGerman: 'ドイツ語に切り替え',
recognizeJapanese: '日本語に切り替え',
recognizePortuguese: 'ポルトガル語に切り替え',
recognizeChinese: '中国語に切り替え',
recognizeArabic: 'アラビア語に切り替え',
stopRecognition: '音声認識を停止',
},
},
zh: {
langCode: 'zh-CN',
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: '打开YouTube',
facebook: '打开Facebook',
linkedin: '打开LinkedIn',
twitter: '打开Twitter',
tiktok: '打开TikTok',
github: '打开GitHub',
survey: '打开调查',
recognizeEnglish: '识别英语',
recognizeBangla: '识别孟加拉语',
recognizeItalian: '识别意大利语',
recognizeSpanish: '识别西班牙语',
recognizeFrench: '识别法语',
recognizeGerman: '识别德语',
recognizeJapanese: '识别日语',
recognizePortuguese: '识别葡萄牙语',
recognizeChinese: '识别中文',
recognizeArabic: '识别阿拉伯语',
stopRecognition: '停止语音识别',
},
},
ar: {
langCode: 'ar-SA',
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: 'التعرف على الإنجليزية',
recognizeBangla: 'التعرف على البنغالية',
recognizeItalian: 'التعرف على الإيطالية',
recognizeSpanish: 'التعرف على الإسبانية',
recognizeFrench: 'التعرف على الفرنسية',
recognizeGerman: 'التعرف على الألمانية',
recognizeJapanese: 'التعرف على اليابانية',
recognizePortuguese: 'التعرف على البرتغالية',
recognizeChinese: 'التعرف على الصينية',
recognizeArabic: 'التعرف على العربية',
stopRecognition: 'إيقاف التعرف الصوتي',
},
},
};
const browser = {
newroom: '/newroom',
email: 'mailto:?subject=&body=',
google: 'https://www.google.com',
googleTr: 'https://translate.google.com/',
youtube: 'https://www.youtube.com',
facebook: 'https://www.facebook.com',
linkedin: 'https://www.linkedin.com',
twitter: 'https://www.twitter.com',
tiktok: 'https://www.tiktok.com',
github: 'https://github.com/miroslavpejic85',
};
if (speechRecognition) {
recognition = new speechRecognition();
recognition.maxAlternatives = 1;
recognition.continuous = true;
setRecognitionLanguage(recognition, currentLangCode);
console.log('Speech recognition', recognition);
recognition.onstart = function () {
console.log('Speech recognition started');
hide(chatSpeechStartButton);
show(chatSpeechStopButton);
setColor(chatSpeechStopButton, 'lime');
userLog('info', 'Speech recognition started', 'top-end');
};
recognition.onresult = (e) => {
let current = e.resultIndex;
let transcript = e.results[current][0].transcript;
if (transcript) {
if (transcript.trim().toLowerCase() != languageHandlers[currentLanguage].commands.chatSend) {
chatMessage.value = transcript;
}
if (isVoiceCommandsEnabled && isVoiceCommandSupported) {
execVoiceCommands(transcript);
}
}
};
recognition.onerror = function (event) {
console.error('Speech recognition error', event.error);
userLog('error', `Speech recognition error ${event.error}`, 'top-end', 6000);
};
recognition.onend = function () {
console.log('Speech recognition stopped');
show(chatSpeechStartButton);
hide(chatSpeechStopButton);
setColor(chatSpeechStopButton, 'white');
userLog('info', 'Speech recognition stopped', 'top-end');
};
console.info('Browser supports webkitSpeechRecognition');
} else {
console.warn('This browser does not support webkitSpeechRecognition');
isVoiceCommandsEnabled = false;
}
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() {
try {
recognition.lang = languageHandlers[currentLanguage]?.langCode || 'en-US';
recognition.start();
} catch (error) {
console.error('Error starting speech recognition:', error);
userLog('error', 'Failed to start voice recognition', 'top-end');
}
}
function stopSpeech() {
try {
recognition.stop();
} catch (error) {
console.error('Error stopping speech recognition:', error);
}
}
function switchRecognitionLanguage(lang) {
currentLanguage = lang;
setRecognitionLanguage(recognition, languageHandlers[currentLanguage].langCode);
recognition.stop();
setTimeout(() => recognition.start(), 300);
userLog('info', `Switched to ${lang} recognition`, 'top-end');
}
function printCommand(command) {
console.log('Detected', { command: command });
userLog('info', `Voice command: ${command}`, 'top-end', 2000);
}
function execVoiceCommands(transcript) {
switch (transcript.trim().toLowerCase()) {
case languageHandlers[currentLanguage].commands.shareRoom:
printCommand(languageHandlers[currentLanguage].commands.shareRoom);
shareButton.click();
break;
case languageHandlers[currentLanguage].commands.hideMe:
printCommand(languageHandlers[currentLanguage].commands.hideMe);
hideMeButton.click();
break;
case languageHandlers[currentLanguage].commands.showMe:
printCommand(languageHandlers[currentLanguage].commands.showMe);
hideMeButton.click();
break;
case languageHandlers[currentLanguage].commands.newRoom:
printCommand(languageHandlers[currentLanguage].commands.newRoom);
openURL(browser.newroom);
break;
case languageHandlers[currentLanguage].commands.leaveRoom:
printCommand(languageHandlers[currentLanguage].commands.leaveRoom);
exitButton.click();
break;
case languageHandlers[currentLanguage].commands.audioOn:
printCommand(languageHandlers[currentLanguage].commands.audioOn);
startAudioButton.click();
break;
case languageHandlers[currentLanguage].commands.audioOff:
printCommand(languageHandlers[currentLanguage].commands.audioOff);
stopAudioButton.click();
break;
case languageHandlers[currentLanguage].commands.videoOn:
printCommand(languageHandlers[currentLanguage].commands.videoOn);
startVideoButton.click();
break;
case languageHandlers[currentLanguage].commands.videoOff:
printCommand(languageHandlers[currentLanguage].commands.videoOff);
stopVideoButton.click();
break;
case languageHandlers[currentLanguage].commands.screenOn:
printCommand(languageHandlers[currentLanguage].commands.screenOn);
startScreenButton.click();
break;
case languageHandlers[currentLanguage].commands.screenOff:
printCommand(languageHandlers[currentLanguage].commands.screenOff);
stopScreenButton.click();
break;
case languageHandlers[currentLanguage].commands.chatOn:
printCommand(languageHandlers[currentLanguage].commands.chatOn);
chatButton.click();
break;
case languageHandlers[currentLanguage].commands.pollOn:
printCommand(languageHandlers[currentLanguage].commands.pollOn);
pollButton.click();
break;
case languageHandlers[currentLanguage].commands.pollOff:
printCommand(languageHandlers[currentLanguage].commands.pollOff);
pollCloseBtn.click();
break;
case languageHandlers[currentLanguage].commands.editorOn:
printCommand(languageHandlers[currentLanguage].commands.editorOn);
editorButton.click();
break;
case languageHandlers[currentLanguage].commands.editorOff:
printCommand(languageHandlers[currentLanguage].commands.editorOff);
editorCloseBtn.click();
break;
case languageHandlers[currentLanguage].commands.chatSend:
printCommand(languageHandlers[currentLanguage].commands.chatSend);
chatSendButton.click();
break;
case languageHandlers[currentLanguage].commands.chatOff:
printCommand(languageHandlers[currentLanguage].commands.chatOff);
chatCloseButton.click();
break;
case languageHandlers[currentLanguage].commands.toggleTr:
transcriptionButton.click();
break;
case languageHandlers[currentLanguage].commands.whiteboardOn:
printCommand(languageHandlers[currentLanguage].commands.whiteboardOn);
whiteboardButton.click();
break;
case languageHandlers[currentLanguage].commands.whiteboardOff:
printCommand(languageHandlers[currentLanguage].commands.whiteboardOff);
whiteboardCloseBtn.click();
break;
case languageHandlers[currentLanguage].commands.snapshotRoom:
printCommand(languageHandlers[currentLanguage].commands.snapshotRoom);
snapshotRoomButton.click();
break;
case languageHandlers[currentLanguage].commands.recordingOn:
printCommand(languageHandlers[currentLanguage].commands.recordingOn);
startRecButton.click();
break;
case languageHandlers[currentLanguage].commands.recordingPause:
printCommand(languageHandlers[currentLanguage].commands.recordingPause);
pauseRecButton.click();
break;
case languageHandlers[currentLanguage].commands.recordingResume:
printCommand(languageHandlers[currentLanguage].commands.recordingResume);
recordingResume.click();
break;
case languageHandlers[currentLanguage].commands.recordingOff:
printCommand(languageHandlers[currentLanguage].commands.recordingOff);
stopRecButton.click();
break;
case languageHandlers[currentLanguage].commands.settingsOn:
printCommand(languageHandlers[currentLanguage].commands.settingsOn);
settingsButton.click();
break;
case languageHandlers[currentLanguage].commands.settingsOff:
printCommand(languageHandlers[currentLanguage].commands.settingsOff);
mySettingsCloseBtn.click();
break;
case languageHandlers[currentLanguage].commands.participantsOn:
printCommand(languageHandlers[currentLanguage].commands.participantsOn);
chatButton.click();
break;
case languageHandlers[currentLanguage].commands.participantsOff:
printCommand(languageHandlers[currentLanguage].commands.participantsOff);
chatCloseButton.click();
break;
case languageHandlers[currentLanguage].commands.participantsVideoOff:
printCommand(languageHandlers[currentLanguage].commands.participantsVideoOff);
rc.peerAction('me', socket.id, 'hide', true, true);
break;
case languageHandlers[currentLanguage].commands.participantsAudioOff:
printCommand(languageHandlers[currentLanguage].commands.participantsAudioOff);
rc.peerAction('me', socket.id, 'mute', true, true);
break;
case languageHandlers[currentLanguage].commands.participantsKickOut:
printCommand(languageHandlers[currentLanguage].commands.participantsKickOut);
rc.peerAction('me', socket.id, 'eject', true, true);
break;
case languageHandlers[currentLanguage].commands.fileShareOn:
printCommand(languageHandlers[currentLanguage].commands.fileShareOn);
fileShareButton.click();
break;
case languageHandlers[currentLanguage].commands.fileShareOff:
printCommand(languageHandlers[currentLanguage].commands.fileShareOff);
sendAbortBtn.click();
break;
case languageHandlers[currentLanguage].commands.videoShareOn:
printCommand(languageHandlers[currentLanguage].commands.videoShareOn);
videoShareButton.click();
break;
case languageHandlers[currentLanguage].commands.videoShareOff:
printCommand(languageHandlers[currentLanguage].commands.videoShareOff);
videoCloseBtn.click();
break;
case languageHandlers[currentLanguage].commands.swapCamera:
printCommand(languageHandlers[currentLanguage].commands.swapCamera);
swapCameraButton.click();
break;
case languageHandlers[currentLanguage].commands.raiseHand:
printCommand(languageHandlers[currentLanguage].commands.raiseHand);
raiseHandButton.click();
break;
case languageHandlers[currentLanguage].commands.lowerHand:
printCommand(languageHandlers[currentLanguage].commands.lowerHand);
lowerHandButton.click();
break;
case languageHandlers[currentLanguage].commands.roomLock:
printCommand(languageHandlers[currentLanguage].commands.roomLock);
lockRoomButton.click();
break;
case languageHandlers[currentLanguage].commands.roomUnlock:
printCommand(languageHandlers[currentLanguage].commands.roomUnlock);
unlockRoomButton.click();
break;
case languageHandlers[currentLanguage].commands.about:
printCommand(languageHandlers[currentLanguage].commands.about);
aboutButton.click();
break;
case languageHandlers[currentLanguage].commands.email:
printCommand(languageHandlers[currentLanguage].commands.email);
openURL(browser.email, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.google:
printCommand(languageHandlers[currentLanguage].commands.google);
openURL(browser.google, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.googleTr:
printCommand(languageHandlers[currentLanguage].commands.googleTr);
openURL(browser.googleTr, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.youtube:
printCommand(languageHandlers[currentLanguage].commands.youtube);
openURL(browser.youtube, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.facebook:
printCommand(languageHandlers[currentLanguage].commands.facebook);
openURL(browser.facebook, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.linkedin:
printCommand(languageHandlers[currentLanguage].commands.linkedin);
openURL(browser.linkedin, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.twitter:
printCommand(languageHandlers[currentLanguage].commands.twitter);
openURL(browser.twitter, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.tiktok:
printCommand(languageHandlers[currentLanguage].commands.tiktok);
openURL(browser.tiktok, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.github:
printCommand(languageHandlers[currentLanguage].commands.github);
openURL(browser.github, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.survey:
printCommand(languageHandlers[currentLanguage].commands.survey);
survey.enabled && openURL(survey.url, true);
sound('open');
break;
case languageHandlers[currentLanguage].commands.recognizeBangla:
printCommand(languageHandlers[currentLanguage].commands.recognizeBangla);
switchRecognitionLanguage('bn');
break;
case languageHandlers[currentLanguage].commands.recognizeEnglish:
printCommand(languageHandlers[currentLanguage].commands.recognizeEnglish);
switchRecognitionLanguage('en');
break;
case languageHandlers[currentLanguage].commands.recognizeItalian:
printCommand(languageHandlers[currentLanguage].commands.recognizeItalian);
switchRecognitionLanguage('it');
break;
case languageHandlers[currentLanguage].commands.recognizeSpanish:
printCommand(languageHandlers[currentLanguage].commands.recognizeSpanish);
switchRecognitionLanguage('es');
break;
case languageHandlers[currentLanguage].commands.recognizeFrench:
printCommand(languageHandlers[currentLanguage].commands.recognizeFrench);
switchRecognitionLanguage('fr');
break;
case languageHandlers[currentLanguage].commands.recognizeGerman:
printCommand(languageHandlers[currentLanguage].commands.recognizeGerman);
switchRecognitionLanguage('de');
break;
case languageHandlers[currentLanguage].commands.recognizeJapanese:
printCommand(languageHandlers[currentLanguage].commands.recognizeJapanese);
switchRecognitionLanguage('ja');
break;
case languageHandlers[currentLanguage].commands.recognizePortuguese:
printCommand(languageHandlers[currentLanguage].commands.recognizePortuguese);
switchRecognitionLanguage('pt');
break;
case languageHandlers[currentLanguage].commands.recognizeChinese:
printCommand(languageHandlers[currentLanguage].commands.recognizeChinese);
switchRecognitionLanguage('zh');
break;
case languageHandlers[currentLanguage].commands.recognizeArabic:
printCommand(languageHandlers[currentLanguage].commands.recognizeArabic);
switchRecognitionLanguage('ar');
break;
case languageHandlers[currentLanguage].commands.stopRecognition:
printCommand(languageHandlers[currentLanguage].commands.stopRecognition);
chatSpeechStopButton.click();
break;
default:
console.log('Unrecognized command:', transcript);
break;
}
}