5

У меня есть около 200 строк Беовульфа, которые мы с несколькими друзьями перевели в Международный фонетический алфавит около полутора лет назад. В то время одним из инструментов, который мы использовали для проверки произношения, была команда say OS X.

Вот первые шесть строк в соответствии с Klaeber издания поэмы превращается в ИПС, которые я знаю наверняка say может читать должным образом, потому что я работать сам на 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 голосов было весело), но голоса, которые я наверняка работал раньше, такие как Фиона и Кейт, теперь, похоже, полностью игнорируют персонажей 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.

2 ответа2

7

Вот скрипт Ruby, который берет строку текста IPA Unicode и преобразует ее в фонетический синтаксис команды X OS say .

Поместите этот код Ruby в файл - назовем его ipa2say.rb . Сделайте файл исполняемым (например, chmod u+x ipa2say.rb). Выполните исполняемый файл, передав ему текст IPA. Выйдет какой-нибудь фонетический текст ASCII.

Затем запустите say с директивой [[inpt PHON]] .

Итак, пример. Допустим, вы хотите say текст IPA "ˌɪ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
1

Попробуйте скобки / косые черты вокруг каждого слова, если оно не работает с фразой. Это не работает:

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]"

Удачи!

(Отредактировано, потому что я перечитал и увидел, что вы попробовали косые черты, окружающие всю фразу.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .