考虑到您要处理的文件数量之多,并且需要将其内容转换为语音音频,我觉得这个特殊问题比 AppleScripting 更适合 bash 脚本。
这是我提出的 Automator 工作流程的屏幕截图,我相信它可以满足您的所有需求:
这两个脚本(shell 脚本和 AppleScript)在此答案的底部复制以进行简单的复制粘贴,但每个脚本的内容在屏幕截图中完全可见。
概述
此工作流程旨在作为Finder 中的服务 运行,您可以选择文件夹、右键单击并从弹出窗口运行工作流程上下文菜单。您还可以为其分配键盘快捷键。
文件夹被传递到工作流中。检索其内容,从而为工作流提供文件夹内的文件列表。这些被发送到 shell 脚本中。
shell 脚本导航到提供的文件夹并创建一个名为"Audio" 的子文件夹,其中将保存音频文件。然后它遍历提供的文件夹中的每个文件。如果文件不是.txt 文件,则将其传递。否则,命令行工具 say 用于将每个文件的内容转换为语音音轨。我为它选择了一个说普通话的声音(“Sin-ji”)。用于音频文件的数据格式是aac,这样可以避免以后在 iTunes 中进行第二次转换。文件格式使用文件扩展名.m4b,这可能看起来不熟悉,但本质上是封装在mp4 包装器中的aac 文件,文件扩展名已根据Apple 的建议进行了更改。 .m4b 扩展名告诉 macOS 音频文件是 iTunes 有声读物(Apple 使用的其他文件是 .m4a 用于常规音频,.m4r 用于铃声)。使用 .m4b 文件扩展名的一个很酷的事情是,当它被导入 iTunes 时,它会立即被识别为有声读物,并放置在有声读物部分。
shell 脚本返回"Audio" 目录的路径,现在填充有有声读物文件。工作流程检索此目录的内容,即有声读物文件,并将它们导入 iTunes 而不进行任何进一步的转换。它们会被直接送到图书馆,最后进入有声读物部分。
这是令人讨厌的一点:似乎当 iTunes 将新文件导入其库时,它会暂时锁定文件,大概是因为文件被复制,文件被扫描,并且元数据被写入。在此期间,无法设置新导入曲目的任何属性,并导致“文件权限错误”。
持续时间因系统而异,并且可能还取决于导入的文件数量。
在工作流程中插入 5 秒的暂停,让文件有足够的时间在我的系统上解锁,然后继续执行最终的 AppleScript。
根据您的要求,此 AppleScript 的唯一工作是使用文件名中下划线 ("_") 之前的部分来命名专辑,这就是它的作用。如果此时文件轨道全部解锁,它会做得很好。如果任何一条轨道仍处于锁定状态,则会导致脚本和工作流程抛出错误。
(奇怪的是,放入一个错误处理程序来捕获错误并防止它停止脚本似乎也阻止了属性的设置。iTunes AppleScript 中发生了一些错误,但这并没有不要让我感到惊讶。)
脚本
外壳(bash)
cd "$(dirname "$1")" # Go into supplied folder
mkdir -p "Audio" # Create a folder for the audio files
cd "Audio"
shopt -s nocasematch # For case-insensitive regex matching
for f in "$@"; do # Loop thru files; txt → m4b (audiobook)
fn=$(basename "$f")
[[ "${f##*.}" =~ txt ]] && \
say --voice=Sin-ji \
--output-file="${fn%.*}.m4b" \
--input-file="$f" \
--file-format=m4bf \
--data-format=aac
done
pwd # Return the present working directory
# i.e. the "Audio" folder
AppleScript
use application "iTunes"
property text item delimiters : "_"
on run {input, parameters}
repeat with m4b in the input
set m4b's album to text item 1 of (m4b's name as text)
end repeat
end run
下载工作流程
最后,我已将 Automator 服务工作流程上传到download,让您不必从头开始重新创建。它应该在接下来的 30 天内可用。