Содержание
В мире веб-разработки есть действительно полезный (хотя и экспериментальный) API, который позволяет легко преобразовывать голос в текст. Мы говорим о SpeechRecognition API, этот интерфейс Web Speech API является интерфейсом контроллера для службы распознавания, который также обрабатывает SpeechRecognitionEvent, отправленный из службы распознавания.
Однако этот API доступен только в Google Chrome (который выходит из iOS), и, как будто этого было недостаточно, этот API также недоступен в WebView Android. Это полностью исключает использование этого API в вашем приложении Cordova. Поэтому единственный вариант, это использовать встроенную службу распознавания речи устройства.
В этой статье вы узнаете, как использовать собственный интерфейс распознавания речи устройства в вашем Cordova Project с помощью плагина с открытым исходным кодом.
Требования
Чтобы использовать API для распознавания голоса, вам понадобится плагин Cordova, который обрабатывает собственный код распознавателя речи. В этом случае мы будем использовать плагин cordova-plugin-speechrecognition. Этот плагин позволяет вам легко использовать встроенную функцию распознавания речи с вашего устройства.
Этот плагин поддерживает платформы Android и iOS. Чтобы установить плагин в свой проект, выполните в терминале следующую команду:
cordova plugin add cordova-plugin-speechrecognition
После того, как плагин установлен в вашем проекте, window.plugins.speechRecognition
переменная будет доступна в вашем проекте. Узнайте больше о плагине в его Официальный репозиторий Github здесь. Сам плагин имеет следующие требования:
- Cordova-Android V5.0.0
- Уровень API Android 14
не должен быть
singleInstance
, Может бытьsingleTask
,standard
,singleTop
,- ЗАПИСЬ АУДИО разрешение
- Интернет-соединение (очевидно)
методы
Плагин предлагает 6 методов для распознавания речи:
1. isRecognitionAvailable
Этот метод позволяет вам проверить, может ли распознавание речи использоваться на вашем устройстве или нет. Первый обратный вызов (успех) получает логическое значение со следующим значением:
window.plugins.speechRecognition.isRecognitionAvailable(function(available){
if(available){
// You can use the speechRecognition
}
}, function(err){
console.error(err);
});
2. hasPermission
Этот метод проверяет, есть ли у приложения разрешения на использование микрофона:
window.plugins.speechRecognition.hasPermission(function (isGranted){
if(isGranted){
// Do other things as the initialization here
}else{
// You need to request the permissions
}
}, function(err){
console.log(err);
});
3. requestPermission
Вы можете запросить разрешение на микрофон с помощью этого метода легко:
window.plugins.speechRecognition.requestPermission(function (){
// Requested
}, function (err){
// Opps, nope
});
4. getSupportedLanguages
Этот метод извлекает все доступные языки на устройстве в формате массива:
window.plugins.speechRecognition.getSupportedLanguages(function(data){
console.log(data); // ["es-ES","de-DE","id-ID" ........ ]
}, function(err){
console.error(err);
});
5. startListening
Этот метод инициализирует распознавание речи. В качестве третьего параметра он ожидает объект с параметрами:
language
{String} используемый язык для распознавания (по умолчанию"en-US"
)matches
{Number} количество возвращаемых совпадений (по умолчанию5
, на iOS: максимальное количество совпадений)prompt
{String} отображает подсказку всплывающего окна слушателя (по умолчанию""
, Только для Android)showPopup
{Boolean} отображать всплывающее окно слушателя с подсказкой (по умолчаниюtrue
, Только для Android)showPartial
{Boolean} Разрешить частичное возвращение результатов (по умолчаниюfalse
, только iOS)
Существует разница между платформами Android и iOS. На Android распознавание речи прекращается, когда говорящий заканчивает говорить (в конце предложения). В iOS пользователь должен вручную остановить процесс распознавания, вызвав метод stopListening ():
var settings = {
lang: "en-US",
showPopup: true
};
window.plugins.speechRecognition.startListening(function(result){
console.log(result);
// By default just 5 options
// ["Hello","Hallou", "Hellou" ...]
}, function(err){
console.log(err);
}, settings);
6. стопЛизинг
Этот метод останавливает распознавание, но доступен только для iOS:
window.plugins.speechRecognition.stopListening(function(){
// No more recognition
}, function(err){
console.log(err);
});
использование
Правильный способ использования распознавания речи заключается в следующем:
- Вы должны проверить, поддерживается ли распознавание речи.
- Если это поддерживается, то проверьте наличие разрешений.
- Если нет разрешений на использование микрофона, запросите их.
- Получив разрешения, инициализируйте распознаватель речи.
С помощью доступных методов плагина вы можете легко начать распознавание с помощью следующего кода (обратите внимание, что вам нужно изменить параметры):
// Handle results
function startRecognition(){
window.plugins.speechRecognition.startListening(function(result){
// Show results in the console
console.log(result);
}, function(err){
console.error(err);
}, {
language: "en-US",
showPopup: true
});
}
// Verify if recognition is available
window.plugins.speechRecognition.isRecognitionAvailable(function(available){
if(!available){
console.log("Sorry, not available");
}
// Check if has permission to use the microphone
window.plugins.speechRecognition.hasPermission(function (isGranted){
if(isGranted){
startRecognition();
}else{
// Request the permission
window.plugins.speechRecognition.requestPermission(function (){
// Request accepted, start recognition
startRecognition();
}, function (err){
console.log(err);
});
}
}, function(err){
console.log(err);
});
}, function(err){
console.log(err);
});
Если вы работаете с обещаниями, вы можете создать миниобъект, в котором будут храниться те же функции, которые предоставляет плагин, но с обещаниями, как показано в следующем примере:
window["speechRecognition"] = {
hasPermission: function(){
return new Promise(function(resolve, reject){
window.plugins.speechRecognition.hasPermission(function (isGranted){
resolve(isGranted);
}, function(err){
reject(err);
});
});
},
requestPermission: function(){
return new Promise(function(resolve, reject){
window.plugins.speechRecognition.requestPermission(function (){
resolve();
}, function (err){
reject();
});
});
},
startRecognition: function(settings){
return new Promise(function(resolve, reject){
window.plugins.speechRecognition.startListening(function(result){
resolve(result);
}, function(err){
reject(err);
}, settings);
});
},
getSupportedLanguages: function(){
return new Promise(function(resolve, reject){
window.plugins.speechRecognition.getSupportedLanguages(function(result){
resolve(result);
}, function(err){
reject(err);
});
});
},
isRecognitionAvailable: function(){
return new Promise(function(resolve, reject){
window.plugins.speechRecognition.isRecognitionAvailable(function(available){
resolve(available);
}, function(err){
reject(err);
});
});
},
stopListening: function(){
return new Promise(function(resolve, reject){
window.plugins.speechRecognition.stopListening(function(){
resolve();
}, function(err){
reject(err);
});
});
}
};
Это создаст speechRecognition
Переменная в окне, которую вы можете использовать следующим образом:
window.speechRecognition.isRecognitionAvailable().then(function(available){
if(available){
return window.speechRecognition.hasPermission();
}
}).then(function(hasPermission){
function startRecognition(){
return window.speechRecognition.startRecognition({
language:"en-US",
showPopup: true
}).then(function(data){
console.log("Results",data);
}).catch(function(err){
console.error(err);
});
}
if(!hasPermission){
window.speechRecognition.requestPermission().then(function(){
startRecognition();
}).catch(function(err){
console.error("Cannot get permission", err);
});
}else{
startRecognition();
}
}).catch(function(err){
console.error(err);
});
Довольно просто, не так ли?
Голосовые команды
Вы можете использовать библиотеку голосовых команд, как Artyom.js для обработки голосовых команд (хотя API webkitSpeechRecognition и speechSynthesis недоступны, вы можете использовать командный процессор):
artyom.addCommands([
{
indexes: ["Hello","Hi"],
action: function(){
console.log("Hello, how are you?");
}
},
{
indexes: ["Translate * in Spanish"],
smart: true,
action: function(i, wildcard){
console.log("I cannot translate" + wildcard);
}
},
]);
// Start the recognition and say "hello"
window.plugins.speechRecognition.startListening(function (result) {
// The hello command should be triggered
result.forEach(function(option){
if(artyom.simulateInstruction(option)){
console.log("Matched : " + option, result);
return;
}
});
}, function (err) {
reject(err);
}, {
language: "en-US",
showPopup: true
});
К сожалению, нативное распознавание не поддерживает непрерывное распознавание (по крайней мере, не в Android, а в iOS), вы сможете использовать только «Ok Google …» в своем проекте.