トップ   新規 一覧 単語検索   ヘルプ   最終更新のRSS

Luceneによる動画検索システム のバックアップソース(No.1)

#access
#analog

*講演音声検索システムの開発 [#y8668a8d]

-CSJの講演音声の音声認識を行い、キーワード検索を行なうことのできるウェブアプリケーションを開発します((2009前期 菊池研B3実習課題))。
--音声認識は Julius を使用
--キーワード検索は Lucene を使用
--ウェブアプリサーバには tomcat を使用

***Juliusのインストール [#g30b1c09]
-[[JuliusとJulian]] を参考に、[[Linux版Juliusのバイナリファイル:http://sourceforge.jp/projects/julius/downloads/37582/julius-4.1.2-linuxbin.tar.gz]] と [[ディクテーション実行キット:http://sourceforge.jp/projects/julius/downloads/28977/dictation-kit-v3.2.tar.gz]] をダウンロードして、julius/ ディレクトリ以下に解凍します。
-&pgid(,JuliusとJulian/音響モデルと言語モデルを差し替える); を参考に、Juliusの言語・音響モデルをCSJのものに差し替えておきます。

***動画(wmv)ファイルから音声を抽出してwavファイルを作り、検索対象にする場合 [#k68c1d0c]
※ 今回は shower の /home/CSJ/disc03/ にある講演の WAV ファイルを認識させるので、以下は行いません。
-[[ここ:http://www.pnkx.com/wp/?p=132]] を参考に...
 mplayer WMVファイル -vo yuv4mpeg -ao pcm
--audiodump.wav が取り出した音声ファイル。


***音声認識を実行する [#r5f47040]
-julius の設定ファイルを書き換えます。
 emacs julius/dictation-kit-v3.2/fast.jconf
--222行目を「-input rawfile          # 音声波形データファイル(フォーマット自動判別)」に変更
--226行目を「#-input mic              # マイクから直接入力」に変更
--232行目を「-filelist filename      # 認識対象ファイルのリスト」に変更
--273行目を「-smpFreq 16000         # サンプリング周波数(Hz)」に変更

-認識対象のWAVファイルのリストを作ります。
--[[SearchWavJulius.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/lucene/SearchWavJulius.java.txt]] を実行
 $ java SearchWavJulius /home/CSJ/disc03 result1 searchWavJulius.sh /home/m-kouki/julius/julius-4.1.2-linuxbin/bin/julius-4.1.2 /home/m-kouki/julius/dictation-kit-v3.2/fast.jconf
--ディレクトリ result1 内に、ファイルリスト (ファイル名).eval.list ができます((一括してひとつのファイルリストに書き出した場合、後述する  -cutsilence オプションをつけても認識エラーが出るWAVファイルがあり、そこでJuliusの処理が止まってしまうので、1音声=1ファイルで別々に認識を実行することにしました))。
--認識実行用シェルスクリプト searchWavJulius.sh ができます。

-認識してみる
--Juliusのデフォルトでは1ファイル=1発話として扱うため、長い講演を最後まで認識できないので、 -cutsilence オプションをつけます(M君のレポートより、[[参考:http://julius.sourceforge.jp/juliusbook/ja/desc_adin.html#id2528030]])
 $ chmod 777 /home/m-kouki/julius/julius-4.1.2-linuxbin/bin/*
 $ sh searchWavJulius.sh

-認識結果を解析して、各音声ファイルごとに分ける
--[[editResult.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/lucene/editResult.java.txt]] を実行
 $ java editResult result2 result1 .ofj log_editResult.txt
---result2 ディレクトリ内に認識結果のtxtファイルができます。
---テキストファイルは Shift-JIS で書き出されます((SHIFT-JIS以外の文字コードでは検索に失敗するようです(参考:[[Lucene-ja:http://www.f.waseda.jp/kikuchi/tips/Lucene-ja.html]])))。

-認識失敗ファイルを削除する
--0バイトのファイルは、luceneでインデックスを作るときにエラーになるので、ここで削除しておきます。
 $ find result2 -size -1k -exec rm {} \;
---参考:[[ファイルサイズで検索:http://www.atmarkit.co.jp/flinux/rensai/linuxtips/039expsearch.html]] [[rmの指定方法:http://x68000.q-e-d.net/~68user/unix/pickup?find]]

***Tomcatのインストール [#o0a9443c]
-[[tomcat導入メモ:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?tomcat%E5%B0%8E%E5%85%A5%E3%83%A1%E3%83%A2]] を参照(([[Think IT 第4回 TomcatをLinuxへインストールしよう!:http://www.thinkit.co.jp/free/article/0708/2/4/]] による))
--上を参考にして、環境変数 $CATALINA_HOME(tomcatインストールディレクトリ)、クラスパスの設定まですませておきます。

***Luceneのインストール [#sb44acc9]
-[[Lucene導入メモ]] を参照
--上を参考にして、環境変数、クラスパスの設定まですませておきます。
-インデックスを作る
 $ sh $LUCENE_HOME/bin/mktextindex.sh -create -index result2 result3
--result3 ディレクトリ内にインデックスファイルができます。

***Webアプリとして実装 [#cac802a5]
-参考:[[卒論要旨検索システムの開発(2008年度ウェブ検索実習課題):http://www.f.waseda.jp/kikuchi/ThesisSearch2008.htm]] [[Lucene-ja:http://www.f.waseda.jp/kikuchi/tips/Lucene-ja.html]] [[講義音声検索システムの開発:http://bryan.human.waseda.ac.jp/~kikuchi/cgi-bin/pukiwiki/pukiwiki.php?%B9%D6%B5%C1%B2%BB%C0%BC%B8%A1%BA%F7%A5%B7%A5%B9%A5%C6%A5%E0%A4%CE%B3%AB%C8%AF]]
--上記を参考にして、lucene-jaディレクトリにあるwebappディレクトリ以下をtomcatのwebappsディレクトリ以下にコピーします。
 $ mkdir $CATALINA_HOME/webapps/lucene-ja
 $ cp -r $LUCENE_HOME/webapp/* $CATALINA_HOME/webapps/lucene-ja
--tomcatを再起動
 $ sh $CATALINA_HOME/bin/shutdown.sh
 $ sh $CATALINA_HOME/bin/startup.sh
--[[http://shower.human.waseda.ac.jp:8080/lucene-ja/:http://shower.human.waseda.ac.jp:8080/lucene-ja/]] にアクセス
---「ようこそLuceneのテンプレートアプリケーションへ。 (これはヘッダです)」のページが出ることを確認します。

-テストページのメッセージに従って、各種ファイルの設定を変更する
--lucene-ja設定ファイル
 $ emacs $CATALINA_HOME/webapps/lucene-ja/configuration.jsp
---configuration.jsp の以下を修正
 /* indexLocationにIndexJHTMLで作成したインデックスを指定して下さい */
 String indexLocation = "(インデックス出力先)";
 
 /* senHome に Senをインストールしたディレクトリを指定し、そのディレクトリのdicディレクトリに辞書を作成済かどうか確認して下さい*/
 String senHome = "(SENのディレクトリ)";
---(インデックス出力先) は result3 を指定
---(SENのインストールディレクトリ) は $SEN_HOME に入っているものと同じ値を直接記述します。

--tomcat設定ファイル server.xml
 $ emacs $CATALINA_HOME/conf/server.xml
---94行目に以下の属性を追記
     <Connector port="8080" useBodyEncodingForURI="true"

--tomcat設定ファイル catalina.sh
 $ emacs $CATALINA_HOME/bin/catalina.sh
---166行目 を以下に修正(参考:[[Lucene-ja:http://www.f.waseda.jp/kikuchi/tips/Lucene-ja.html]])
 JAVA_OPTS="$JAVA_OPTS "-Dsen.home=(SENのディレクトリ)" "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties"

--http://shower.human.waseda.ac.jp:8080/lucene-ja/ で確認
---「検索」ボタンを押して、エラーメッセージが出ないことを確認します。
---ヒットはしているようですが、IndexSearcher.search の urlフィールド、titleフィールドの中身がないので((これらの情報は mkhtmlindex.sh で作成したインデックスにのみ付加されているようです))、何も表示されません。

-フィールドの情報を書き換える
--$CATALINA_HOME/webapps/lucene-ja/results.jsp の 121 行目
 String url = doc.get("url");                 //urlフィールドを取得
 String doctitle = doc.get("title");          //タイトルを取得
の部分は、mktextindex.sh でインデックスを作った場合、該当するフィールドがないため null が入ります。
--lucene-ja ディレクトリにある lucene-ja-src.jar を解凍してソースファイルを確認すると、
 $ jar xvf lucene-ja-src.jar
---SearchJFiles.java の 103行目
 Document doc = hits.doc(i);
 String path = doc.get("path");
 if (path != null) {
     System.out.println(i + ". " + path + "\tcharset=" + doc.get("charset"));
のところが、mktextindex.sh で作られたインデックスの分析結果の出力部分。
---したがって path フィールドと charset フィールドに値が入っていることが分かります。
--そこで、$CATALINA_HOME/webapps/lucene-ja/results.jsp の以下を書き換えます。
 emacs $CATALINA_HOME/webapps/lucene-ja/results.jsp
---109行目以降
  <td>パス</td>
  <td>文字コード</td>
---121行目以降
 String path = doc.get("path");               //pathフィールドを取得
 String charset = doc.get("charset");         //charsetを取得
 if(path!=null){
 %>
   <tr>
   <td><%=path%></td>
   <td><%=charset%></td>
   </tr>
 <%
--Luceneを再起動
 $ sh $CATALINA_HOME/bin/shutdown.sh
 $ sh $CATALINA_HOME/bin/startup.sh
--[[http://shower.human.waseda.ac.jp:8080/lucene-ja/ :http://shower.human.waseda.ac.jp:8080/lucene-ja/]] にアクセス
---無事、検索結果が表示されました!
#ref(lucene1.jpg)

--確認したらシャットダウンしておく
 $ sh $CATALINA_HOME/bin/shutdown.sh

***カスタマイズ [#r3a05a11]
-画面のデザインを変えたい場合は、$CATALINA_HOME/webapps/lucene-ja/ 以下の JSPファイル(java埋め込みhtmlファイル)を編集します。
-検索結果を変えたい場合は、$LUCENE_HOME/lucene-ja-src.jar を解凍してできる org/apache/lucene/demo 以下にある  SearchJFiles.java や IndexJFiles.java を編集します。
-もしくは results.jsp の中に「パスで指定されたファイルを読み込んで、クエリと照らし合わせて[[スニペット:http://d.hatena.ne.jp/keyword/%A5%B9%A5%CB%A5%DA%A5%C3%A5%C8]]を生成する」プログラムを書いてもいいかもしれません。
--'''[[修正版results.jsp:http://shower.human.waseda.ac.jp/~m-kouki/pg/lucene/results.jsp.html]]'''(赤字の部分が追記した場所)
---ヒットしたテキストファイルをhtmlに変換してリンクを表示します。