VSCode本身不能直接运行TTS,需通过Node.js脚本调用系统(如Windows的SAPI)或云服务(如Azure Speech SDK)实现语音合成;跨平台或高质量需求推荐Azure方案,注意环境兼容性与配置细节。

VSCode里直接跑TTS?别想多了,Node.js本身不带语音输出能力
VSCode只是一个编辑器,它不提供音频播放或语音合成能力。所谓“在VSCode中用Node.js转语音”,实际是指:在VSCode里写Node.js脚本,然后通过终端运行该脚本,调用系统或云服务的TTS能力生成音频文件(或实时播放)。关键不是VSCode,而是你选的Node.js执行路径和后端依赖。
Windows上最轻量方案:调用系统SAPI,不用装额外包
如果你只在Windows上用,且不需要高音质、多音色或离线控制,直接走PowerShell + System.Speech.Synthesis是最省事的。Node.js通过child_process.exec触发即可,连npm包都不用装。
-
exec命令必须用powershell.exe -Command完整调用,不能只写Add-Type - 中文文本要确保系统已安装中文语音包(如
Microsoft Huihui Desktop或Microsoft Yunxi Neural) - 语速范围是
-10到10,不是0–1,设成5才明显变快 - PowerShell默认GBK编码,Node.js传入中文时若遇到乱码,得用
iconv-lite转码,或者改用spawn配encoding: 'utf8'更稳
示例片段:
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
const { exec } = require('child_process');
exec(`powershell.exe -Command "Add-Type -AssemblyName System.Speech; $s = New-Object System.Speech.Synthesis.SpeechSynthesizer; $s.Rate = 3; $s.SelectVoice('Microsoft Huihui Desktop'); $s.Speak('你好,VSCode')"`);
跨平台或需高质量语音?优先选Azure Speech SDK
一旦你离开Windows、或者需要神经语音、SSML控制、批量导出WAV/MP3,microsoft-cognitiveservices-speech-sdk是目前Node.js生态里最成熟的选择。它不依赖操作系统语音引擎,输出质量统一,且支持流式合成。
- 必须提前在Azure门户创建Speech资源,拿到
subscription key和region,填错会报Unauthorized或Connection refused -
speechSynthesisVoiceName必须严格匹配[官方列表](https://learn.microsoft.com/zh-cn/azure/ai-services/speech-service/language-support?tabs=tts)里的值,比如zh-CN-YunxiNeural不能写成zh-CN-yunxi - 本地开发时,
AudioConfig.fromAudioFileOutput写入WAV最稳妥;如果想实时播放,得接AudioConfig.fromDefaultSpeakerOutput(),但仅限桌面环境,CI/服务器会失败 - 免费额度是500万字符/月,超了会静默失败(返回
ResultReason.Canceled),建议加synthesizer.synthesisStarted和synthesizer.synthesisCompleted事件监听做兜底
容易被忽略的坑:Node版本、权限、音频路径
很多看似“脚本跑通但没声音”的问题,其实卡在底层环境上。
- Node.js版本低于
16.14可能无法加载新版microsoft-cognitiveservices-speech-sdk,报ERR_REQUIRE_ESM——不是代码错,是版本不兼容 - Windows Defender或杀毒软件有时会拦截PowerShell调用
System.Speech,表现为无报错、无声,关掉实时防护试试 - 用
fs.writeFileSync保存音频时,路径别用相对路径如./output.wav,VSCode终端工作目录可能不是你想象的项目根目录,显式用path.resolve(__dirname, 'output.wav') - macOS上若用
say命令,需确认语音名存在:say -v ? | grep -i zh,否则静默失败
真正麻烦的从来不是“怎么让文字发声”,而是“怎么让同一段代码,在你换电脑、换系统、换网络之后,依然能稳定发出声”。先锁死执行环境,再谈功能封装。

















