Node.js中Google TextToSpeech API读取TXT逐行文本批量生成WAV的实现方法
批量语音生成实现方案
两个需求都可以直接基于你现有代码改造实现,不需要改动已经跑通的单条生成核心逻辑,适配过程对基础编程能力的要求很低。
前置准备
- 原有
setting.json配置文件无需修改,所有音频编码、音调、语速、语音角色的配置都会被批量流程复用,原文件里硬写的input.text字段内容会被动态替换,不影响运行 - 新建一个名为
words.txt的纯文本文件,每一行写入一条需要合成的词或句子,示例内容参考:cat dog house sky sun
改造后的完整代码
const textToSpeech = require('@google-cloud/text-to-speech'); const fs = require('fs'); const util = require('util'); const projectId = 'forward-dream-295509' const keyFilename = 'myauth.json' const client = new textToSpeech.TextToSpeechClient({ projectId, keyFilename }); // 读取全局基础配置 const baseSetting = JSON.parse(fs.readFileSync('setting.json', 'utf-8')); const writeFile = util.promisify(fs.writeFile); const readFile = util.promisify(fs.readFile); async function Text2Speech(singleText, baseConfig) { // 动态为当前待合成内容生成独立的请求配置 const requestConfig = { ...baseConfig, input: { text: singleText } }; const [response] = await client.synthesizeSpeech(requestConfig); // 过滤文件名中的非法字符,避免写文件失败 const safeFileName = singleText.replace(/[\\/:*?"<>|]/g, '_'); await writeFile(`${safeFileName}.wav`, response.audioContent, 'binary'); console.log(`已生成语音文件: ${safeFileName}.wav`); } async function batchGenerate() { // 读取待合成内容文本 const rawContent = await readFile('words.txt', 'utf-8'); // 拆分换行、清理空白字符、过滤空行 const textList = rawContent.split('\n') .map(line => line.trim()) .filter(line => line.length > 0); console.log(`共读取到 ${textList.length} 条待合成内容,开始批量生成`); // 逐条串行处理,避免触发接口频率限制 for (const singleText of textList) { try { await Text2Speech(singleText, baseSetting); } catch (err) { console.error(`生成「${singleText}」的语音失败,错误信息: ${err.message}`); } } console.log('所有批量生成任务处理完成'); } // 启动批量流程 batchGenerate();
关键改动说明
- 把原来写死单条文本的逻辑改成动态匹配:每处理一条待合成内容,就临时把这条文本塞到通用配置的
input字段里,完全复用你原来已经调试好的语音、音频参数 - 新增txt文件读取逻辑:按换行拆分内容后自动过滤空行,不需要手动清理文件里的多余空行
- 增加文件名兼容处理:如果待合成的句子里包含
/、?、*这类操作系统不允许出现在文件名里的特殊字符,会自动替换为下划线,避免写文件时报错 - 采用串行循环调用模式,不一次性发起大量并发请求,最大程度避免触发Google TTS API的调用频率限制,新手使用时不容易出现权限报错
- 增加单条错误捕获:如果某一条内容生成失败(比如文本太长、临时网络问题),整个流程不会直接中断,会继续处理剩下的内容,同时在控制台打印具体错误方便排查
使用步骤
- 保留原有授权文件
myauth.json、配置文件setting.json在脚本同目录下 - 把所有需要合成的内容按行写入
words.txt - 直接运行原Node脚本,就会在脚本目录下生成每一条文本对应的独立wav文件
内容的提问来源于stack exchange,提问作者Koryooo
相关产品推荐
相关产品推荐

