本文概述
在Web开发世界中, 有一个非常有用的(尽管是实验性的)API, 可以轻松地将语音转换为文本。我们谈论的是SpeechRecognition API, Web Speech API的此接口是识别服务的控制器接口, 它还处理从识别服务发送的SpeechRecognitionEvent。
但是, 此API仅在Google Chrome(不包括iOS)中可用, 并且似乎还不够, 该API在Android的WebView中也不可用。这完全排除了你在Cordova应用中使用此API的可能性。因此, 唯一的选择是使用设备的本地语音识别服务。
在本文中, 你将学习如何通过开源插件在Cordova Project中使用设备的本机语音识别界面。
要求
要使用语音识别API, 你将需要一个Cordova插件来处理语音识别器的本机代码。在这种情况下, 我们将使用cordova-plugin-speechrecognition插件。该插件使你可以轻松地从设备使用本机语音识别。
该插件支持Android和iOS平台。要将插件安装在你的项目中, 请在终端中执行以下命令:
cordova plugin add cordova-plugin-speechrecognition
在你的项目中安装了插件之后, window.plugins.speechRecognition变量将在你的项目中可用。在此处查看其官方Github存储库中有关该插件的更多信息。插件本身具有以下要求:
- 科尔多瓦Android v5.0.0
- Android API等级14
- <android:launchMode>不得为singleInstance。它可以是singleTask, 标准, singleTop。
- RECORD_AUDIO权限
- Internet连接(显然)
方法
该插件提供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”)
- 匹配{Number}个返回匹配数(iOS上默认值为5, 最大匹配数)
- 提示{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. stopListening
此方法停止识别, 但仅适用于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);
});
如果你使用诺言, 则可以创建一个微型对象, 该微型对象存储与插件提供的功能相同但带有Promises的函数, 如以下示例所示:
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之类的语音命令库来处理语音命令(尽管无法使用webkitSpeechRecognition和speechSynthesis API, 但可以使用命令处理器):
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 …”感觉。
编码愉快!
评论前必须登录!
注册