如何在Cordova中将文本转换为语音(语音合成)

本文概述

语音合成是计算机生成的人类语音模拟。它用于将书面信息转换为更方便的听觉信息, 尤其是对于移动应用程序(如启用语音的电子邮件和统一消息传递)。作为使用Javascript创建混合应用程序的开发人员, 我们假设你知道大多数Web浏览器中都可用的Speech Synthesis API。这个API的使用确实很容易, 但是在cordova应用程序中不可用, 因此你需要通过cordova插件诉诸设备的本机API。

在本文中, 你将学习如何在cordova项目中轻松地将文本转换为语音。

要求

为了使用设备的本机语音合成API, 我们将为其使用插件。 Cordova插件TTS是由@vilic编写的插件, 可让你通过Javascript使用设备的本机语音合成API。该插件为以下平台提供支持:

  • iOS 7以上
  • Windows Phone 8
  • Android 4.0.3+(API级别15+)

在终端中执行以下命令, 将插件安装在项目中:

cordova plugin add cordova-plugin-tts

安装后, 你将可以在窗口中使用TTS对象。有关更多信息, 请在此处访问官方的Github存储库。此插件使用iOS中的AVSpeechSynthesizer类, Android中的TextToSpeech类和Windows Phone中的Windows Phone语音合成类。

文字转语音

要使用Javascript将文本转换为语音, 请使用TTS对象的语音方法。此方法期望具有最多3个属性的对象作为第一个参数:

物业名称 类型 描述
文本 String 指定将要说的文字。
地区 String 4个字符的代码, 指定用于合成文本的语言。
float SpeechSynthesizer对象的语音速率, 从0.1到1

并且可以在以下示例中使用:

TTS.speak({
    text: 'Good morning, how are you?', locale: 'en-US', rate: 1
}, function () {
    console.log('Text succesfully spoken');
}, function (reason) {
    console.log(reason);
});

值得一提的是, 如果你想在应用启动时合成文本, 则需要将代码包装在deviceready事件中:

document.addEventListener('deviceready', function () {
    TTS.speak('Welcome to my awesome app', function () {
        console.log('Ready !');
    }, function (reason) {
        console.log(reason);
    });
});

为什么没有停止方法?

用本机API用技术术语来说, 你可以停止任何语音对象。但是, 使用此插件, 如果已经在运行并且原因很简单(不, 该插件并不坏或不完整), 则无法停止语音合成(至少不是以传统方式)。

当我们使用Cordova时, 我们只能发送和接收一些数据, 我们可以通过回调与本机代码和Javascript进行交互, 但是由于每个Javascript方法的执行都会创建一个新的插件, 因此我们无法与插件类的单个本机实例进行动态交互插件的本机类的实例。

迷因模因语音合成

每当你在这种情况下执行一些操作(从头开始)时, Cordova都会实例化Java中的TTS类, 该类会一次扩展CordovaPlugin并将TTS对象存储在该类的局部变量中。你可以从存储的TTS对象执行stop方法, 并且语音合成应按计划停止。但是, 如果你在这种情况下从Javascript执行另一个方法stop, 则将创建Java中扩展CordovaPlugin的TTS类的新实例(这意味着我们不再可以从start方法访问相同的TTS对象) 。 iOS和Windows也会发生相同的情况。

尽管插件中没有停止方法, 但是你可以使用一些技巧来实现它。讲出一个空字符串, 语音合成将停止!你可以扩展插件并创建自己的stop方法:

// Extend the TTS object with the new stop method.
TTS["stop"] = function(){
    TTS.speak({text: ''});
};

// Speak some text
TTS.speak({
    text: 'Hola buenos días. Hoy para el desayuno hay pan con mantequilla.', locale: 'es-ES', rate: 0.75
}, function () {
    console.log('success');
}, function (reason) {
    console.log(reason);
});

// Stop after 3 seconds
setTimeout(function() {
    TTS.stop();
    console.log("Speech synthesis stopped");
}, 3000);

编码愉快!

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?