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

2024-02-15

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

现在我看到了 5 个变体:

1) 向谷歌翻译文本到语音 API 的简单 hhtp 请求。 这种变体不好,因为每个请求都需要生成令牌 例如'传统知识:729008.879154' 如果没有这个,它可能会失败。除此之外,这个选项是“非法的”。

2) 从“控制台浏览器”向谷歌翻译文本到语音 api 的 http 请求 -木偶师 https://github.com/GoogleChrome/puppeteer

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

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

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

5)有没有支持不同语言的免费公共API(dream api)?

任何建议将不胜感激。


一种可能的方法是包装 eSpeak 命令行工具(Windows 和 Linux)http://espeak.sourceforge.net/ 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/ 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/ 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 密钥!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 上的文本到音频文件 的相关文章

随机推荐

  • XSL if else 条件

    我有一个要求 我想要 if else 语句来检查节点是否具有属性或仅具有字符串 例如 1 个节点有0 File s found另一个具有诸如
  • 在 Kubernetes 中找不到持久卷声明

    目前我尝试实施持续量在我的 yaml 文件中 我在互联网上阅读了很多文档 但我不明白为什么当我进入仪表板窗格时会出现此消息 未找到持久卷声明 karaf conf pod yaml apiVersion v1 kind Pod metada
  • Linux 中 SVN 存储库目录放在哪里?

    我正在 Ubuntu Linux 上设置一个新的 SVN 服务器 放置存储库的好地方 最佳实践 在哪里 我应该创建一个新用户吗 服务器将通过 http 访问 因此无需创建用户帐户等 与 svn 的情况一样 提前谢谢了 我喜欢把东西放在下面
  • Python 访问 JSON 对象中的数据

    所以我在我的脚本中这样做 import json info json loads get info print info 哪个输出 richard richard desktop projects hello python python m
  • 将 libpq.5.dylib 复制到 /usr/lib/libpq.5.dylib

    我无法在 R 中加载包 因为该文件libpq 5 dylib不在 usr lib libpq 5 dylib 它是在 usr local Cellar libpq 13 0 lib libpq 5 dylib 我尝试了这一行 sudo ln
  • iframe 的内容文档

    对于 iframe 甚至旧的 frame 元素 contentDocument 到底代表什么 它相当于 html 元素还是 body 元素 它有什么用 所有浏览器都支持此属性吗 w3 org http www w3 org TR 2003
  • 开头括号中的正则表达式

    我有一个正则表达式试图按专业划分问题 假设我有以下正则表达式 P
  • AngularJS:用户身份验证后重新加载 ng-include (或解决问题的更好方法)

    我真的只是在学习 Angular 我正在尝试创建一个基于身份验证限制内容访问的应用程序 我的身份验证部分正在工作 也使用 Laravel PHP 框架 但我在根据身份验证状态 重新加载 某些内容时遇到问题 即在身份验证成功后 最初 我想做的
  • html 中表单布局的最佳实践——表格还是流程?

    在 html 中布局表单的最佳实践是什么 特别是当您有一组带有标签的字段和可能的错误指示器时 我能做的最好的事情就是使用表格 但这在面向 CSS 的布局设计中效果不佳 例如 table tr td Name td td td tr tabl
  • Docker:“未找到 npm”

    我正在尝试容器化 ASP NET Core 和 Angular 应用程序 但遇到了一些麻烦 我收到这些错误 gt internal load build definition from Dockerfile 0 4s gt gt trans
  • AlertDialog 中的 Flutter NumberPicker 无法正常工作

    当我使用 NumberPicker 选择新值时 它总是跳回之前的值 而不是当前选择的值 我在 AlertDialog 中使用 NumberPicker 并使用 pickValue 函数调用 NumberPicker void pickVal
  • 上传并播放音频文件JS

    我有一个 HTML 音频标签和一个 HTML 文件输入标签 如下所示 我希望用户使用 上传文件 按钮从计算机中选择一首歌曲 然后使用音频标签播放它
  • 安装错误:ftheader.h:没有这样的文件或目录

    当我尝试构建 matplotlib 1 3 1 时 出现以下 freetype 标头错误 可能是找不到 ftheader h 关于如何解决这个问题有什么想法吗 注意 我刚刚按照中提到的说明安装了 Freetype 2 5 0 1自由类型安装
  • 崩溃 CGDataProviderCreateWithCopyOfData:vm_copy 失败:状态 1

    我遇到崩溃并出现以下错误 CGDataProviderCreateWithCopyOfData vm copy 失败 状态 1 我有多个问题 您可以提供帮助 vm copy failed 中状态 1 代表什么 仅当我在数据复制的内部 for
  • 从 PHP 子类访问受保护的方法

    我可以使用至少两种基本方法来访问受保护的子类的类方法 parent myMethod this gt myMethod 如果我不需要在子类中重写它 在这种情况下我必须这样做 function myMethod parent myMethod
  • jQuery 中的remove() 和detach() 之间的区别[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ImageView 不保持最大高度和宽度

    我将图像加载到ImageView using setImageURI selectedImageUri 从用户的照片库中检索 我有图像视图限制大小 android maxHeight 150dp android minHeight 150d
  • 卸载 NuGet 包时出现问题

    我正在尝试卸载 NuGet 安装的一些软件包 根据文档描述here http docs nuget org docs start here managing nuget packages using the dialog 我应该看到一个卸载
  • Tesseract OCR Android tessdata 目录未找到

    我目前正在使用 OCR 开发 Android 应用程序 并且已经达到了调用 BaseAPI init 方法的程度 我不断收到错误消息 指出该目录必须包含 tessdata 作为子文件夹 我已检查文件目录是否包含其中包含训练数据文件的文件夹
  • Node.js 上的文本到音频文件

    我正在寻找一种优化的合法方法来从 NodeJS 上的文本创建音频文件 现在我看到了 5 个变体 1 向谷歌翻译文本到语音 API 的简单 hhtp 请求 这种变体不好 因为每个请求都需要生成令牌 例如 传统知识 729008 879154