TOPIC CACHE LANGUAGE MODEL FOR SPEECH RECOGNITION

ICCASP 2010
著者:Chuang-Hua Chueh and Jen-Tzung Chien
アブストラクト:伝統的なN-Gram言語モデルは長距離の文脈情報を考慮できない。キャッシュモデルはこの弱点を補うのに適している。この論文では、音声認識タスクにおいて潜在ディリクレ言語モデル(latent dirichlet language model)に基づいた新しいトピックキャッシュモデルを提案する。潜在ディリクレ言語モデルでは、潜在的なトピック構造がn-gramイベントから推定され、単語の予測に置いて用いられる。特に、長距離のトピック情報は広い区間の単語履歴から連続的に更新され、ベイズ学習を通してトピックの混合を生成するときに動的に統合される。トピックキャッシュ言語モデルは未知のn-gramイベントに対しても効果的に特徴付けることができ、長距離の言語モデルに対するトピックのキャッシュを捉えることができる。Wall Street Journal コーパスにおける実験で、提案手法はベースラインのn-gara言語モデルなどと比較して、パープレキシティと認識精度においてより良い精度を達成した。
キーワード:Natural language, Bayes procedure, clustering method, smoothing method, speech recognition
状態:未読

Topic tracking language model for speech recognition

http://portal.acm.org/citation.cfm?id=1879661
年:2011
著者:Shinji Watanabe, Tomoharu Iwata, Takaaki Hori, Atsushi Sako and Yasuo Ariki*1
アブストラクト:実際の環境で、音響や言語の特徴は話者、話し方、話題の変化に大きく依存する。これらの変化に対応するために、環境の変化を追跡する音声認識のアプローチに注目が集まっている。この論文では、今話している人の言語情報に基づいたトピックや以前推定したトピックモデルにおける変化を適応的に追跡することが可能な言語モデルのトピック追跡を提案する。提案するモデルは音声認識における言語モデル適応に応用可能である。音声認識実験において、MIT OpenCourseWareコーパスとCSJを用いて、提案手法の効果を示す。
キーワード:Language model; Latent topic model; Topic tracking; On-line algorithm; Speech recognition
状態:未読

*1:CS研!

動的ダブル配列

動的にキーの追加ができるTrieを探していたが、動的ダブル配列でできるということでメモ。

大雑把に他のデータ構造との性能比較すると、次のような感じ。

  • ハッシュ(C++で言う std::map, std::tr1::unordered_map)よりも検索が速い
  • 静的ダブル配列よりもデータサイズは少しorかなり大きいが、検索速度はあまり変わらない
  • 簡潔データ構造よりもかなり検索が速いが、データサイズはかなり大きい

Kindle雑感

Kindle を1週間ぐらい使った感想。Kindleを買おうか迷っている人、どのKindleにするか選ぶのに迷っている人に参考になれば。

買ったのは これ。値段は $379.00。通称は Kindle DXg らしい。Kindle を買った理由は、PDFをPCで読みたくなかったから。というのは、英語の学術書・技術書は無料でPDFとして公開されているものが多くて、自分は興味があるものを見つけてはダウンロードしてるんだけど、PC では読みたくないし、何百ページも印刷するのは気が引ける。そういうものを快適に読みたくて、Kindle を買った。実際割と快適に読めるので、そこは良かった。DX にしたのはA4サイズを読むのだったら、大きい画面の方がいいかなという理由。英語の本に限らず、論文や講義スライドでもちゃんと読めるので、読みたいのがあれば何でも Kindle にぶち込めばいいと思う。

使ってみて思う Kindle の一番良いところは、場所を限定せずに英語の本を Kindle で完結して読める点。Kindle にはデフォルトでオックスフォード英英辞典が付属していて、シームレスに英単語の意味を調べることができる。PCや紙で英語の文章を読むときの落とし穴として、ブラウザで英辞郎 on the web を開いて、わからない単語に出会ったら逐一調べるというスタイルがありがちだと思うが、PCの前にいると不思議なことに気づいたらネットサーフィンをして時間を浪費しているということがよくある。Kindle ならそういう時間の無駄を比較的回避できてると思う。また、場所を限定しないというのは、3G回線を無料で使えてカフェとか電車の中とかどこでもインターネットができる。バッテリーも充電せずに余裕で1週間はもつので、電源確保やバッテリー切れの心配もいらない。後、字が読みやすく、紙の本を読んでいる感覚。実際に使ってみると、液晶ディスプレイとは全然違う。

もちろん不満な点もある。最大の不満はPDFをKindle専用フォーマットに変換しないとテキストのハイライト、注釈機能、付属の英英辞典がシームレスに引くことができない点。PDFをKindle専用フォーマットに変換してくれるAmazon.comの変換サービスがあるのだけど、現状では図表の変換が崩れていてその付近ではひどいことになって読みづらい。

他の細々とした悪い点

  • いちいち動作が遅い
  • Kindle DXg の場合、日本語化ハックをしないと日本語が表示できない。他の Kindle 3G なら標準で日本語表示が可能らしい。
    • ハック気質のある人ならいいが、そうでない人なら苦痛を伴う作業
  • 画面を切り替えるとき、1秒くらい白黒が反転する
  • タッチパネルでないので、テキストに線を引いたり、注釈を付けるのにカーソル移動が必要で面倒

勝手にまとめると、まぁなんというか、こういう新しいデバイスにはわくわくさせられる。なんと言っても、無料コンテンツがあるのが楽しい。日本語でなら青空文庫著作権切れの作品が読める。ありがたいことに、Kindle 向けの青空文庫を快適に読むための青空キンドルというウェブサービスもある。英語なら ManyBooks.net, FreeKindleBooks.org でシャーロックホームズシリーズなどが無料だし、 Amazon.comKindle Store でもいくつか無料コンテンツがある。ダウンロードだけして読まないにしても、少なくとも所有欲は満たされるので気分がいい。電子書籍業界はどんどん広がりを見せてくれると思うし、今後も期待せざるを得ない。

IPC::Open2 'open2'

IPC::Open2 'open2' はPerl上であるコマンドに好きな入力を与えて、その出力を利用したいという時に使える。
標準の open では

open(COMMAND, "command |");
open(COMMAND, "| command");

みたいに、どちらか片方しか扱えない。

IPC::Open2 'open' の使い方

use IPC::Open2;
open2(*README, *WRITEME, $program);
print WRITEME "here's your input\n"; # $program に "here's your input\n" という入力を与える
close(WRITEME);                      # 入力を与え終わったら、出力用のパイプを閉じる
for my $ret (<README>) {             # $program から与えた入力の加工結果を受け取る
    print $ret;
}
close(README);

詳細は
perldoc IPC::Open2
というか、プロセス間通信のことよく知らないのでもっと調べたい。

コマンドライン上でapeファイルをmp3にエンコード

コマンドライン上でapeファイルをmp3にエンコードしたかったので調べた。Linuxユーザを想定しているけど、GUIでやりたい人は

を参考にすればできると思う。Windowsユーザはググれば何か見つかるでしょう。

まず結論を先に言うと、shntoollamemac をインストールして端末上で

shnsplit CDImage.ape -f CDImage.cue -o 'cust ext=mp3 lame --quiet - %f' -t "%n. %t"

を実行すれば、CDImage.ape をmp3ファイルにエンコードして、分割できる。

実行例の解説

簡単にこの実行例を解説すると、
shntool(shnsplit)は可逆圧縮されたファイルに多彩な処理(デコード・分割・エンコード)が可能で、wav, flac, ape, tta, wma などの入力に対応しているらしい。
-f オプションで、cueファイルを指定する。cueファイルは「この時間からこの時間まではhogeという曲で、fugaという歌手が歌ってる」といった風なapeファイルを分割するために必要なメタ情報を含んだテキストファイル。
-o オプションで、入力ファイルをどういう形式のファイルにエンコードするか記述する。mp3にエンコードする場合、ここで lame が必要となる。
-t オプションで、出力ファイル名のフォーマットを記述する。上の実行例で使ってる%nはトラック番号、%tはトラック番号を表す。他には%a(アルバム名)、%p(作曲家)というのがある。

shntool には他にも色んなオプションがあるので、詳しくは man shntool をご覧ください。

必要なもののインストール方法

前者2つ shntool と lame は apt で次のようにすればインストールできる。

sudo aptitude install shntool lame

最後の mac のインストールは

wget http://supermmx.org/resources/linux/mac/mac-3.99-u4-b5.tar.gz
tar zxvf mac-3.99-u4-b5.tar.gz
cd mac-3.99-u4-b5
./configure
make
sudo make install

で完了の筈だったけど、make時に次のようなコンパイルエラーがでた。

APELink.cpp: In member function 'void CAPELink::ParseData(const char*, const str_utf16*)':
APELink.cpp:66: error: invalid conversion from 'const char*' to 'char*'
APELink.cpp:67: error: invalid conversion from 'const char*' to 'char*'
APELink.cpp:68: error: invalid conversion from 'const char*' to 'char*'
APELink.cpp:69: error: invalid conversion from 'const char*' to 'char*'

これは mac-3.99-u4-b5/src/MACLib/APELink.cpp というファイルでconstが必要なのに付いてないがために起こるエラー。なので、constを付けるだけで修正できる。修正後のファイルとの差分 *1 は次のようになった。

66,69c66,69
<         char * pHeader = strstr(pData, APE_LINK_HEADER);
<         char * pImageFile = strstr(pData, APE_LINK_IMAGE_FILE_TAG);
<         char * pStartBlock = strstr(pData, APE_LINK_START_BLOCK_TAG);
<         char * pFinishBlock = strstr(pData, APE_LINK_FINISH_BLOCK_TAG);
---
>         const char * pHeader = strstr(pData, APE_LINK_HEADER);
>         const char * pImageFile = strstr(pData, APE_LINK_IMAGE_FILE_TAG);
>         const char * pStartBlock = strstr(pData, APE_LINK_START_BLOCK_TAG);
>         const char * pFinishBlock = strstr(pData, APE_LINK_FINISH_BLOCK_TAG);
84c84
<                 char * pImageCharacter = &pImageFile[strlen(APE_LINK_IMAGE_FILE_TAG)];
---
>                 const char * pImageCharacter = &pImageFile[strlen(APE_LINK_IMAGE_FILE_TAG)];
>

これでもう一度makeし直すと、無事コンパイルできた。

*1:差分は diff -Naur 修正前のAPELink.cpp 修正後のAPELink.cpp で取った