Luceneによる動画検索システム
Last-modified: 2016-02-09 (火) 00:58:47
Top / Luceneによる動画検索システム
講演音声検索システムの開発 †
- CSJの講演音声の音声認識を行い、キーワード検索を行なうことのできるウェブアプリケーションを開発します*1。
- 音声認識は Julius を使用
- キーワード検索は Lucene を使用
- ウェブアプリサーバには tomcat を使用
Juliusのインストール †
- JuliusとJulian を参考に、Linux版Juliusのバイナリファイル と ディクテーション実行キット をダウンロードして、julius/ ディレクトリ以下に解凍します。
- JuliusとJulian/音響モデルと言語モデルを差し替える を参考に、Juliusの言語・音響モデルをCSJのものに差し替えておきます。
動画(wmv)ファイルから音声を抽出してwavファイルを作り、検索対象にする場合 †
※ 今回は shower の /home/CSJ/disc03/ にある講演の WAV ファイルを認識させるので、以下は行いません。
- ここ を参考に...
mplayer WMVファイル -vo yuv4mpeg -ao pcm
- audiodump.wav が取り出した音声ファイル。
音声認識を実行する †
- 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 を実行
$ 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 ができます*2。
- 認識実行用シェルスクリプト searchWavJulius.sh ができます。
- SearchWavJulius.java を実行
- 認識してみる
- Juliusのデフォルトでは1ファイル=1発話として扱うため、長い講演を最後まで認識できないので、 -cutsilence オプションをつけます(M君のレポートより、参考)
$ chmod 777 /home/m-kouki/julius/julius-4.1.2-linuxbin/bin/* $ sh searchWavJulius.sh
- Juliusのデフォルトでは1ファイル=1発話として扱うため、長い講演を最後まで認識できないので、 -cutsilence オプションをつけます(M君のレポートより、参考)
- 認識結果を解析して、各音声ファイルごとに分ける
- editResult.java を実行
$ java editResult result2 result1 .ofj log_editResult.txt
- result2 ディレクトリ内に認識結果のtxtファイルができます。
- テキストファイルは Shift-JIS で書き出されます*3。
- editResult.java を実行
- 認識失敗ファイルを削除する
- 0バイトのファイルは、luceneでインデックスを作るときにエラーになるので、ここで削除しておきます。
$ find result2 -size -1k -exec rm {} \;
- 0バイトのファイルは、luceneでインデックスを作るときにエラーになるので、ここで削除しておきます。
Tomcatのインストール †
- tomcat導入メモ を参照
- 上を参考にして、環境変数 $CATALINA_HOME(tomcatインストールディレクトリ)、クラスパスの設定まですませておきます。
Luceneのインストール †
- Lucene導入メモ を参照
- 上を参考にして、環境変数、クラスパスの設定まですませておきます。
- インデックスを作る
$ sh $LUCENE_HOME/bin/mktextindex.sh -create -index result2 result3
- result3 ディレクトリ内にインデックスファイルができます。
Webアプリとして実装 †
- 参考:卒論要旨検索システムの開発(2008年度ウェブ検索実習課題) Lucene-ja 講義音声検索システムの開発
- 上記を参考にして、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/ にアクセス
- 「ようこそLuceneのテンプレートアプリケーションへ。 (これはヘッダです)」のページが出ることを確認します。
- 上記を参考にして、lucene-jaディレクトリにあるwebappディレクトリ以下をtomcatのwebappsディレクトリ以下にコピーします。
- テストページのメッセージに従って、各種ファイルの設定を変更する
- 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 に入っているものと同じ値を直接記述します。
- configuration.jsp の以下を修正
- lucene-ja設定ファイル
- tomcat設定ファイル server.xml
$ emacs $CATALINA_HOME/conf/server.xml
- 94行目に以下の属性を追記
<Connector port="8080" useBodyEncodingForURI="true"
- 94行目に以下の属性を追記
- tomcat設定ファイル catalina.sh
$ emacs $CATALINA_HOME/bin/catalina.sh
- 166行目 を以下に修正(参考:Lucene-ja)
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"
- 166行目 を以下に修正(参考:Lucene-ja)
- http://shower.human.waseda.ac.jp:8080/lucene-ja/ で確認
- 「検索」ボタンを押して、エラーメッセージが出ないことを確認します。
- ヒットはしているようですが、IndexSearcher.search の urlフィールド、titleフィールドの中身がないので*4、何も表示されません。
- フィールドの情報を書き換える
- $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 フィールドに値が入っていることが分かります。
- SearchJFiles.java の 103行目
- そこで、$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> <%
- 109行目以降
- Luceneを再起動
$ sh $CATALINA_HOME/bin/shutdown.sh $ sh $CATALINA_HOME/bin/startup.sh
- http://shower.human.waseda.ac.jp:8080/lucene-ja/ にアクセス
- 無事、検索結果が表示されました!
- $CATALINA_HOME/webapps/lucene-ja/results.jsp の 121 行目
- 確認したらシャットダウンしておく
$ sh $CATALINA_HOME/bin/shutdown.sh
カスタマイズ †
- 画面のデザインを変えたい場合は、$CATALINA_HOME/webapps/lucene-ja/ 以下の JSPファイル(java埋め込みhtmlファイル)を編集します。
- 検索結果を変えたい場合は、$LUCENE_HOME/lucene-ja-src.jar を解凍してできる org/apache/lucene/demo 以下にある SearchJFiles.java や IndexJFiles.java を編集します。
- もしくは results.jsp の中に「パスで指定されたファイルを読み込んで、クエリと照らし合わせてスニペットを生成する」プログラムを書いてもいいかもしれません。
- 修正版results.jsp(赤字の部分が追記した場所)
- ヒットしたテキストファイルをhtmlに変換してリンクを表示します。
- 修正版results.jsp(赤字の部分が追記した場所)