つよくなるブログ

その場にとどまるためには、全力で走り続けなければならない

Google Cloud Speech-to-Text 向けに.wav の音声をステレオからモノラルに変換する

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 には複数のチャンネルを含む音声を扱えるオプションが存在しています。
電話やポッドキャストなどの複数人の会話を、発話者を認識して誰が話した音声か特定して文字起こしができます。

cloud.google.com

ですが、今回やりたいのは 1 人で話している音声の文字起こしです。
その場合の音声(.wav)は single channel(モノラル) を使用しなさい、というのが冒頭のエラー内容です。

.wav のチャンネルついて

モノラルは 1(0x0100)、ステレオは 2(0x0200)

www.youfit.co.jp

ステレオからモノラルへの変換

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 に依存しているので、インストールしておく必要があります。

github.com

$ 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 の拡張モデルで日本が使えるようになって欲しい!

cloud.google.com