AmiVoice APIの音声フォーマットのお話
ワオキツネザル
こんにちは!Techブログのイケメン枠のワオキツネザルです。
私の発信が一人でも多くの方の役に立ったらなと思ってます。
また、本記事は初心者向けであり、多少粒度が粗い説明となっております。
この記事を書こうとしたきっかけ
こんなようなことがありました。(脚色あり)
解説
AmiVoice Cloud PlatformのAmiVoice APIで使える音声フォーマットについてコピペします。
音声フォーマットについて
本サービスに送信できる音声データのフォーマットは、以下の通りです。
フォーマット名が、接続時に指定する文字列です。16kHz未満(8kHz/11kHz)のサンプリングレートの音声データを受け付けて認識可能なエンジンは、現時点では日本語の「会話_汎用」エンジン( -a-general )のみです。その他の領域特化型のエンジンは16kHz以上のフォーマットの音声データを送信してください。
HTTP 音声認識 APIで 、かつ、ヘッダありの音声データ (raw 以外の音声データ) を送信する場合のみ、例外的に「フォーマット名」の指定を省略できます。それ以外の場合は、必ず実際の音声データ形式に対応する「フォーマット名」を指定するようにしてください。 ※ ヘッダありの音声データをHTTP 音声認識 API で送信する際に、(省略することなく) 明示的に指定した「フォーマット名」(16kまたは8k)と実際のヘッダの内容に齟齬がある場合は、 ヘッダの内容 が正しいものとして採用されます。
(ヘッダなし) 音声データ形式 *6 フォーマット名 *3 *4 raw – PCM LittleEndian 16bit – 8kHz – mono *4 lsb8k raw – PCM LittleEndian 16bit – 11kHz – mono *4 lsb11k raw – PCM LittleEndian 16bit – 16kHz – mono lsb16k raw – PCM LittleEndian 16bit – 22kHz – mono lsb22k raw – PCM LittleEndian 16bit – 32kHz – mono lsb32k raw – PCM LittleEndian 16bit – 44.1kHz – mono lsb44k raw – PCM LittleEndian 16bit – 48kHz – mono lsb48k raw – PCM BigEndian 16bit – 8kHz – mono *4 msb8k raw – PCM BigEndian 16bit – 11kHz – mono *4 msb11k raw – PCM BigEndian 16bit – 16kHz – mono msb16k raw – PCM BigEndian 16bit – 22kHz – mono msb22k raw – PCM BigEndian 16bit – 32kHz – mono msb32k raw – PCM BigEndian 16bit – 44.1kHz – mono msb44k raw – PCM BigEndian 16bit – 48kHz – mono msb48k raw – mu-Law 8bit – 8kHz – mono *6 mulaw raw – A-Law 8bit – 8kHz – mono *6 alaw
(ヘッダあり) 音声データ形式 *6 フォーマット名 *3 *4 Wave 音声 (PCM) – LittleEndian 16bit – 8kHz/11kHz – mono/stereo *2 *4 8k Wave 音声 (PCM) – LittleEndian 16bit – 16kHz以上 – mono/stereo *2 16k Wave 音声 (mu-Law) – 8kHz – mono/stereo *2 *4 8k Wave 音声 (A-Law) – 8kHz – mono/stereo *2 *4 8k Speex 音声 (Ogg コンテナ) – 8kHz/11kHz – mono/stereo *2 *4 8k Speex 音声 (Ogg コンテナ) – 16kHz以上 – mono/stereo *1 *2 16k Opus 音声 (Ogg コンテナ) – 8kHz/11kHz – mono/stereo *2 *4 8k Opus 音声 (Ogg コンテナ) – 16kHz以上 – mono/stereo *1 *2 16k MP3 音声 – 8kHz/11kHz – mono/stereo *2 *4 *5 8k MP3 音声 – 16kHz以上 – mono/stereo *2 *5 16k FLAC 音声 – 8kHz/11kHz – mono/stereo *2 *4 *6 8k FLAC 音声 – 16kHz以上 – mono/stereo *2 *6 16k *1 Speex : quality 7以上 、Opus :圧縮率10分の1程度までとなります。
*2 stereo音声の場合、1チャンネル目のみが音声認識処理対象となります。
*3 フォーマット名は、大文字小文字が区別されません。
*4 現在 8kまたは11kを指定できるのは日本語「会話_汎用」エンジンだけです。
*5 mp3にはID3タグを含めないでください。
*6 すべての音声データは、 圧縮前(=PCMに展開後)は16bitである必要があります。
難しいので要約すると、音のフォーマット名を指定して送ってね!ってことです。
中でも重要なのはここらへんです。
・「会話_汎用」エンジン( -a-general )以外は16kHz未満のサンプリングレートの音を送るとエラーになる。
・基本的に音声を送る時は「フォーマット名」を指定する。
・HTTP 音声認識 APIでヘッダありの音声なら例外的に省略できるよ。
音のフォーマットで重要なのは以下の6つ
項目 | 説明 |
---|---|
ヘッダのありなし | 下で説明してる「データの形式」「エンディアン」などの 情報がそもそも存在しているか。 存在するかは拡張子でググるとだいたい出てくる。 |
データの形式 | データの中身のルールを指します。 PCM方式、MP3方式、WMA方式などがあります。 拡張子が「.wav」の場合はPCMが多い気がする。 wavのちゃんとした説明 |
エンディアン | データの並び順。 音声データの場合はリトルエンディアンか ビッグエンディアンのどっちかです。 「ヘッダあり」で送信する場合には、気にしなくてよい! |
量子化ビット数 | 表せれる音の大きさの細かさを意味します。 この値が大きいと、小さな音と大きな音の違いを 鮮明に表現できるようになります 普通のCDとかだと16bitです。 |
サンプリング周波数 | 1秒間の中に詰まっているデータの数。 16kHzは1秒間に16000回記録されています。 この値が大きいと、時系列で変わる音の違いが 鮮明に分かります。 最近の「ハイレゾ」と呼ばれる良さげの音質の音楽は |
チャンネル | モノラルかステレオか。 AmiVoice APIは基本的にモノラルしか受け付けません。 ステレオ音声が送られてきたら1チャンネル目だけを 認識処理します。 ステレオでやりたかったら、チャンネルごとに音を分けて、 それぞれで送ってください。 |
サンプルに含まれている音声はどんなフォーマットなのでしょうか。
test.wavの中身を見てみましょう。
OSの機能で、簡単に見る方法はなかったため、プログラムを書いて抽出しました。
test.wav
データの形式 | PCM |
エンディアン | LittleEndian |
量子ビット数 | 16bit |
サンプリング周波数 | 16kHz |
チャンネル | モノラル |
このtest.wavをヘッダなしで送る場合のフォーマットを、マニュアルの内容から探すと
そうですね!
lsb16kですね!!
こうすればいいんじゃないかというのを、パターン別に列挙します。
①エンディアンの情報はヘッダから取ってきてくれるので、サンプリング周波数だけ指定してください。16kや8kなど。
②ファイルの中身を見て判断してくれるので、フォーマットは省略してもOKです。
③そのファイルを作った人に形式を聞いてフォーマットを指定してください。エンディアンとサンプリング周波数の組み合わせのmsb16kとかlsb8kとかとか。
④この時はヘッダなしになるため、使っているCPUの仕様を見て、どのフォーマットになっているか確認しましょう。ちなみにIntelとかのx86系のCPUはリトルエンディアン。
まとめ
AmiVoice APIを使うときはフォーマットに気を付けよう!
この記事を書いた人
-
ワオキツネザル
永遠の18歳のイケメンプログラマー。異論は認めない。
アイコンだけは自分で描いてます。
この記事のマンガを書いた人
-
星BANされた宇宙子
絵を描いている人。