今回は前回に引き続き、
プラグインの概要
本連載の第250回と第251回では、
処理内容などはほぼ前回を踏襲します。すなわち、
MeCabとMbrolaに関しては、
MeCabと辞書の準備
まずは、
$ sudo apt-get install ruby-mecab
次にMeCabが利用する辞書をインストールします。今回も
$ sudo apt-get install mecab-naist-jdic
システム上に辞書が複数存在する可能性があるため、
$ sudo update-alternatives --config mecab-dictionary alternative mecab-dictionary (/var/lib/mecab/dic/debian を提供) には 2 個の選択肢があります。 選択肢 パス 優先度 状態 ------------------------------------------------------------ * 0 /var/lib/mecab/dic/naist-jdic 100 自動モード 1 /var/lib/mecab/dic/naist-jdic 100 手動モード 2 /var/lib/mecab/dic/naist-jdic-eucjp 90 手動モード 現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:
これで、
#!/usr/bin/ruby
require 'MeCab'
msg = 'やあ、こっちに来ておくれよ、と彼は言う。'
tokenizer = MeCab::Tagger.new('-Owakati')
result = tokenizer.parseToNode(msg)
while result = result.next do
p(result.surface, result.feature)
end
以下のような出力が得られたら成功です。
$ ./sample.rb "やあ" "感動詞,*,*,*,*,*,やあ,ヤア,ヤー,," "、" "記号,読点,*,*,*,*,、,、,、,," "こっち" "名詞,代名詞,一般,*,*,*,こっち,コッチ,コッチ,," "に" "助詞,格助詞,一般,*,*,*,に,ニ,ニ,," "来" "動詞,自立,*,*,カ変・来ル,連用形,来る,キ,キ,き/来," "て" "助詞,接続助詞,*,*,*,*,て,テ,テ,," "おくれよ" "動詞,自立,*,*,一段,命令yo,おくれる,オクレヨ,オクレヨ,おくれよ/後れよ/遅れよ," "、" "記号,読点,*,*,*,*,、,、,、,," "と" "助詞,格助詞,引用,*,*,*,と,ト,ト,," "彼" "名詞,代名詞,一般,*,*,*,彼,カレ,カレ,," "は" "助詞,係助詞,*,*,*,*,は,ハ,ワ,," "言う" "動詞,自立,*,*,五段・ワ行促音便,基本形,言う,イウ,イウ,いう/云う/言う/謂う," "。" "記号,句点,*,*,*,*,。,。,。,," "" "BOS/EOS,*,*,*,*,*,*,*,*"
Mbrolaの準備
次はMbrolaの準備です。まず
$ sudo apt-get install mbrola
次に、
これでmbrolaを使う準備が整いました。実際に使えるかどうか、
w 55 0 400
a 55 0 400
t 55 0 440
a 55 0 440
S 75 0 440
i 75 0 440
w 75 0 400
a 75 0 400
m 75 0 400
i 75 0 400
k 75 0 430
u 75 0 430
_ 75 0 400
t 75 0 400
a 75 0 420
a 500 0 420 20 440 40 400 60 440 80 400 100 440
tS 75 0 400
a 75 0 400
N 75 0 400
_ 75
サンプルをsample.
$ mbrola ./jp3/jp3 ./sample.pho -.raw | aplay -D default -r 22050 -c 1 -f S16_LE
「わたしはみくったーちゃん」
なお上記コマンドを実行するとmbrolaプロセスがコアダンプします。筆者が確認する限りfree(3)やmunmap(2)の実行でSIGSEGVが送出されることから、
プラグインの作成
以上で準備が整いました。前回の最後のサンプルについて、
Mecabrola.create(:mecabrola) do
onupdate do |service, messages|
# Skip when several messages are going to be displayed.
if messages.length() > 1 then
next
end
if !messages[0].respond_to?('body') then
next
end
# The array includes one message.
tokens = self.tokenize_message(messages[0].body())
lines = self.generate_pho_lines(tokens)
handle = self.write_pho_file(lines)
self.run_mbrola_aplay(handle)
end
end
今回は簡便のため、
Mecabrolaクラスの各メソッドの内部処理に関しては、
プラグインの試験
以下がプラグインの圧縮アーカイブです。
mikutterの作法に従って
$ ls -1a ~/.mikutter/plugin/mecabrola/ . .. .mikutter.yml jp1 jp3 mecabrola.rb
mikutterを再起動すると、
- u-xo: フォロワーの
「ふぉ」 など - u-xe: ウェブの
「うぇ」 など - u-xi: イポンツィの
「ツィ」 など - dZ-_: じょうろの
「じょ」 など - S-j: 商標の
「しょ」 など - dZ-j: 順列の
「じゅ」 など
どのような組み合わせで終了しているかは、
$ mikutter --debug ... Fatal error: Unkown recovery for e-xi segment ...
加えて、
まとめ
本レシピではTwitterプラグインであるmikutterのプラグインを書き、