Mac下用JavaScript调用say命令读取简体中文生成MP3的问题
问题解决指南
一、中文乱码与发音错误修复
1. 解决文本读取编码问题
你的脚本读取中文文件时未指定编码,导致内容和文件名乱码。修改读取方式为UTF-8编码:
var text = app.read(inputPath, {as: "utf8"}).split("\n");
这样能正确解析UTF-8格式的中文文本,避免乱码问题。
2. 指定中文语音发声
默认语音可能不是中文,需要在say命令里明确指定系统中的中文语音(比如“Ting-Ting”,可在系统设置→辅助功能→语音里查看可用的中文语音名称):
app.say(text[i], { savingTo: recordingPath, voice: "Ting-Ting" // 替换为你系统中的中文语音名 }); app.say(text[i], {voice: "Ting-Ting"});
二、生成MP3文件的方法
JXA的say命令仅支持直接保存为AIFF格式,要生成MP3需借助macOS自带的afconvert工具转换格式。
修改后的完整脚本
var app = Application.currentApplication(); app.includeStandardAdditions = true; var basePath = "/path/to/your/directory"; // 替换为实际目录路径 var inputPath = basePath + "/input.txt"; // 以UTF-8编码读取文本并按行拆分 var text = app.read(inputPath, {as: "utf8"}).split("\n"); for (let i = 0; i < text.length; i++) { var lineText = text[i].trim(); // 跳过空行 if (!lineText) continue; // 处理含特殊字符的文件名,避免路径错误 var encodedFileName = encodeURIComponent(lineText); var aiffPath = basePath + "/" + encodedFileName + ".aiff"; var mp3Path = basePath + "/" + encodedFileName + ".mp3"; // 用中文语音生成AIFF文件 app.say(lineText, { savingTo: aiffPath, voice: "Ting-Ting" }); app.say(lineText, {voice: "Ting-Ting"}); // 调用系统工具转换为MP3 app.doShellScript(`afconvert -f MP3 -d mp3 "${aiffPath}" "${mp3Path}"`); // 可选:转换完成后删除原AIFF文件 // app.doShellScript(`rm "${aiffPath}"`); }
说明
afconvert是macOS内置音频转换工具,-f MP3 -d mp3参数指定输出格式为MP3。- 使用
encodeURIComponent处理文件名,避免中文或特殊字符导致的路径解析错误。
内容的提问来源于stack exchange,提问作者KevinF
相关产品推荐
相关产品推荐

