2014/11/26

「炉心融解」を駅名だけで歌わせてみてる(3)

色々とあれですが、とりあえず最後まで出来ました。

#動画はオリジナルのものをお借りしています。
http://www.nicovideo.jp/watch/sm8089993




「炉心融解」を駅名だけで歌わせてみてる(1) では、Aviutlを使って全部手動で入力し、
「炉心融解」を駅名だけで歌わせてみてる(2) では、Cevioのデータを解析して動画を自動生成するというアプローチで進めてみました。

今回は、Cevioのデータを解析する代わりに、
歌声のwavファイルを解析することで、どのタイミングでどの歌詞を歌っているかを推定することで、
動画を自動生成するアプローチを取ってみました。
で、一応最後まで通してみました。

現状の実装では
・歌声のwavファイル
・歌詞がひらがなで書かれたファイル
・駅名と路線リスト
の3つを入力すると、4,5個のスクリプトを経由して
AviSynthのファイルが生成されます。
ちなみにAviSynthのファイルは「つんでれんこ」にそのまま投げられます。

精度で言うと、
自動推定なので、割とミスってる場所も見られます。
わかりやすい所で言うと、ロングトーン前後と最後がかなりひどいことになっています。

とはいうものの、(恐らく)人手やると手間がかかる、
歌詞が多い箇所は比較的うまく行っているようです。

Cevioを対象にするなら、Cevioのファイルそのものを解析したほうが正確なのですが、
今回のアプローチは音声を対象にするので、
人が歌った歌声等にもそのまま適用できるのがおいしいところです。

なんにしても、駅名炉心融解ももうちょいで完成しそうです。
今回作ったツールをまとめつつ、次のネタを考えたいところですね。

-----これまで
「炉心融解」を駅名だけで歌わせてみてる(2) 
「炉心融解」を駅名だけで歌わせてみてる(1) 
【垰瀬内なら】駅名替え歌を自動生成する(3) 【自動で作る】 
【垰瀬内なら】駅名替え歌を自動生成する(2) 【自動で作る】
【垰瀬内なら】駅名替え歌を自動生成する(1) 【自動で作る】

2014/11/22

Juliusのmkdfa.plをwindowsで動かせるようにした

まとめ:mkdfa.plの上の方にある$thisdirあたりを修正すれば動く

*Win版Julius dictation-kit-v.4.3.1で動作を確認しています。

Juliusで文法を自分で書くときに、
mkdfa.plというperlのスクリプトを使ってgrammar+voca -> dfaの変換をすると思うのですが、

windowsでそれをすると

fruit.grammar has 6 rules
fruit.voca    has 9 categories and 20 words
---
sh: mkfa: command not found
sh: dfa_minimize: command not found
---
no .dfa or .dict file generated

とかでてきて死にたくなります。

同じディレクトリにmkfa.exeとかdfa_minimize.exeとかあるのにnot foundとはこれいかに。

ということで、mkdfa.plをprintfデバッグします。
そうすると上の方にある$thisdirが空になっていることがわかりました。

要するにカレントディレクトリがとれてないという事になります。

ということで、上の方をちょちょいと書き換えます。

そうすると、

fruit.grammar has 6 rules
fruit.voca    has 9 categories and 20 words
---
Now parsing grammar file
Now modifying grammar to minimize states[0]
Now parsing vocabulary file
Now making nondeterministic finite automaton[8/8]
Now making deterministic finite automaton[8/8]
Now making triplet list[8/8]
9 categories, 8 nodes, 10 arcs
-> minimized: 8 nodes, 10 arcs
---
generated: fruit.dfa fruit.term fruit.dict

となって、動きます。

2014/11/20

「炉心融解」を駅名だけで歌わせてみてる(2)

とりあえず、できたところまで。
#動画はオリジナルのものをお借りしています。
http://www.nicovideo.jp/watch/sm8089993



AviSynthというソフトを使うと、スクリプトで字幕を入れられるようなのでテスト中。

どのタイミングで何を歌っているかわかれば
自動で字幕が入れられるようになるので、
回り道してそっちにも手を出そうかなあと思っているところです。

-----これまで
「炉心融解」を駅名だけで歌わせてみてる(1) 
【垰瀬内なら】駅名替え歌を自動生成する(3) 【自動で作る】 
【垰瀬内なら】駅名替え歌を自動生成する(2) 【自動で作る】
【垰瀬内なら】駅名替え歌を自動生成する(1) 【自動で作る】

2014/11/09

「ぴくかる」開発記録(9) -自分の絵を見た時に点数が倍になるバグを修正

絵師さんの戦闘力@pixivを測定するブラウザ拡張機能
「pixiv skill calculator」(ぴくかる)を開発しています。
最新版はv.1.5.3です。

Google Chrome版ダウンロード
Opera版ダウンロード(v.1.5.1なので注意!)
FireFox(+GreaseMonkey)版ダウンロード:
機能一覧:こちら

今回のアップデートはバグフィックスです。
#最近は垰瀬内ばっかで放置気味です……。

--前回との差分--
【バグフィックス】
自分の絵にアクセスした時に、自分のスキル値が倍になるバグを修正しました。

#前回のブログ記事でバグを報告していただきました。
  ありがとうございます!

【機能修正】
スキル値を表示する位置を変更しました。

タイトルの上から、下に移動させました。
その関係で、スキル値の表示が絵の横に回りこむのも解消されると思います。



--今後の課題--
【改良】適切なツールチップを表示させて、初見のユーザでも操作がわかるようにする

【改良】無視すべきタグ辞書の改良

【追加】マルチブラウザに対応させる
       →Safariは証明書が取得できればいけそう→審査落ちた?
       →落ちました。 ←New!

【改良】ライバル登録ボタン使用時の(見た目の)挙動
       →まだ改良の余地多数あり。

【改良】計算式にフォロー・マイピクを加味する

【バグ】R-18を表示させないようにするユーザがR-18を含む絵師のページに行くと、
    スキル値が適切に計算出来ない

【分析】Tinamiとの比較とか面白そう

【その他】もう少しスキル値を上げたい orz
現在19456/20346位@3384ポイント(上位95.6%) 

--その他--

Q.バグ/機能要望/質問等はどこへ?
この記事のコメントか、右側のtwitterに@なりDMなり飛ばしてください。
善処します。

2014/11/08

「炉心融解」を駅名だけで歌わせてみてる(1)

#内容的には以前の記事の続きなのですが、
  技術的な進展は特にないので……。

題名の通りのことをやっています。
今のところ、ここまで出来ました。

思ったより作るのしんどいような、そうでもないような。

動画はオリジナルのものをお借りしています。
http://www.nicovideo.jp/watch/sm8089993

2014/11/07

HTKで強制アライメントをする方法(略式)

【はじめに】
・今日の日付は 2014/11/07です。
・windows only です。
・本記事で説明することを実現するだけなら、たぶんJuliusでやった方が簡単です。
・HTKで強制アライメントをするために最低限何が必要か?を知るのには役立つかもしれません。

【やりたいこと】
Juliusについてる音響モデルで、HTKを使って強制アライメントする

【やらないこと】
音響モデルそのものの学習(HInit, HRest, HERest等)

【はじめに】
公式リファレンス:HTK Book
有力な参考文献: Miyazawa's pukiwiki, 近藤悠介 on the Web

あたりは読みましたか?

以下の内容は、
「これらを読んでも良くわからない」人向けに、
やりたいことを一直線で実現する手順を記していきます。

基本的に以下の作業ではコマンドプロンプトを使います。
Shift + 右クリックでコマンドプロンプトが開けることを
覚えておくと便利かもしれません。

【0.インストール】
まず、Visual Studioをインストールしておいてください。

その後、公式ページからHTK落として、公式ページどおりの手順でインストールしてください。
ダウンロードの際に登録が必要なので注意してください。

インストールが終わったら、環境変数の設定をしてください。
これも公式ページどおりです。

ちなみに、
「サンプルを動かすためにはperlが必要だよ」とか書いてあるのですが、
入れたところでエラー連発で動かないので無視しても良いと思います。
perlを触ったことがある方は適宜修正して、同じ結果が得られるかチェックすると安心です。

あと、Juliusをダウンロードして
jnas-mono-16mix-gid.hmmdefs
というファイルを見つけておいてください。
最後に使います。

【0.1 ビルドについて】

(2014/11/24追記)

ビルドくらい楽勝だよねみたいなノリで書いてしまったのですが、
改めて自分の違うPCでインストールしたらハマりました…
こちらのサイトを参考にするといいと思います。

(追記ここまで)

【1.特徴量抽出(Parファイル)】
wavファイルの音声の特徴量を抽出します。
以下、この特徴量ファイルをParファイルと呼ぶことにします。

C:\Users\hogehoge> HCopy -C コンフィグファイル Wavファイル 出力ファイル名

HCopyに限った話でもないのですが、
出力ファイル名を指定しないとエラーが起きることがあるので、必ず指定してください。

コンフィグファイルの中身は以下の通りです。
SOURCEFORMAT = WAV
TARGETKIND = MFCC_E_0
TARGETRATE = 100000.0
SAVECOMPRESSED = T
SAVEWITHCRC = T
WINDOWSIZE = 250000.0
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 26
CEPLIFTER = 22
NUMCEPS = 12
ENORMALISE = F

近藤悠介 on the webのものとほぼ同じですが、TARGETKINDのところだけ変えてあります。
これはjuliusの音響モデルと揃える都合上です。

【2. 辞書ファイル(Dicファイル)】
認識させたい単語(文章)を一覧にしたファイルを作ります。
以下、Dicファイルと呼びます。

Dicファイルの中身は、こんな感じにします。

p0 silB a r u h a r e t a h i n o g o g o
p1 m a h o u i j o u n o y u k a i g a silE

最初に単語名、次に音素列を並べます。
juliusの音響モデルを使用する場合文頭/末の空白を表すsilB/silEが使えます。
また、空白文字としてspが使えます

【3. 音素ファイル(phonesファイル)】
Dicファイルに含まれる音素全てを並べたファイル(以下phonesファイル)を作ります。

silB
a
r
u
h

みたいに、使う音素全てを書き並べていってください。


【4. 文法ファイル(Latファイル)】
先ほど、Dicファイルで指定した単語名を使って、
どういう順番で認識させるかを指定します。

例えば、p0だけでよい(音声が「ある晴れた日の午後」だけ)のなら

(p0)

p0, p1の順番で認識させたければ、

(p0 p1)

と書いて保存します。
これをgramファイルと呼びます
(次のコマンドの後は出てこないので、忘れても大丈夫です)

次に、HParseというコマンドを使って、これをHTK用の文法ファイルに変換します。
以下、これをLatファイルと呼ぶことにします。

C:\Users\hogehoge>Hparse gramファイル Latファイル

【5. 強制アライメント(Recファイル)】
Parファイル(Step 1), Dicファイル(Step 2), phonesファイル(Step3), Latファイル(Step 4)を使って、
強制アライメントをしていきます。

強制アライメントにはHViteというコマンドを使います。

C:\Users\hogehoge>HVite -w Latファイル -C コンフィグファイル -T 1 -H jnas-mono-16mix-gid.hmmdefs -m Dicファイル phonesファイル parファイル

コンフィグファイルは以下の通りです。
SOURCEKIND = MFCC_E_0
TARGETKIND = MFCC_E_D_N_Z

(parファイルの名前).recというファイルが出力されれば成功です!
適当なテキストエディタで開いてみてください。

0 300000 silB -248.249069 silB
300000 13100000 sp 9621.525391 sil
13100000 13400000 d -203.709473 p0
13400000 13700000 a -204.125214
13700000 14000000 i -205.093567


みたいな感じで、数字・数字・音素名・数字・(フレーズ名)
となってればokです。

ちなみに
一番左の数字はオンセットタイム
二番目の数字はオフセットタイム
三番目の数字は尤度を表しています。


【終わりに】
以上です。
HTKは相当高機能で、ここには書いてないような機能がたくさんあります。
これを最初の一歩にして、すばらしいHMMライフを送っていただけることをお祈りいたします。

2014/11/03

【垰瀬内なら】駅名替え歌を自動生成する(3 【自動で作る】

#きっとn番煎じ (n>1, n∈N)

【やっつけデモ】
「炉心融解」で歌詞を作ってCevioにベタ打ちさせるとこうなりました。










聴きました?










現状の出力結果はこんな感じ

元歌詞
今回の出力
(前回の出力)

 まちあかり はなやか えーてる ますいの つめたさ
 たちあらい はなやま えべつ  はるひの  つねやま
 (かみさかい はなやま  えべつ    はるひの   うめやま)

 ねむれない ごぜんにじ すべてが きゅうそくに かわる
  ねづ+えない  ごめんまち  すまでら  うおずみ      かわづ
 (ねづ+えない  ごめんまち  すまでら  うおずみ      わらび)

 おいるぎれのらいたー  やけつく ような いのなか
  おいつ+ひねの+やいた  まきむく ようが いのなだ
 (おいつ+ひねの+やいた  まきむく ようが いのなだ)

 すべてが そう うそなら ほんと(う)に よかったのにね
 すずめだ その ぬのはら ほんまち      こなかの+みね 
(すずめだ その ぬのはら ほんまち      こなかの+みね)

--ここから新規--

 きみの くびを  しめる ゆめをみた  ひかりの あふれる ひるさがり
 ひびの ゆびそ しべつ ゆもと+みた みかきの あつべつ みつわだい

 きみの ほそい のどが はねるのを なきだしそうなめで   みていた 
 にじの よろい おおだ  やなぎもと  わりだし+とうな+めで みてじま

 かくゆうごうろにさ       とびこんでみたいと      おもう
 かく+つるみおの+にま こび+こいで+みわ+みと おもと

 まさおなひかり    つつまれてきれい
 まるお+なち+さり つづ+わけ+へいせい

 かくゆうごうろにさ     とびこんでみたら    そしたら
 たく+ゆう+ととろ+きさ おび+とりで+みはら よしわら  

すべてが ゆるされるような     きがして
 ふじえだ  ゆず+さめず+ようか きが+みえ

 べらんだの    むこうがわ かいだんを のぼって いくおと
 れぶん+やの ぬまのさわ かいやまと のぼて    ゆのもと

 かげりだしたそらが      まどがらすにへやに   おちる
 はげ+みだ+ひた+そはら かすがばる+みせだに のびる

 かくさんするゆうぐれ   なきはらしたような ひのあか
 はくさん+すふ+ゆのまえ まるやました+おな ひろわら

 とけるよ(う)に すこしずつ すこしずつ  しんでいく   せかい
 とおりたに   るもい+ふく くほんぶつ しんげ+くず てらい

   きみの くびを しめる ゆめを みた はるかぜに ゆれる かーてん かわいて
  にいの くりの みはる ゆのお ちた はぶ+かめい ゆのつ はなてん  かばいけ

 きれた くちびるから    こぼれる ことばは  あわのよう
 ひけた くじ+りふ+はら ほろべつ  のとがわ あわの+よの

 かくゆうごうろにさ    とびこんで  みたいと   おもう まっしろにきおく  とかされてきえる
 さく+ぬまぶくろ+いさ もり+といで きた+いほ よこお やしろ+にしはる とさくれ+めいほう 

 かくゆうごうろにさ      とびこんで みたら
 がく+くす+とうろ+ひわ もじ+こまえ+みなら

 また むかし みたいに ねむれる ような そんな きがして
 やた むらい みついし えんがる よつや  ほんな しが+ひめ 

 とけいの びょうしんや てれびの しかいしゃや
 よこいそ ぞうしがや  めぐみの  しもいさか
 
 そこにいるけど   みえない だれかの わらいごえ   ほうわ して   はんきょうする
 ぼこい+みぶ+でと みえまち はしらの わらび+のえ もおか+ひえ はなぞの+うす

 あれぐろ・あじてーと みみなりが きえない やまない
 あぞうの+たじべ      みき+なりた  きこない やまな

 あれぐろ・あじてーと みみなりが  きえない やまない
 やつしろ+やまて      みい+はりま みえばし やまだ

 だれも みんな きえてく   ゆめを みた まよなかの へやの ひろさと せいじゃくが
 やくも じんば みねのぶ ゆさと ひら さよ+なかの てらお しもさと へいわ+くが

 むねにつっかえて じょうずに いきが できなくなる
 むれ+みつ+かまて ぞうしき  いしが せき+やぶ+やつ

 Shout!
 ひな!

 かくゆうごうろにさ    とびこんで  みたら
 やす+ゆら+こうろ+ちわ ほみ+こぼけ みたか

 そしたら きっと ねむるように  きえていけるんだ
 よしはま きよ   てたる+とうに きりめ+ちたはんだ

 ぼくの いない あさは   いまより ずっと すばらしくて
 よぶの いわい あたわ いまばり ふと  すわ+かみすげ

 すべての  はぐるまが かみあった  きっと そんな せかいだ
 すえ+せの たつるはま かみ+あがた きの  ほんだ せや+きだ

 (Ah...)
 あわ+あわや

【実装】
・ユーザが歌詞をいい感じに区切ると、
 それと同じ文字数で似たような母音を持つ駅名をデータベースから拾ってくる
(異なる母音の文字数=距離で距離最短の駅名を使用)

・駅名間の距離は母音間の距離を文字ごとに計算した時の和

・母音間の距離は以下の通り
 母音不一致: 0.25
 母音一致:0 (駅名の始め/終わりの時は-2)
 文字一致:-0.25

・同じ駅は使わないようにする
(ただし同名の駅が複数個ある場合はその数まで可)

データベースにはwikipediaの日本の鉄道駅一覧を使用。

【前回との差分】
・バグ取り!
 -「かわる」を「わらび」と歌うのはさすがにおかしい
 -た行の駅がことごとくバグってた

・データベース中の「っ」「ゃ」「ゅ」「ょ」を、置換することで対応
 ex. 「きゃ」->「か」
 -なので、本来は「きゃ」と読むべき駅名を「か」と歌ってしまっている可能性

【課題】
・歌わなくてもいい音の推定
(あれぐろ・あじてー、みみなりがきえなやまない みたいな)

・時間伸縮に対応させる
(おいるぎれの -> おいつ+きれ+のう みたいな)

・実際の発音と表記の発音が違う問題をどうにかする
(ほうき->ほおき みたいな)

・そもそもユーザが歌詞を切らなくていいようにする

・デモ用のWebページつくる

・cevioをマスターする