Tech Blog
  • HOME
  • Blog
  • AmiVoice APIの音声フォーマットのお話

AmiVoice APIの音声フォーマットのお話

公開日:2022.05.16 最終更新日:2024.03.25

wao ワオキツネザル

こんにちは!Techブログのイケメン枠のワオキツネザルです。

私の発信が一人でも多くの方の役に立ったらなと思ってます。

また、本記事は初心者向けであり、多少粒度が粗い説明となっております。

この記事を書こうとしたきっかけ

こんなようなことがありました。(脚色あり)

f:id:amivoice_techblog:20220322111539j:plain

解説

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である必要があります。

音声フォーマットについて – AmiVoice Cloud Platform

難しいので要約すると、音のフォーマット名を指定して送ってね!ってことです。

中でも重要なのはここらへんです。
「会話_汎用」エンジン( -a-general )以外は16kHz未満のサンプリングレートの音を送るとエラーになる
基本的に音声を送る時は「フォーマット名」を指定する
HTTP 音声認識 APIでヘッダありの音声なら例外的に省略できるよ

音のフォーマットで重要なのは以下の6つ

項目 説明
ヘッダのありなし 下で説明してる「データの形式」「エンディアン」などの
情報がそもそも存在しているか。

存在するかは拡張子でググるとだいたい出てくる。
出てこない場合はファイルを作った人に聞くと分かる。

データの形式 データの中身のルールを指します。
PCM方式、MP3方式、WMA方式などがあります。
拡張子が「.wav」の場合はPCMが多い気がする。
wavのちゃんとした説明
エンディアン データの並び順。
音声データの場合はリトルエンディアンか
ビッグエンディアンのどっちかです。

「ヘッダあり」で送信する場合には、気にしなくてよい!

量子化ビット数 表せれる音の大きさの細かさを意味します。
この値が大きいと、小さな音と大きな音の違いを
鮮明に表現できるようになります

普通のCDとかだと16bitです。

サンプリング周波数 1秒間の中に詰まっているデータの数。
16kHzは1秒間に16000回記録されています。
この値が大きいと、時系列で変わる音の違いが
鮮明に分かります。

最近の「ハイレゾ」と呼ばれる良さげの音質の音楽は
48kHz以上が多い気がする。

チャンネル モノラルかステレオか。
AmiVoice APIは基本的にモノラルしか受け付けません。
ステレオ音声が送られてきたら1チャンネル目だけを
認識処理します。
ステレオでやりたかったら、チャンネルごとに音を分けて、
それぞれで送ってください。

サンプルに含まれている音声はどんなフォーマットなのでしょうか。

test.wavの中身を見てみましょう。
OSの機能で、簡単に見る方法はなかったため、プログラムを書いて抽出しました。

test.wav

データの形式 PCM
エンディアン LittleEndian
量子ビット数 16bit
サンプリング周波数 16kHz
チャンネル モノラル

このtest.wavをヘッダなしで送る場合のフォーマットを、マニュアルの内容から探すと

f:id:amivoice_techblog:20220128155527p:plain

そうですね!
lsb16kですね!!

こうすればいいんじゃないかというのを、パターン別に列挙します。

①エンディアンの情報はヘッダから取ってきてくれるので、サンプリング周波数だけ指定してください。16kや8kなど。

②ファイルの中身を見て判断してくれるので、フォーマットは省略してもOKです。

③そのファイルを作った人に形式を聞いてフォーマットを指定してください。エンディアンとサンプリング周波数の組み合わせのmsb16kとかlsb8kとかとか。

④この時はヘッダなしになるため、使っているCPUの仕様を見て、どのフォーマットになっているか確認しましょう。ちなみにIntelとかのx86系のCPUはリトルエンディアン。

まとめ

AmiVoice APIを使うときはフォーマットに気を付けよう!

この記事を書いた人

  • ワオキツネザル

    永遠の18歳のイケメンプログラマー。異論は認めない。
    アイコンだけは自分で描いてます。

この記事のマンガを書いた人

  • 星BANされた宇宙子

    絵を描いている人。

APIを無料で利用開始