トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索   ヘルプ   最終更新のRSS

Luceneによる動画検索システム

Last-modified: 2016-02-09 (火) 00:58:47
Top / Luceneによる動画検索システム

講演音声検索システムの開発

  • CSJの講演音声の音声認識を行い、キーワード検索を行なうことのできるウェブアプリケーションを開発します*1
    • 音声認識は Julius を使用
    • キーワード検索は Lucene を使用
    • ウェブアプリサーバには tomcat を使用

Juliusのインストール

動画(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 ができます。
  • 認識してみる
    • Juliusのデフォルトでは1ファイル=1発話として扱うため、長い講演を最後まで認識できないので、 -cutsilence オプションをつけます(M君のレポートより、参考
      $ chmod 777 /home/m-kouki/julius/julius-4.1.2-linuxbin/bin/*
      $ sh searchWavJulius.sh
  • 認識結果を解析して、各音声ファイルごとに分ける
    • editResult.java を実行
      $ java editResult result2 result1 .ofj log_editResult.txt
      • result2 ディレクトリ内に認識結果のtxtファイルができます。
      • テキストファイルは Shift-JIS で書き出されます*3
  • 認識失敗ファイルを削除する
    • 0バイトのファイルは、luceneでインデックスを作るときにエラーになるので、ここで削除しておきます。
      $ find result2 -size -1k -exec rm {} \;

Tomcatのインストール

  • tomcat導入メモ を参照
    • 上を参考にして、環境変数 $CATALINA_HOME(tomcatインストールディレクトリ)、クラスパスの設定まですませておきます。

Luceneのインストール

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

Webアプリとして実装

  • テストページのメッセージに従って、各種ファイルの設定を変更する
    • 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
      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フィールドの中身がないので*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 フィールドに値が入っていることが分かります。
    • そこで、$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/ にアクセス
      • 無事、検索結果が表示されました!
        lucene1.jpg
  • 確認したらシャットダウンしておく
    $ 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に変換してリンクを表示します。

*1 2009前期 菊池研B3実習課題
*2 一括してひとつのファイルリストに書き出した場合、後述する -cutsilence オプションをつけても認識エラーが出るWAVファイルがあり、そこでJuliusの処理が止まってしまうので、1音声=1ファイルで別々に認識を実行することにしました
*3 SHIFT-JIS以外の文字コードでは検索に失敗するようです(参考:Lucene-ja
*4 これらの情報は mkhtmlindex.sh で作成したインデックスにのみ付加されているようです

添付ファイル: filelucene1.jpg 626件 [詳細]