如何更改OS X的“ say”命令的发音方式?


14

OS X的say命令对于某些任务很有用(例如,Skype的“联系人在线时通知我”),但它会错误地发音某些名称。有没有办法教say一个不同的单词发音?

例如,尝试:

say "Hi, Joel Spolsky"

“ ol”听起来像“球”而不是“旧”。我想添加一个例外,说“ Pronounce Spolsky像这样”,而不是尝试教授新的语言规则。我敢打赌,有一种方法可以让它按照苹果想要的发音“ iphone”。


更新 -经过研究,这是我所学到的:

  1. 文本转语音在将文本转换为音素之间进行拆分,然后使用语音将音素转换为音频。更改声音不会影响音素。
  2. 语音合成管理器有一些功能将文本到音素,而对于一个方法 登记语音字典,将增加新的文本音素地图。但是,Apple的语音词典必须采用二进制格式-我没有找到任何plist XML。
  3. 使用dtracesay,我在/System/Library/PrivateFrameworks/SpeechDictionary.framework/Resources中打开了一些有趣的文件。这可能是语音词典,但是它们都是二进制的,但Homophones(XML)除外。将条目添加到同音字不起作用-它可能用于语音到文本。它们也是Apple签署的代码-更改它们可能会阻止某些程序运行。
    • 前缀字典
    • 购物车名称
    • CartLite
    • 符号词典
    • 同音字
  4. 多种方法可以添加应用程序界面元素的文本版本,以便VoiceOver可以正常工作,开发人员可以免费获得其中的许多功能,但是有些技巧。这里的标准似乎是根据需要使用语音拼写。

我的猜测是:

  1. say是语音合成管理器之上的一小段代码。对于Apple开发人员而言,添加命令行选项以将其转到语音词典plist的路径以进行备用音素映射将很容易,但是事实并非如此。编写更好的可能是一个有用的开源项目say
  2. Skype可能直接使用了语音合成管理器,除了通过语音拼写(很愚蠢)外,没有其他方法可以改变我朋友名字的发音方式。
  3. 制作命令行版本的最简单方法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

您是否尝试过更改say与之配合使用的声音-v
Studer

2
对发音没有影响:say -v alex 'Spolsky' ; say -v vicki 'Spolsky'; say -v bad 'Spolsky Spolsky Spolsky Spolsky Spolsky Spols'。语音列表可以在系统偏好设置->语音->文本到语音中找到。问题在于音素翻译,而不是语音合成。如果直接调用该库,则可以设置自定义音素: developer.apple.com/mac/library/documentation/Carbon/Reference/…在 磁盘上搜索以查看Apple开发人员是否使用了.plist ...
jwhitlock

Answers:


8

嗯,您还可以输入要说的确切音素。语法不是那么复杂。

例如:

[[inpt PHON]]哈。

检查此链接以了解更多信息:http : //developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/SpeechSynthesisProgrammingGuide/Phonemes/Phonemes.html#//apple_ref/doc/uid/TP40004365-CH9-SW1


1
您可以使用“在我之后重复”来生成语音语法。可从developer.apple.com/downloads获得
Lri 2012年

“在我之后重复”Xcode辅助工具的一部分。
丹尼尔·贝克

1
这对我有用:说“嗨,乔尔[[inpt PHON]] spOWl skIY。” 我不知道是否在地址簿本加语音字段将这样的伎俩:macdailynews.com/2011/10/20/...
jwhitlock

您将在哪里输入这些音素?
Burhan Ali

6
  • 创建单词对列表[spolsky spowlsky; 乔尔·乔尔 ...]。
  • 用您喜欢的脚本语言创建一个脚本,该脚本根据您的单词对列表替换其参数列表中的单词,并将修改后的参数列表传递给“ / usr / bin / say”。
  • 使脚本可执行,将其命名为“ say”,并将其放入$ PATH中比“ / usr / bin”更早出现的文件夹中。
  • 当您发现更多想要不同发音的单词时,将拼写变体添加到单词对列表中。

您的新话语会像旧话语一样工作,但会带有您喜欢的发音。


3

@ bruno-carvalho的回答为我回答了这个问题。但是,我还需要查找标签[[inpt TEXT]]以使say命令返回到正常阅读(语音合成)文本的状态。例如:
say [[inpt PHON]] hAAIH, [[inpt TEXT]] how are you?

希望将其添加到答案中将有助于后续的读者。


2

我认为你不能。您可以尝试在系统偏好设置中将默认语音设置为其他语音,或者您可以键入想要发音的方式。例如,“嗨,Jole Spole天空。”


1
“ Spowlsky”怎么样?
道格·哈里斯

2

鉴于苹果似乎占据了大多数,这是一个不幸的局限。VoiceOver的用户可以使用VoiceOver实用程序(语音->发音)轻松插入自己的发音。但是,VoiceOver设置似乎不适用于Safari和其他Apple提供的应用程序中的“说”命令或“编辑”->“语音”->“开始语音”菜单。


0

没有办法“教” say程序以不同的方式发音单词。如上所述,获得所需发音的最简单方法是调整单词的拼写,直到以您想要的方式说出它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.