Google Cloud Speech-to-Text (以下、Speech-to-Text)で音声(.wav)から文字起こしをした時にMust use single channel (mono) audio, but WAV header indicates 2 channels.
エラーが発生したので対策についてまとめました。
前提
- 1 人が喋っている動画の文字起こしをしたい
- ↑ の動画から音声のみを抜き出した.wav を使用する
Speech-to-Text の複数チャンネルの扱いについて
Speech-to-Text には複数のチャンネルを含む音声を扱えるオプションが存在しています。
電話やポッドキャストなどの複数人の会話を、発話者を認識して誰が話した音声か特定して文字起こしができます。
ですが、今回やりたいのは 1 人で話している音声の文字起こしです。
その場合の音声(.wav)は single channel(モノラル) を使用しなさい、というのが冒頭のエラー内容です。
.wav のチャンネルついて
モノラルは 1(0x0100)、ステレオは 2(0x0200)
ステレオからモノラルへの変換
ffmpeg と Python の2種類の方法で紹介します。
状態確認
ffmpeg
-i
: 入力ファイルのパス
-hide_banner
: ビルドオプション、バージョン情報などを非表示にする
$ ffmpeg -i audio-stereo.wav -hide_banner Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, wav, from 'audio-stereo.wav': ...省略...
Python
import wave wave_read = wave.open('audio-stereo.wav', "rb") print ("Channel:", wave_read.getnchannels()) # output: Channel: 2
変換
ffmpeg
-ac
: チャンネル数
$ ffmpeg -i audio-stereo.wav -hide_banner -ac 1 audio-mono.wav
Python
Python での変換には pydub を使用します。 pydub は ffmpeg に依存しているので、インストールしておく必要があります。
$ pip install pydub
from pydub import AudioSegment audio = AudioSegment.from_wav("audio-stereo.wav") audio = audio.set_channels(1) audio.export("audio-mono.wav", format="wav")
再度確認
ffmpeg
$ ffmpeg -i audio-mono.wav -hide_banner Guessed Channel Layout for Input Stream #0.0 : mono Input #0, wav, from 'audio-mono.wav': ...省略...
Python
from pydub import AudioSegment audio = AudioSegment.from_wav("audio-mono.wav") audio = audio.set_channels(1) audio.export("audio-mono.wav", format="wav") # output: Channel: 1
まとめ
.wav のチャンネル変換方法を Python と ffmpeg の 2 種類の方法で紹介しました。
Speech-to-Text の拡張モデルで日本が使えるようになって欲しい!