如何让 OS X 的 say 命令说出 IPA 字符?

如何让 OS X 的 say 命令说出 IPA 字符?

我有大约 200 行贝奥武甫,大约一年半前我和几个朋友将它们翻译成了国际音标。当时,我们用来检查发音的工具之一是 OS X 的say命令。

以下是根据 Klaeber 版诗歌转换成 IPA 格式后的前六行,我确信say可以正确读出,因为我自己已经在 MacBook 上运行过它,而我现在就是用这台 MacBook 输入这个问题的:

hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum
ˈðeːodˌkyniŋɡɑ θrymː jeˈfruːnon
huː ðɑ æðelɪŋɡɑs ˈelːen ˈfremːedon!
oft ʃyld ʃefiŋ ˈʃæɑðenɑ θræːɑtum,
ˈmɑniɣum mæjθum ˈmeːodusetlə ovˈtæːax,
'ejzudə eːorɑs, syðːɑnærest wæːɑrð

现在,无论我怎么努力,我都无法让它正确地读出上面的任何一行。我试过了所有的英语语音(10.5 之前的语音是搞笑),但我确信之前有效的配音,比如 Fiona 和 Kate,现在似乎完全忽略了 IPA 角色。

这些是我这次使用的一些不太 DRY 的测试命令:

say --rate=150 --voice=Fiona "/hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum/"
say --voice=Fiona "/hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum/"
say --rate=150 --voice=Fiona "hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum"
say --voice=Fiona "hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum"
say --voice=Fiona hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum
say --voice=Fiona /hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum/

但是它们都完全跳过了 IPA 字符,除了有时会发音的 æ。ɣ 肯定再也不会出现在合成中,而上次它确实出现了。

是我遗漏了什么吗?还是说他们可能出于某种原因在最近的更新中删除了 IPA 功能?我确信我们使用的是 Mavericks,但也可能是 Snow Leopard。

答案1

这是一个 Ruby 脚本,它接受一串 Unicode IPA 文本并将其转换为 OS X 的say命令语音句法

将这段 Ruby 代码放入一个文件(我们称之为)ipa2say.rb。使文件可执行(即chmod u+x ipa2say.rb)。执行可执行文件,将一些 IPA 文本传送给它。输出将得到一些 ASCII 语音文本。

然后say使用该[[inpt PHON]]指令运行。

举个例子。假设您想要sayIPA 文本“ˌɪntərˈnæʃənəl fəˈnɛtɪk ˈælfəˌbɛt fəˈrɛvər”。从命令行:

echo "ˌɪntərˈnæʃənəl fəˈnɛtɪk ˈælfəˌbɛt fəˈrɛvər" | ./ipa2say.rb

它会吐出:

IXntrnAESnl fAXnEHtIXk AElfbEHt frEHvr

然后运行:say "[[inpt PHON]]IXntrnAESnl fAXnEHtIXk AElfbEHt frEHvr"

这是脚本。

#!/usr/bin/ruby -w

map =   {       'æ' => 'AE',
                'eɪ' => 'EY',
                'ɑ' => 'AO',
                'əˈ' => 'AX',
                'i' => 'IY',
                'ɛ' => 'EH',
                'ɪ' => 'IH',
                'aɪ' => 'AY',
                'ɪ' => 'IX',
                'ɑ' => 'AA',
                'u' => 'UW',
                'ʊ' => 'UH',
                'ʌ' => 'UX',
                'oʊ' => 'OW',
                'aʊ' => 'AW',
                'ɔɪ' => 'OY',
                'b' => 'b',
                'ʧ' => 'C',
                'd' => 'd',
                'ð' => 'D',
                'f' => 'f',
                'g' => 'g',
                'h' => 'h',
                'ʤ' => 'J',
                'k' => 'k',
                'l' => 'l',
                'm' => 'm',
                'n' => 'n',
                'ŋ' => 'N',
                'p' => 'p',
                'r' => 'r',
                's' => 's',
                'ʃ' => 'S',
                't' => 't',
                'θ' => 'T',
                'v' => 'v',
                'w' => 'w',
                'j' => 'y',
                'z' => 'z',
                'ʒ' => 'Z',
                'ɜ' => '',
                ' ' => ' ',
                'ˈ' => ''
        }

text = ARGF.read

substring = ''

text.split("").each do |c|

    substring << c

    if substring.length == 2
        if map.has_key? substring
            print map[ substring ]
        else
            front = substring[0]
            if map.has_key? front
                print map[ front ]
            end
            back = substring[1]
            if map.has_key? back
                print map[ back ]
            end
        end

        substring = ''
    end
end

答案2

只是想补充一点,IPA 发音似乎已移至 VoiceOver,我猜现在它是一个完全不同的 TTS 引擎。转到 VoiceOver 实用程序、语音,然后发音,可以使用 IPA 进行自定义。但这对“说”和“编辑、语音、开始说话”命令完全没有影响,不过——呃!

VoiceOver 实用应用程序、语音选项、发音选项卡显示被覆盖发音的 IPA 列表。

答案3

如果对短语不起作用,请尝试在每个单词周围加上括号/斜线。这不起作用:

say "/hwæt we ˈɡɑːrˌdenɑ in ˈjæːɑrdɑɣum/"

但这似乎:

say "/hwæt/ /we/ /ˈɡɑːrˌdenɑ/ /in/ /ˈjæːɑrdɑɣum/"

方括号也有效:

say "[huː] [ðɑ] [æðelɪŋɡɑs] [ˈelːen] [ˈfremːedon]"

祝你好运!

(因为我重读并发现您尝试用斜线括住整个短语,所以进行了编辑。)

相关内容