You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:07:15