本文概述
- 要求
- 方法
- 用法
- 语音指令
但是, 此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连接(显然)
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
【如何在Cordova中使用语音识别API(将语音转换为文本)】此方法初始化语音识别。它期望带有选项的对象作为第三个参数:
- language {String}使用识别语言(默认为” en-US” )
- 匹配{Number}个返回匹配数(iOS上默认值为5, 最大匹配数)
- 提示{String}显示侦听器弹出窗口的提示(默认为” ” , 仅限Android)
- showPopup {Boolean}显示带有提示的侦听器弹出窗口(默认为true, 仅适用于Android)
- showPartial {Boolean}允许返回部分结果(默认为false, 仅适用于iOS)
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 resultsfunction startRecognition(){window.plugins.speechRecognition.startListening(function(result){// Show results in the consoleconsole.log(result);
}, function(err){console.error(err);
}, {language: "en-US", showPopup: true});
}// Verify if recognition is availablewindow.plugins.speechRecognition.isRecognitionAvailable(function(available){if(!available){console.log("Sorry, not available");
}// Check if has permission to use the microphonewindow.plugins.speechRecognition.hasPermission(function (isGranted){if(isGranted){startRecognition();
}else{// Request the permissionwindow.plugins.speechRecognition.requestPermission(function (){// Request accepted, start recognitionstartRecognition();
}, 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 triggeredresult.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 … ” 感觉。
编码愉快!
推荐阅读
- 如何使用网络在Android中使用Fused Location Provider获取位置()
- 如何验证cordova版本,cordova项目的平台版本以及如何更新它们
- 列出Cordova中的android目录(Filebrowser&Folderbrowser)
- net::ERR_CACHE_MISS(无法在Cordova Android中加载外部URL)
- 解决方案错误(在Android SDK中找不到gradle包装器。可能需要更新你的Android SDK)
- 解决android的本地路径(content://)如果resolveLocalFileSystemURL不工作
- 5个最佳的免费RTF编辑器javascript和jQuery插件
- 5+最好的javascript和jQuery颜色选择器插件
- 5+最佳的javascript和jQuery照片放大镜插件