个性化阅读
专注于IT技术分析

如何在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

此方法初始化语音识别。它期望带有选项的对象作为第三个参数:

  • 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 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 …”感觉。

编码愉快!

赞(2)
未经允许不得转载:srcmini » 如何在Cordova中使用语音识别API(将语音转换为文本)

评论 抢沙发

评论前必须登录!