こんにちは
前回、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;
}