大きなrawファイルの音声認識について

43 views
Skip to first unread message

okud...@gmail.com

unread,
Jan 14, 2019, 9:50:33 PM1/14/19
to 多言語音声翻訳サンドボックスサーバー技術フォーラム
もしご存じの方がいらっしゃいましたら、JAVA版のmimi.tagengo.examplesで大きなサイズのrawファイルを認識させる方法をご教示いただけませんでしょうか。当方は音声認識のみを使用しております。
当方ですが、GitHub上のJAVA版のmimi.tagengo.examplesをIntelliJ IDEAで動作させ、標準で添付されているtest.rawより長い音声データを試してみたくなりtest.rawのファイル名をそのままに中身を別のファイルで置き換えてみたところ、15秒分のデータのrawファイルは認識できるのですが20秒以上のデータ(データは5秒刻みで作成)のrawファイルだと下記のエラーが表示されて終了します。

> Exception in thread "main" java.lang.NullPointerException
>       at XMLSimpleParser.getSR_OUTSentence(Main.java:53)
>       at Main.main(Main.java:174)

すやま

unread,
Jan 15, 2019, 1:05:41 AM1/15/19
to 多言語音声翻訳サンドボックスサーバー技術フォーラム, okud...@gmail.com
こんにちは、
私のほうでは、Javaではなく、API (WebSocket)を使って、23.4秒の RAW(PCM)ファイルを解析できていますので、
このAPI (JavaのSDKはこのAPIを呼び出しているはず)自体は、15秒以上のファイルの解析する能力があるのだと思います。

このJavaのソース mimi.tagengo.examples
の該当箇所を見たところ、
RAWファイルを、1024バイト毎に読込み、分割送信を行い、最後に終了指示を出し、結果表示のところでコケているのですね、

エクセプションの直前に何か表示がされていませんか
ソースの
Main.java:173 System.out.println("result: " + response.getXML());
の部分の表示が、エクセプションの直前にでていると思うのですが、

それで、多分、解析結果が得られていなくて、必要な情報が解析結果(XML)から取得できず、その場合のエラー処理がサンプルには入っていないので、エクセプションしているような気がします。

まず、15秒以上だとだめなのか、単に、解析できない音声ファイルだとだめなのか 切り分けてみてはいかがですか(できているのならすいません)
単に、テストでOKだった15秒の音声ファイルと、20秒の音声ファイルの音の違いから解析できずにエラーとなっているような気がするのですが、
例えば、成功した10秒の素材を2つくっつけた(単純に結合)ファイルで20秒を作ってみて、テストしてみるとかは いかが でしょうか




すやま

unread,
Jan 15, 2019, 5:11:42 AM1/15/19
to 多言語音声翻訳サンドボックスサーバー技術フォーラム, okud...@gmail.com
こんにちは
前回、API(WebSocket)だと、15秒以上のファイルでもできているよ と 投稿した者です。

気になったので、Javaのサンプルコード mimi.tagengo.examples を 実行してみたのですが、
音声ファイルの秒数に関わらず、サーバー側で解析できなかった場合に、このサンプルでは、このエクセプションが発生するみたいですね
(サンプルコードなので、エラー処理していないだけ)
内部では、
{"type": "asr#nictlvcsr", "session_id": "xxxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxx", "status": "recog-finished", "response": []}
みたいな結果が、サーバー(API)よりかえされ、 responseの部分が空([]) なので、結果が取得できず、エクセプションですね

WebSocketで試した 23.4秒のファイルは解析できました。

音声ファイルの長さにかかわらず、エラー時処理をいれてあげる必要がありますね。

それと、当方では、rawファイル(PCMファイル)では、扱いにくい(作るのも、聞いて確認するのも)ので、WAVファイルで確認しました。

Main.javaに loadWavFile という関数を作って、 loadPcmFile関数ではなく、これを呼んでいます
テストなのでいいかげんなコードですが、一応はりつけておきます (責任はもちませんがご自由に利用ください)

     static ArrayList<byte[]> loadWavFile(String fileName) throws IOException {
       
ArrayList<byte[]> binaryDataList = new ArrayList<byte[]>();
       
FileInputStream fIn = new FileInputStream(new File(fileName));
       
int readLen = 0;
       
byte[] readBuf = new byte[1024];
       
boolean first = true;
       
long data_size = 1024;    // dummy
       
long readed_size = 0;
       
while ((readLen = fIn.read(readBuf, 0, (int)Math.min(data_size - readed_size, readBuf.length))) > 0 && readed_size < data_size) {
           
int pos = 0;
           
if (first == true){
               
for (int i=0; i<readLen; i++){
                   
if (readBuf[i] == 'd' && readBuf[i+1] == 'a' && readBuf[i+2] == 't' && readBuf[i+3] == 'a'){
                        pos
= i + 8;
                        data_size
= readBuf[i+4] +
                                    readBuf
[i+5] * 0x100 +
                                    readBuf
[i+6] * 0x10000 +
                                    readBuf
[i+7] * 0x1000000;
                       
break;
                   
}
               
}
                first
= false;
           
}
           
byte[] data = new byte[readLen - pos];
           
System.arraycopy(readBuf, pos, data, 0, readLen - pos);
            binaryDataList
.add(data);
            readed_size
+= data.length;
       
}
       
return binaryDataList;
   
}


oku...@gmail.com

unread,
Jan 15, 2019, 10:55:53 PM1/15/19
to 多言語音声翻訳サンドボックスサーバー技術フォーラム, okud...@gmail.com
すやま様、解析とコメントありがとうございます。

いただいた内容を再現できないかと思いサンプルコードのRecognizer.javaの86~88行のコメントアウトを外してみたところ、解析が成功するときはtype、session_id、statusに続きresultから始まる行が2行の合計5行が出力されて5行目が解析結果のテキストになりましたが、失敗するケースだと5行目の解析結果のテキストが無くなり4行だけ出力されて異常終了しておりました。エラーの原因がサーバから応答が無いのだと理解致しました。

あと、データの大きさは当初15秒のデータは解析できたと書きましたが、その後さらに試したところ20秒でも大丈夫だったり10秒でもダメだったりと実行タイミングによって変動がありました。何秒だったら大丈夫と言えるものではなかったので最初の投稿の15秒という部分は撤回させていただきます。

この度の試行で一度に解析できるデータ量に制限がある点についてはサンドボックスサーバの仕様だと理解しました。ご協力誠にありがとうございます。

2019年1月15日火曜日 11時50分33秒 UTC+9 okud...@gmail.com:
Reply all
Reply to author
Forward
0 new messages