OS X 的say
命令对于某些任务很有用(例如 Skype 的“当联系人上线时通知我”),但它对某些名字的发音不正确。有没有办法教人以say
不同的方式发音?
例如,尝试:
say "Hi, Joel Spolsky"
“ol” 听起来像“ball”而不是“old”。我想添加一个例外,说“像这样发音 Spolsky”,而不是试图教授新的语言规则。我敢打赌肯定有办法,因为它可以按照 Apple 的要求发音“iphone”。
更新- 经过一些研究,我了解到了以下信息:
- 文本转语音分为将文本转换为音素,然后使用语音将音素转换为音频。更改语音不会影响音素。
- 这语音合成管理器有一些功能将文本转换为音素以及一种方法 注册语音词典这将添加新的文本音素映射。但是,Apple 的语音词典必须是二进制形式 - 我没有找到任何 plist XML。
dtrace
在运行时使用say
,我发现在 /System/Library/PrivateFrameworks/SpeechDictionary.framework/Resources 中打开了一些有趣的文件。这可能是语音词典,但它们都是二进制的,除了 Homophones,它是 XML。向 Homophones 添加条目没有任何作用 - 它可能用于语音转文本。它们也是由 Apple 签名的代码 - 更改它们可能会导致某些程序无法运行。- 前缀词典
- 购物车名称
- CartLite
- 符号词典
- 同音词
- 有方法添加文本版本的应用程序界面元素,以便 VoiceOver 可以正常工作,其中很多内容开发人员可以免费获得,但也有一些棘手之处。这里的标准似乎是根据需要使用拼音拼写。
我的猜测是:
say
是语音合成管理器之上的一层轻量级代码。Apple 开发人员可以轻松添加命令行选项,以将路径设置为语音词典 plist 来进行备选音素映射,但他们没有这样做。编写更好的say
.- Skype 可能直接使用语音合成管理器,除了按语音拼写之外,没有留下任何方法来改变我朋友名字的发音方式,这很愚蠢。
- 制作命令行版本的最简单方法
say
是按照 JRobert 建议的方式。
以下是我的快速实现,使用了 Doug Harris 的拼写建议:
#!/bin/sh
echo $@ | tr '[A-Z]' '[a-z]' |
sed "s/spolsky/spowlsky/g" |
/usr/bin/say
最后,一些有趣的命令行内容:
# Apple is weird
sqlite3 /System/Library/PrivateFrameworks/SpeechDictionary.framework/Resources/Tuples .dump
# Get too much information about what files are being opened
sudo dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
# Just fun
say -v bad "Joel Spolsky Spolsky Spolsky Spolsky Spolsky, Joel Spolsky Spolsky Spolsky Spolsky Spolsky"
echo "scale=1000; 4*a(1)" | bc -l | say
答案1
你也可以输入你想要发音的音素。语法并不复杂。
前任:
[[inpt PHON]] 哈哈哈。
答案2
- 创建一个单词对列表 [spolsky spowlsky; joel jole; ...]。
- 用您最喜欢的脚本语言创建一个脚本,根据您的单词对列表替换其参数列表中的单词,并将修改后的参数列表传递给“/usr/bin/say”。
- 使脚本可执行,将其命名为“say”,并将其放在 $PATH 中比“/usr/bin”更早出现的文件夹中。
- 当您找到更多想要以不同方式发音的单词时,请将拼写变体添加到您的单词对列表中。
您的新说法将与旧说法一样,但采用您喜欢的发音。
答案3
@bruno-carvalho 的回答为我解答了这个问题。但是,我还需要找到标签[[inpt TEXT]]
,让 say 命令返回正常读取(语音合成)文本。例如:
say [[inpt PHON]] hAAIH, [[inpt TEXT]] how are you?
希望将其添加到答案中可以帮助后续阅读该问题的读者。
答案4
这是一个令人遗憾的限制,因为 Apple 似乎已经在这方面取得了很大进展。VoiceOver 用户可以使用 VoiceOver 实用程序(语音->发音)轻松插入自己的发音。但是,VoiceOver 设置似乎不适用于 Safari 和其他 Apple 提供的应用程序中的“说”命令或编辑->语音->“开始语音”菜单。