node.js上的文本到音频文件

时间:2018-04-16 15:59:35

标签: javascript node.js audio text-to-speech

我正在寻找一种优化的合法方式来从nodejs上的文本创建音频文件。

现在我看到5个变体:

1)简单的hhtp请求google翻译text-to-sppeach api。 这种变体并不好,因为每个请求都需要生成的令牌 例如' TK:729008.879154' 没有它,它可能会失败。除此之外,这个选项是非法的......

2)谷歌的http请求翻译来自'控制台浏览器的文本到sppeach api' - puppeteer

是否有办法生成正确的令牌密钥以使此请求“合法”?

3)在puppeteer中使用Web Speech Api来获取二进制数据并将其保存到文件中? 或者有没有办法使用Chromium / Chrome源代码?

4)在具有nodejs的机器上使用任何其他技术/语言库,并使用js作为解释器来调用此技术/程序中的命令。 有什么想法吗?

5)任何支持不同语言的免费公共API(梦想api)?

任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

一种可能的方法是包装eSpeak命令行工具(Windows& Linux)http://espeak.sourceforge.net/。然后,您可以使用Node.js进行换行。

const { exec } = require('child_process');

var outputFile = process.argv[2] || "output.wav";
var voice = process.argv[3] || "en-uk-north";
var text = process.argv[4] || "hello there buddy";
var command = `espeak.exe -v ${voice} -w ${outputFile} "${text}"`;

exec(command, (err, stdout, stderr) => {
  if (err) {
    console.log("Error occurred: ", err);
    return;
  }
});

这提供了相当低质量的输出。

我还使用了Bing Speech API并且输出非常好,我已经创建了一个Node.js示例。您需要注册一个API密钥,但这很容易(您要https://azure.microsoft.com/en-us/try/cognitive-services/并选择"语音")。

const key = 'your api key here';

function synthesizeSpeech(apiKey)
{
    const fs = require('fs');
    const request = require('request');
    const xmlbuilder = require('xmlbuilder');
    const text = process.argv[2] || "The fault, dear Brutus, is not in our stars, But in ourselves, that we are underlings.";
    const outputFile = process.argv[3] || "speech.wav";

    var ssml_doc = xmlbuilder.create('speak')
        .att('version', '1.0')
        .att('xml:lang', 'en-au')
        .ele('voice')
        .att('xml:lang', 'en-au')
        .att('xml:gender', 'Female')
        .att('name', 'Microsoft Server Speech Text to Speech Voice (en-AU, HayleyRUS)')
        .txt(text)
        .end();
    var post_speak_data = ssml_doc.toString();

    console.log('Synthesizing speech: ', text);
    request.post({
        url: 'https://api.cognitive.microsoft.com/sts/v1.0/issueToken',
        headers: {
            'Ocp-Apim-Subscription-Key' : apiKey
        }
    }, function (err, resp, access_token) {
        if (err || resp.statusCode != 200) {
            console.log(err, resp.body);
        } else {
            try {
                request.post({
                    url: 'https://speech.platform.bing.com/synthesize',
                    body: post_speak_data,
                    headers: {
                        'content-type' : 'application/ssml+xml',
                        'X-Microsoft-OutputFormat' : 'riff-16khz-16bit-mono-pcm',
                        'Authorization': 'Bearer ' + access_token,
                        'X-Search-AppId': '9FCF779F0EFB4E8E8D293EEC544221E9',
                        'X-Search-ClientID': '0A13B7717D0349E683C00A6AEA9E8B6D',
                        'User-Agent': 'Node.js-Demo'
                    },
                    encoding: null
                }, function (err, resp, data) {
                    if (err || resp.statusCode != 200) {
                        console.log(err, resp.body);
                    } else {
                        try {
                            console.log('Saving output to file: ', outputFile);
                            fs.writeFileSync(outputFile, data);
                        } catch (e) {
                            console.log(e.message);
                        }
                    }
                });
            } catch (e) {
                console.log(e.message);
            }
        }
    });
}

synthesizeSpeech(key);

还可以在这里查看MARY项目:http://mary.dfki.de/,这是一个可以安装的开源服务器,语音输出非常好,你可以从node.js调用服务器。

如果您安装Mary Speech引擎(非常简单):

"use strict";

const fs = require('fs');
const request = require('request');
const text = process.argv[2] || "The fault, dear Brutus, is not in our stars, But in ourselves, that we are underlings.";
const outputFile = process.argv[3] || "speech_mary_output.wav";

const options = {
    url: `http://localhost:59125/process?INPUT_TEXT=${text}!&INPUT_TYPE=TEXT&OUTPUT_TYPE=AUDIO&AUDIO=WAVE_FILE&LOCALE=en_US&VOICE=cmu-slt-hsmm`,
    encoding: null // Binary data.
}

console.log('Synthesizing speech (using Mary engine): ', text);
console.log('Calling: ', options.url);
request.get(options, function (err, resp, data) {
    if (err || resp.statusCode != 200) {
        console.log(err, resp.body);
    } else {
        try {
            console.log(`Saving output to file: ${outputFile}, length: ${data.length} byte(s)`);
            fs.writeFileSync(outputFile, data, { encoding: 'binary'});
        } catch (e) {
            console.log(e.message);
        }
    }
});

这将为您综合演讲。无需API密钥!

答案 1 :(得分:0)

使用text2wav.node.js,您无需依赖任何外部联机服务或单独安装的主机程序。全部都是自包含的FOSS。此外,它支持101种语言。