玩式草子─ソフトウェアとたわむれる日々

第63回お家通信カラオケシステムを作ろう[その2]

前回楽曲ごとに切り出したビデオカラオケの動画をMP4形式に変換すれば、HTML5のビデオ機能を使って新しめのブラウザで再生できることを確認しました。動画再生の部分は何とかなりそうなので、今回からは目的の動画にスムーズにたどりつくための検索システムについて考えてみましょう。

検索システムの検討

前回紹介したように、手元では、キャプチャした動画ファイルを楽曲ごとに切り出す作業と平行して、各曲のタイトルや歌手名、作詞・作曲者名等を一行に記録した楽曲リストを作ってきました。

8140 & 1 & 01 & むらさき雨情 & 三浦康照 & 山口ひろし & 藤あや子 
8140 & 1 & 03 & あなたの隣を歩きたい & 坂口照幸 & 三木たかし & 都はるみ 
8140 & 1 & 04 & 虞美人草 & 鳥井実 & 深谷昭 & 長保有紀 
...

この楽曲リストを元に、たとえば「むらさき雨情」というタイトルや「藤あや子」という歌手名から、"8140-1-01"という楽曲IDにたどりつくのが検索システムの目的です。

VHDカラオケには、目的の曲が何番のディスクの何トラック目にあるかを調べるために、曲の「タイトル」「歌手名」をそれぞれ五十音順に並べた「歌本」と呼ばれる索引集が付属していました。確かに、紙の上で目的の曲を探す場合はタイトルや歌手名をシーケンシャルに並べておくことが必須でしょう。それに対し、データベースを利用して任意のキーワードからランダムアクセスできるようにすれば、索引集のような五十音(読み方)順の情報は必要なくなるので、楽曲リストと同様なレコードを定義したデータベースにデータを流しこんでやるぐらいで間にあうだろう、当初はそう単純に考えていたものの、使い方を少し考えてみるとそれだけでは使いものにならないことに気づきました。

というのも、カラオケになるような楽曲の場合、曲のイメージや雰囲気を重視して、凝ったタイトルを付けることが多く、⁠女」「おんな⁠⁠、⁠一人」「ひとり」などの表記揺れや、⁠詩」と書いて「うた」と読んだり、⁠故郷」と書いて「ふるさと」「さと」と読ませる当て字読みがよくあります。

楽曲リストに写した正式なタイトルのみならず、このような表記揺れや当て字読みを吸収できるようにしておかないと、⁠みちのくひとりたび」って「一人旅」だっけ、⁠ひとり旅」だっけ?と検索するたびに悩むハメになりそうです。

また、"Forever"や"TSUNAMI"といった英語表記のタイトル、"T.M.Revolution"、"Mr.Children"といった歌手名を、アルファベットだけで検索するのか、日本語の読みでも検索できるようにするのかも考えておく必要があるでしょう。

さて、どうしたものかな、と考えているうちに、通信カラオケ「セガカラ」のフリーワード検索は、⁠全角ひらがな8文字以内」「前方一致検索」というシンプルな仕様になっていることを思い出しました。

図1 ⁠セガカラ」の楽曲検索ページ
図1 「セガカラ」の楽曲検索ページ

紹介されている例を見ると、SMAPは「すまっぷ」で、Dreams Come Trueは「どりーむずかむと」で、⁠北へ…ひとり旅」「きたへひとりたび」と検索すればいいようです。

検索キーワードをひらがなのみにすると、⁠一人」「ひとり」の表記揺れは吸収できますし、⁠SMAPだっけ、スマップだっけ?」と悩む必要もありません。これくらいならタイトルと歌手名に読みを追加すれば実現できそうなので、まずはこの仕様にならってみることにしました。

タイトルと歌手名をひらがなで検索すると決めたものの、楽曲の切り出し時に作成してきた楽曲リストには「読み」の項目はありません。そこで、まずは楽曲リストにひらがなの読みを追加することから始めました。

漢字かな変換ソフト kakasi

集積してきた楽曲リストには、VHDディスクとカラオケの画面表示から、⁠ディスク番号」⁠サイド(表裏)」⁠トラック番号」⁠タイトル」⁠作詞家名」⁠作曲家名」⁠歌手名」⁠コメント」などのデータを拾っています。

これらのうち、⁠作詞家」⁠作曲家」から検索する必要はほとんど無いと考えて、⁠タイトル」「歌手名」に読みを付けることにしました。

しかしながら3000件を越える楽曲それぞれにひらがなの読みを入力するのも面倒な作業です。前述のように、楽曲のタイトルや歌手名には表記揺れや当て字読みといった問題はあるものの、たいていの単語は普通に読めるので、漢字を自動的にひらがなに変換するようなツールは無かったかな、と考えて思いだしたのがkakasiというソフトウェアです。

図2 kakasiのホームページ
図2 kakasiのホームページ

kakasiは"KAnji KAna Simple Inverter" の略で、漢字かな混じり文をひらがな文やローマ字文に変換するためのソフトウェアです。

実のところkakasiは1990年代の前半に生まれたかなり古いソフトウェアです。当初は、日本語の学習者用に漢字かな混じり文をひらがな文やローマ字文に変換するために開発されたそうですが、90年代の後半には全文検索ソフトウェアNamazuと組み合わせて、HDD内のテキストファイルを全文検索するために広く利用されていました。

しかしながら、2000年代になるとGoogleに代表されるWebベースの全文検索システムが急速に普及し、Namazuやkakasiはあまり使われなくなり、開発も停滞するようになりました。kakasiのバージョン2.3.4が公開されたのが2001年9月、誰もがこのバージョンで開発が途絶えてしまったと思っていました。しかし、2014年1月になって新しいバージョン2.3.5が公開され、その2ヵ月後にはいくつかのバグを修正したバージョン2.3.6が公開されました。

kakasiは標準入力から受けとった漢字かな混じり文を、引数で指定した指示に応じてひらがな文やカタカナ文に変換します。

$ echo '柿食えば鐘が鳴るなり法隆寺' | kakasi -JH
かきくえばかねがなるなりほうりゅうじ

kakasiでは変換する文字の種類を引数で指定します。'J'が漢字、'H'がひらがな、'K'がカタカナ、'E'がその他の文字を意味し、引数の慣例である'-'を付けた'-(from)(to)'の形でそれぞれの文字種間の変換を指示します。上記の'-JH'は「漢字(J)」「ひらがな(H)」に変換する指示で、これを'-HK'とすると、⁠ひらがな(H)」の部分が「カタカナ(K)」に変換されます。

$ echo '柿食えば鐘が鳴るなり法隆寺' | kakasi -HK
柿食エバ鐘ガ鳴ルナリ法隆寺

文字種の変換は複数指定することも可能で、'-JK'と'-HK'を指定すれば全体がカタカナに変換されます。

$echo '柿食えば鐘が鳴るなり法隆寺' | kakasi -JK -HK
カキクエバカネガナルナリホウリュウジ

また、今回は利用しないものの、全文検索用のインデックスを作成するために、入力された文章を単語ごとに区切る'-w'というオプションも用意されています。

$ echo '柿食えば鐘が鳴るなり法隆寺' | kakasi -w
柿 食え ば 鐘 が 鳴る なり 法隆寺

「故郷」「ふるさと」と読むような当て字読みには個別対応が必要なものの、⁠一人」「ひとり」かといった表記揺れは吸収できそうなので、まずはkakasiを使って自動で楽曲リスト全体にひらがなの読みを追加し、その後、手動でチェックすることにして、楽曲リストを操作するためのコードを書いてみました。

Pythonからのkakasiの操作

kakasiのホームページによると、PerlやRubyにはkakasi用のモジュールがあるものの、Pythonには用意されていないようです。仕方ないので、「python+kakasiで分かち書き」のページを参考に、kakasiの機能をライブラリとして提供しているlibkakasi.soをPythonのctypesモジュールを使って操作するようなコードを書いてみました。

 1  #!/usr/bin/env python
 2  # -*- coding: euc-jp -*-;
 3  
 4  from ctypes import *
 5  def to_hiragana(str):
 6      kakasi = CDLL("libkakasi.so")
 7  
 8      argArray = c_char_p * 3
 9      args =  argArray( c_char_p("kakasi"), c_char_p("-JH"), c_char_p("-KH"))
10      kakasi.kakasi_getopt_argv(3, args)
11  
12      kakasi_do = kakasi.kakasi_do
13      kakasi_do.restype = c_char_p
14  
15      cstr = c_char_p(str)
16      return kakasi_do(cstr)
17  
18  test_str = '柿食えば鐘が鳴るなり法隆寺'
19  print to_hiragana(test_str)

このコードをkakasi_test.pyという名前で保存して実行してみると、18行目で設定した漢字かな混じり文がひらがな文に変換されて表示されます。

$ python kakasi_test2.py 
かきくえばかねがなるなりほうりゅうじ

なお、このサンプルコードは、未だにデフォルトの文字コードがEUC-JPなPlamo Linux環境を前提としているので、最近の主流であるUTF-8環境の場合はlibkakasi.soに渡す前に文字コードを適切に変換してやる必要があります。

kakasiを呼び出す部分ができたので、残りは楽曲リストを読み込んで各フィールドを分割し、必要な部分をひらがなに変換する作業です。使い捨てに近いコードなので、仕様はごく単純に、引数で指定した楽曲リストファイルを読み込んで、変換、整形して出力するだけにしました。

 1  import sys, os
 2  def main():
 3      file = sys.argv[1]
 4  
 5      if os.path.isfile(file):
 6          fp = open(file, 'r')
 7      else:
 8          print("file:{} not found".format(file))
 9      sys.exit()
10  
11      lines = fp.readlines()
12      for l in lines:
13          dt = l.rstrip().split(' & ')
14          if len(dt) == 8:
15              (id, side, track, title, writer, composer, singer, comment) = dt
16          elif len(dt) == 7:
17              (id, side, track, title, writer, composer, singer) = dt
18          elif len(dt) == 0:
19              continue
20          else:
21              print("data error: file {} line {}".format(file, l))
22              continue
23  
24          data_id = id + "-" + side + "-" + track
25          title_yomi = to_hiragana(title)
26          singer_yomi = to_hiragana(singer)
27  
28          print("{} | {} | {} | {} | {} | {} | {} ".format(data_id, title, title_yomi, singer, sinyomi, writer, composer))
29  
30  
31  if __name__ == "__main__":
32       main()

18行目から22行目はやや余計なエラー処理で、手入力してきた楽曲リストは項目数等をきちんとチェックしていなかったので、この機会にデータに抜けが無いかをチェックして、抜けがあった場合は "data error: " として表示させ、楽曲リストの修正を促すつもりで追加しました。

このコードを先に作ったto_hiragana()のコードにマージして、動作を試してみました。

$ python kakasi_test.py /mnt2/Karaoke/8140/8140.dat 
8140-1-01 | むらさき雨情 | むらさきあめじょう | 藤あや子 | ふじあやこ | 三浦康照 | 山口ひろし 
8140-1-03 | あなたの隣を歩きたい | あなたのとなりをあるきたい | 都はるみ | みやこはるみ | 坂口照幸 | 三木たかし 
8140-1-04 | 虞美人草 | ぐびじんそう | 長保有紀 | ながほゆき | 鳥井実 | 深谷昭 
8140-1-06 | 酒がたり | さけがたり | 山本譲二 | やまもとじょうじ | 里村龍一 | 三木たかし 
8140-1-07 | 陽だまり | ようだまり | マルシア | まるしあ | 高村圭 | 山崎一稔 
8140-1-08 | 希笛 | まれふえ | 堀内孝雄 | ほりうちたかお | 荒木とよひさ | 堀内孝雄 
8140-1-09 | シーサイド横浜 | しーさいどよこはま | 勝新太郎 | かつしんたろう | 西川ひとみ | 曽根幸明
....
8140-2-10 | Single is Best!? | Single is Best!? | 平松愛理 | ひらまつえり | 平松愛理 | 平松愛理 
8140-2-11 | 天使の休息 | てんしのきゅうそく | 久松史奈 | ひさまつふみな | 久松史奈・藤生ゆかり | 藤生ゆかり 
8140-2-12 | Passing Love | Passing Love | シュー・ピンセイ | しゅー・ぴんせい | 朝倉翔 | 大谷明裕

「うじょう」と読ませたい「雨情」「あめじょう」になったり、⁠きてき」と読ませたい「希笛」「まれふえ⁠⁠、⁠陽だまり」「ようだまり」になるなど、タイトルに多い当て字読みや英文表記には対応できていないものの、ざっと見た感じでは手動で修正するための下訳程度には十分使えそうです。

ソフトウェアの世界ではGIGO(Garbage In, Garbage Out:「ゴミを入れればゴミしか出てこない⁠⁠)という言葉があります。データベースでも、どんな便利なシステムを作ったとしても、中に入れるデータが不十分なら不十分な結果しか出てこないでしょう。そう考えて、だいぶ遠回りにはなるもののまずはこのスクリプトを使って楽曲リストを整理することにしました。

おすすめ記事

記事・ニュース一覧