如何在Cordova中使用语音识别API(将语音转换为文本)

本文概述

  • 要求
  • 方法
  • 用法
  • 语音指令
在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
【如何在Cordova中使用语音识别API(将语音转换为文本)】此方法初始化语音识别。它期望带有选项的对象作为第三个参数:
  • 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); });

用法使用语音识别的正确方法如下:
  1. 你需要检查是否支持语音识别。
  2. 如果支持, 则检查权限。
  3. 如果没有使用麦克风的权限, 请提出要求。
  4. 拥有权限后, 初始化语音识别器。
使用插件的可用方法, 你可以使用以下代码轻松地开始识别(请注意, 你需要更改选项):
// 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 … ” 感觉。
编码愉快!

    推荐阅读