読者です 読者をやめる 読者になる 読者になる

CMUの発音記号辞書を加工して使う(IPA風に変換する)

少しは暑さも和らいだ(?)ような感じなのでどうにか怠け癖に決別を。耳の状態の良いうちにリハビリを兼ねてプログラミングネタ。

フリーの発音記号辞書が存在するというのは地味に凄いことではないでしょうか。
内容は見出し語と対応する発音のみですが、約13万項目なので一般的な単語はカバーしているはず。

やりたいこと

アメリカのカーネギーメロン大学Public DomainBSDライセンス*1で公開している英語の発音辞書を活用したい。

The CMU Pronouncing Dictionary

英語版Wikipedia CMU Pronouncing Dictionary - Wikipedia, the free encyclopedia

"Arpabet"という形式になっているので、まずはIPA発音記号*2にしたい。とりあえずはJSONにしておいて、用途に応じて再度加工すればよさそう。

"Arpabet"は下記のようにアスキー文字だけで発音記号を表記する形式。音声認識関係では使われているらしく、機械に優しい形式のようです。

hello HH AH0 L OW1

ちなみに、日本の一般的な辞書や英単語帳の発音記号表記はジョーンズ(Jones)式。

データの取得と変換

リポジトリGitHub - cmusphinx/cmudict: CMU US English Dictionary

猫も杓子もGithubですかそうですか。

SF.net(以下参照)からも取得できるようだが中身が微妙に違う。GitHubの方が新しいのか、記号類が別ファイルになっている。

p/cmusphinx/code - Revision 13228: /trunk/cmudict

準備

GitHubリポジトリからデータを入手する。

$ git clone https://github.com/cmusphinx/cmudict.git
$ cd cmudict

githubからgit clone

ざっくりファイルを確認すると、

cmudict.dict : 辞書ファイル本体
cmudict.phones : それぞれの発音について、破裂音とか摩擦音などの分類表(39行)
cmudict.symbols : アクセントの有無を含めた`Arpabet` のリスト(84行)
cmudict.vp : 記号と読み方(記号1文字に続いて英語読み、その後ろにスペース区切りで発音が記載)

辞書ファイル本体とcmudict.symbolsがあればまずは十分。

方針の検討

まずはcmudict.symbols と、アクセント記号つきのIPAフォントの対応リストを作る。cmudict.vpは今回はスルーする。

WikipediaIPA発音記号とのマッピングが記載されているのでこれに従えばよさそう。

アクセント位置がAH1のように数字で記載されている点を考慮する必要がある。

0 アクセントなし(No stress)
1 第一アクセント(Primary stress)
2 第二アクセント(Secondary stress)

一般的な表記と同じように第一アクセントをアキュート・アクセント 、第二アクセントをグレイヴ・アクセントつきの文字に割り当てる。

それぞれ、U+0301U+0300をを使ってユニコードの合成文字で表現する。

厳密にIPAに合わせるなら、アクセント位置の音節の前にˈ(U+02C8)とˌ(U+02CC)で第一アクセントと第二アクセントを表す必要がある。

また、対応表には存在しないが、長音を示すコロン(三角形のコロン([ː] U+02D0))をオンラインの辞書で使用されている表記に合わせるために追加。 例えばAA[ɑː]にする方が自然*3。 同じ要領でER: 長音を示す[:]を間に挟む([ɜːr])。

注意点など

  • 一部の単語には末尾にコメント('abbrev'やforeign frenchなど)が記載されているので#以降を無視する必要がある
  • アクセントがつく可能性のあるものは、AA0AA1AA2 のようなパターンで、必ず数字がつく。逆に言うとAAという形では登場していない
  • 長音を示すコロンに三角形のコロン([ː] U+02D0)より普通のコロン([:] U+003A)の方がいい?
  • AH(AH0、AH1、AH2)について: Wikipediaの対応表では[ʌ][ə]の2パターン。いわゆる曖昧母音にはアクセントはこないはずなので、AH0[ə]に割り当てる
  • 二重母音で対応する1文字のフォントがない場合、アクセントは最初の文字でいい?
  • 二重母音は対応する1文字のフォントより2文字で表現した方が見栄えはいいかも

暫定仕様ということで。

参考にしたページ

変換

作成したマッピングテーブルはこんな感じ(タブ区切りテキスト)。発音記号を表す英数字とユニコードエスケープをタブ区切りで表記してあります。

このファイルと上記のcmudict.dictを読み込んで逐次置き換えるスクリプトを作成。

Ruby のハッシュを活用して適当に……。発音のバリエーションはキーを見出し語に、IPA形式の発音記号を配列の要素とする。ファイルに書き出すときは適当な区切り文字入れればいい。

To convert the cmudict from arpabet format to IPA ...

cmudictとGistのTSVファイルと上記スクリプトを用意してやればoutput.jsonが作成される。読み込むファイルのパスは決め打ちなので適宜修正のこと。

関連URL

[2016/10/12 追記]

同じようなことをやっている方がいるので参考までにURLを記載しておきます。arpabet-to-ipaというPHPのライブラリで変換表を作成しているのかな。

まとめ

しょぼいスクリプトですがご参考まで。もちろん自己責任で。

あとは用途に応じてRedisに突っ込む、RealmとかCore Data でもなんでもあり。 問題点を挙げるとすれば、品詞によって発音が変化するようなものは対応不能です*4


ついでに紹介しておくと、発音の勉強には以下の本がおすすめです。発音記号は日本式です。

DVD&CDでマスター 英語の発音が正しくなる本

DVD&CDでマスター 英語の発音が正しくなる本

*1:英語版Wikipediaによると途中からBSD ライセンスになった模様

*2:経産省の下部団体ではなくて、International Phonetic Alphabet (IPA)の方

*3:少なくともオンライン辞書はこっちになってる

*4:そもそもcmudictに品詞情報がない