Como você pode fazer com que o comando say X fale caracteres IPA?

5
Eu tenho cerca de 200 linhas de Beowulf que alguns amigos meus e eu traduzimos em Alfabeto Fonético Internacional há um ano e meio atrás. Na época, uma das ferramentas que usamos para verificar as pronúncias era o comando say do OS X.

Aqui estão as primeiras seis linhas de acordo com a edição de Klaeber do poema convertido em IPA, que eu sei com certeza say pode ler corretamente, porque eu mesmo corri no MacBook do qual estou escrevendo muito pergunta:

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ð

Agora, por mais que eu tente, não consigo ler mais nenhuma das linhas acima. Eu tentei todas as vozes de língua inglesa (vozes pré-10.5 são hilariantes ), mas as vozes que tenho certeza que funcionavam antes, como Fiona e Kate, agora parecem ignorar completamente os personagens da IPA.

Estes são os comandos de teste um pouco não-DRY-y que usei desta vez:

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/

Mas todos eles ignoram os caracteres IPA inteiramente, exceto æ, que às vezes é pronunciado. ɣ certamente nunca mais entra na síntese, o que definitivamente fez da última vez.

Estou perdendo algo ou é possível que, por algum motivo, eles tenham removido o recurso do IPA em uma atualização recente? Tenho certeza de que era o Mavericks que estávamos usando, mas poderia ter sido o Snow Leopard.

    
por Benjamin Nolan 21.09.2014 / 04:37

2 respostas

6

Aqui está um script Ruby que pega uma string de texto Unicode IPA e a converte para o comando say do OS X. sintaxe fonética .

Coloque esse código Ruby em um arquivo - vamos chamá-lo de ipa2say.rb . Torne o arquivo executável (por exemplo, chmod u+x ipa2say.rb ). Execute o executável, canalizando algum texto IPA para ele. Fora virá algum texto fonético ASCII.

Em seguida, execute say com a diretiva [[inpt PHON]] .

Então, um exemplo. Digamos que você queira say do texto IPA "ˌɪntərˈnæʃənəl fəˈnɛtɪk ˈælfəˌbɛt fəˈrɛvər". Na linha de comando:

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

Ele vai cuspir:

IXntrnAESnl fAXnEHtIXk AElfbEHt frEHvr

Você então executa: say "[[inpt PHON]]IXntrnAESnl fAXnEHtIXk AElfbEHt frEHvr"

Aqui está o script.

#!/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
    
por 10.03.2015 / 15:56
1

Tente colocar parênteses / barras ao redor de cada palavra, se ela não funcionar com uma frase. Isso não funciona:

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

Mas isso parece:

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

Os colchetes também funcionam:

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

Boa sorte!

(Editado porque eu releio e vi que você tentou as barras ao redor de toda a frase.)

    
por 22.10.2015 / 05:02