ミク語変換(初音ミク用歌詞データ生成)Rubyスクリプト

年末年始は初音ミク三昧。


いろいろ触ってて思ったのは、歌詞のテキスト起こしがけっこう面倒くさいということ。だいたい以下のようなことをする必要があります。

  1. 漢字はすべてカナにする
  2. 助詞の「は」は発音どおり「わ」にする(例:あれは何→あれわなに)
  3. 他にも表記と発音が違うものは発音どおりにする(例:どうすりゃいいの→どおすりゃいいの)
  4. 促音の「っ」は直前の母音にした方がうまくいく(例:ちょっとでいいのだ→ちょおとでいいのだ)


そんなわけでそういった変換を自動でやってくれるプログラムを作ってみました。一番大変な上記1〜3はMeCabを入れれば全部やってくれるので、実は促音の処理を書くだけです。このへんを参考にしました。


ためしにid:navさんの自動作詞で生成した歌詞を変換すると以下のようになります。


実行

ruby mikugo.rb < kanji.txt > kana.txt


入力

    ベッドのまぶた


ひろがる 秘密 アレルギーが鏡
君の胸は照れ隠しの 投げすてたね


光る自分 ゴーストの 落書きと 会話


こぼれる蜃気楼は 影が思う
野性的なエクスタシーの 終わりと やなあした
星くずの 自由と地図
スタイルのぬれて ベッドのまぶた


ひろがる 秘密 アレルギーが鏡
君の胸は照れ隠しの 投げすてたね


出力

    べえどのまぶた


ひろがるひみつあれるぎいがかがみ
きみのむねわてれかくしのなげすてたね


ひかるじぶんごおすとのらくがきとかいわ


こぼれるしんきろおわかげがおもう
やせいてきなえくすたしいのおわりとやなあした
ほしくずのじゆうとちず
すたいるのぬれてべえどのまぶた


ひろがるひみつあれるぎいがかがみ
きみのむねわてれかくしのなげすてたね


ソースコード

#!/usr/bin/ruby

$KCODE='UTF8'

require 'jcode'
require 'MeCab'

class Mikugo
  def initialize
    @mecab = MeCab::Tagger.new('-F%pS%f[8] -U%M -E\n')
  end

  def generate(s)
    ss = @mecab.parse(s)        # 漢字->カタカナ変換
    ss.tr!('ア-ン','あ-ん')     # カタカナ->ひらがな変換
    ss.gsub!(/[  ]/,'')        # 空白文字の削除
    ss.gsub!('','')         # 'を'->'お'変換
    ss = conv_sokuon_chouon(ss) # 促音、長音の処理
    return ss
  end

  def conv_sokuon_chouon(s)
    a = s.split(/[っー]/)
    a.length.times {|i|
      if (i > 0)
        # 促音、長音の場合は1文字前の母音に変換
        pre_char = a[i-1][/.$/]
        a[i] = get_vowel(pre_char) + a[i]
      end
    }
    return a.join
  end

  # 母音変換
  def get_vowel(c)
    if "あかさたなはまやらわがざだばぱゃ".include?(c)
      return ""
    end
    if "いきしちにひみりぎじぢびぴ".include?(c)
      return ""
    end
    if "うくすつぬふむゆるぐずづぶぷゅ".include?(c)
      return ""
    end
    if "えけせてねへめれげぜでべぺ".include?(c)
      return ""
    end
    if "おこそとのほもよろをごぞどぼぽょ".include?(c)
      return ""
    end
    return ""
  end
end

#---------------------------

miku = Mikugo.new()
while( s = gets )
  puts miku.generate(s)
end