227 lines
6.8 KiB
JavaScript
227 lines
6.8 KiB
JavaScript
'use strict';
|
|
|
|
const langs = [
|
|
['Afrikaans', ['af-ZA']],
|
|
['Bahasa Indonesia', ['id-ID']],
|
|
['Bahasa Melayu', ['ms-MY']],
|
|
['Català', ['ca-ES']],
|
|
['Čeština', ['cs-CZ']],
|
|
['Deutsch', ['de-DE']],
|
|
[
|
|
'English',
|
|
['en-AU', 'Australia'],
|
|
['en-CA', 'Canada'],
|
|
['en-IN', 'India'],
|
|
['en-NZ', 'New Zealand'],
|
|
['en-ZA', 'South Africa'],
|
|
['en-GB', 'United Kingdom'],
|
|
['en-US', 'United States'],
|
|
['en-NG', 'Nigeria'],
|
|
['en-GH', 'Ghana'],
|
|
['en-KE', 'Kenya'],
|
|
],
|
|
[
|
|
'Español',
|
|
['es-AR', 'Argentina'],
|
|
['es-BO', 'Bolivia'],
|
|
['es-CL', 'Chile'],
|
|
['es-CO', 'Colombia'],
|
|
['es-CR', 'Costa Rica'],
|
|
['es-EC', 'Ecuador'],
|
|
['es-SV', 'El Salvador'],
|
|
['es-ES', 'España'],
|
|
['es-US', 'Estados Unidos'],
|
|
['es-GT', 'Guatemala'],
|
|
['es-HN', 'Honduras'],
|
|
['es-MX', 'México'],
|
|
['es-NI', 'Nicaragua'],
|
|
['es-PA', 'Panamá'],
|
|
['es-PY', 'Paraguay'],
|
|
['es-PE', 'Perú'],
|
|
['es-PR', 'Puerto Rico'],
|
|
['es-DO', 'República Dominicana'],
|
|
['es-UY', 'Uruguay'],
|
|
['es-VE', 'Venezuela'],
|
|
],
|
|
['Euskara', ['eu-ES']],
|
|
['Français', ['fr-FR']],
|
|
['Galego', ['gl-ES']],
|
|
['Hrvatski', ['hr_HR']],
|
|
['IsiZulu', ['zu-ZA']],
|
|
['Íslenska', ['is-IS']],
|
|
['Italiano', ['it-IT', 'Italia'], ['it-CH', 'Svizzera']],
|
|
['Magyar', ['hu-HU']],
|
|
['Nederlands', ['nl-NL']],
|
|
['Norsk bokmål', ['nb-NO']],
|
|
['Polski', ['pl-PL']],
|
|
['Português', ['pt-BR', 'Brasil'], ['pt-PT', 'Portugal']],
|
|
['Română', ['ro-RO']],
|
|
['Slovenčina', ['sk-SK']],
|
|
['Suomi', ['fi-FI']],
|
|
['Svenska', ['sv-SE']],
|
|
['Türkçe', ['tr-TR']],
|
|
['български', ['bg-BG']],
|
|
['Pусский', ['ru-RU']],
|
|
['Српски', ['sr-RS']],
|
|
['한국어', ['ko-KR']],
|
|
[
|
|
'中文',
|
|
['cmn-Hans-CN', '普通话 (中国大陆)'],
|
|
['cmn-Hans-HK', '普通话 (香港)'],
|
|
['cmn-Hant-TW', '中文 (台灣)'],
|
|
['yue-Hant-HK', '粵語 (香港)'],
|
|
],
|
|
['日本語', ['ja-JP']],
|
|
['Lingua latīna', ['la']],
|
|
['Tiếng Việt', ['vi-VN']],
|
|
];
|
|
|
|
const speechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
|
|
const recognitionLanguage = getId('recognitionLanguage');
|
|
const recognitionDialect = getId('recognitionDialect');
|
|
|
|
let isWebkitSpeechRecognitionSupported = false;
|
|
let recognitionRunning = false;
|
|
let isPersistentMode = false;
|
|
let isPersistent = false;
|
|
let recognition;
|
|
|
|
if (speechRecognition) {
|
|
handleRecognitionLanguages();
|
|
// init webkitSpeechRecognition...
|
|
recognition = new speechRecognition();
|
|
recognition.maxAlternatives = 1;
|
|
recognition.continuous = true;
|
|
recognition.lang = recognitionDialect.value;
|
|
|
|
recognition.onstart = function () {
|
|
console.log('Speech recognition started');
|
|
elemDisplay(speechRecognitionStart, false);
|
|
elemDisplay(speechRecognitionStop, true, 'block');
|
|
setColor(speechRecognitionIcon, 'lime');
|
|
!isPersistentMode ? userLog('toast', 'TSpeech recognition started') : (isPersistent = true);
|
|
};
|
|
|
|
// Detect the said words
|
|
recognition.onresult = (e) => {
|
|
let current = e.resultIndex;
|
|
// Get a transcript of what was said.
|
|
let transcript = e.results[current][0].transcript;
|
|
if (transcript) {
|
|
let config = {
|
|
type: 'speech',
|
|
room_id: roomId,
|
|
peer_name: myPeerName,
|
|
peer_avatar: myPeerAvatar,
|
|
text_data: transcript,
|
|
time_stamp: new Date(),
|
|
};
|
|
// save also my speech to text
|
|
handleSpeechTranscript(config);
|
|
sendToDataChannel(config);
|
|
}
|
|
};
|
|
|
|
recognition.onaudiostart = () => {
|
|
console.log('Speech recognition start to capture your voice');
|
|
};
|
|
|
|
recognition.onaudioend = () => {
|
|
console.log('Speech recognition stop to capture your voice');
|
|
};
|
|
|
|
recognition.onerror = function (event) {
|
|
console.error('Speech recognition error', event.error);
|
|
if (!isPersistent || !isPersistentMode) userLog('toast', `Transcription error ${event.error}`, 6000);
|
|
};
|
|
|
|
recognition.onend = function () {
|
|
console.log('Speech recognition stopped');
|
|
// if (recognitionRunning) recognition.start();
|
|
elemDisplay(speechRecognitionStop, false);
|
|
elemDisplay(speechRecognitionStart, true, 'block');
|
|
setColor(speechRecognitionIcon, 'white');
|
|
// Prevent stopping in the absence of speech...
|
|
if (isPersistentMode && isPersistent && recognitionRunning) {
|
|
setTimeout(() => {
|
|
startSpeech();
|
|
}, 2000);
|
|
} else {
|
|
isPersistent = false;
|
|
userLog('toast', 'Speech recognition stopped');
|
|
}
|
|
};
|
|
|
|
isWebkitSpeechRecognitionSupported = true;
|
|
console.info('00. Browser supports webkitSpeechRecognition');
|
|
} else {
|
|
console.warn(
|
|
'This browser not supports webkitSpeechRecognition, check out supported browsers: https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API#browser_compatibility'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Update speech recognition country
|
|
*/
|
|
function updateCountry() {
|
|
for (let i = recognitionDialect.options.length - 1; i >= 0; i--) {
|
|
recognitionDialect.remove(i);
|
|
}
|
|
let list = langs[recognitionLanguage.selectedIndex];
|
|
for (let i = 1; i < list.length; i++) {
|
|
recognitionDialect.options.add(new Option(list[i][1], list[i][0]));
|
|
}
|
|
recognitionDialect.style.visibility = list[1].length == 1 ? 'hidden' : 'visible';
|
|
}
|
|
|
|
/**
|
|
* Handle recognition languages
|
|
*/
|
|
function handleRecognitionLanguages() {
|
|
for (let i = 0; i < langs.length; i++) {
|
|
recognitionLanguage.options[i] = new Option(langs[i][0], i);
|
|
}
|
|
recognitionLanguage.selectedIndex = 6;
|
|
updateCountry();
|
|
recognitionDialect.selectedIndex = 6;
|
|
recognitionLanguage.addEventListener('change', () => {
|
|
updateCountry();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Start speech recognition
|
|
*/
|
|
function startSpeech() {
|
|
try {
|
|
isPersistent = true;
|
|
isPersistentMode = true;
|
|
recognitionRunning = true;
|
|
recognition.lang = recognitionDialect.value;
|
|
recognitionSelectDisabled(true);
|
|
recognition.start();
|
|
} catch (error) {
|
|
console.error('Speech recognition start error', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Stop speech recognition
|
|
*/
|
|
function stopSpeech() {
|
|
isPersistent = false;
|
|
isPersistentMode = false;
|
|
recognitionRunning = false;
|
|
recognitionSelectDisabled(false);
|
|
recognition.stop();
|
|
}
|
|
|
|
/**
|
|
* Disable recognition select options
|
|
* @param {boolean} disabled
|
|
*/
|
|
function recognitionSelectDisabled(disabled = false) {
|
|
recognitionLanguage.disabled = disabled;
|
|
recognitionDialect.disabled = disabled;
|
|
}
|