[Whisper] AIで英語と日本語音声の文字起こしをする [Speech Recognition]

2022年11月17日木曜日

Artificial Intelligence

本記事では、OpenAIが発表した音声認識技術Whisperを用いて英語と日本語の音声ファイルから文字起こしを行うをご紹介します。

eyecatch

Whisper

概要

Whisperは、OpenAIが発表した音声認識技術です。

Whisperは、68万時間もの多言語の音声データを用いてトレーニングされ、標準的なベンチマークによって十分に一般化されていることが示されています。

このモデルは、精度と堅牢性に優れ、様々な言語をサポートしています。
サポート言語とそれぞれのWord Error Rateは以下の通りです。上段から順に精度が高いことを示しています。日本語は上から6番目に位置しています。

language list

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、英語と日本語の音声ファイルから文字起こしを行う方法をご紹介します。

デモ(Colaboratory)

それでは、実際に動かしながら文字起こしを行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めに、ライブラリをインストールします。

%cd /content

!pip install git+https://github.com/openai/whisper.git@eff383b27b783e280c089475852ba83f20f64998

!pip install moviepy==0.2.3.5 imageio==2.4.1
!pip install yt-dlp

!pip install setuptools-rust

最後にライブラリをインポートします。

import whisper

from yt_dlp import YoutubeDL
from moviepy.video.fx.resize import resize
from moviepy.editor import VideoFileClip, AudioFileClip

以上で環境セットアップは完了です。

テスト音声のセットアップ

ここでは、Whisperに入力する音声ファイルをセットアップしていきます。

英語音声はYoutubeから取得し、日本語音声はWebから取得します。

まず英語音声ファイルを取得します。

video_url = 'https://www.youtube.com/watch?v=o97upTCsRME' #@param {type:"string"}

#@markdown 動画の切り抜き範囲(秒)を指定してください。\
#@markdown 30秒以上の場合OOM発生の可能性が高いため注意
start_sec =  8#@param {type:"integer"}
end_sec =  19#@param {type:"integer"}

(start_pt, end_pt) = (start_sec, end_sec)

!mkdir test_files

download_resolution = 720
full_video_path = '/content/test_files/full_video_en.mp4'
input_clip_path = '/content/test_files/clip_video_en.mp4'
input_audio_path = '/content/test_files/audio_en.mp3'

# 動画ダウンロード
ydl_opts = {'format': f'best[height<={download_resolution}]', 'overwrites': True, 'outtmpl': full_video_path}
with YoutubeDL(ydl_opts) as ydl:
    ydl.download([video_url])

# 指定区間切り抜き
with VideoFileClip(full_video_path) as video:
    subclip = video.subclip(start_pt, end_pt)
    subclip.write_videofile(input_clip_path)

# 音声抽出
videoclip = VideoFileClip(input_clip_path)
audioclip = videoclip.audio
audioclip.write_audiofile(input_audio_path)

続いて、日本語音声ファイルを取得します。

!wget -c http://pro-video.jp/voice/announce/mp3/001-sibutomo.mp3 \
      -O /content/test_files/audio_jp.mp3

Speech Recognition

それでは、音声認識による文字起こしを実行します。

まず、モデルをロードします。本記事では、最もパラメータサイズの大きいlargeモデルを使用します。

model = whisper.load_model("large")
print('model loaded.', model.device)

英語音声ファイルから文字起こしを行います。

# audioのロード
audio = whisper.load_audio('/content/test_files/audio_en.mp3')
# padding/trimming(30秒)
audio = whisper.pad_or_trim(audio)

# log-Mel spectrogram生成
# modelと同じメモリに配置(cuda)
mel = whisper.log_mel_spectrogram(audio).to(model.device)

# 言語検出
_, probs = model.detect_language(mel)
print(f"Detected language: {max(probs, key=probs.get)}")

# 音声のデコード
options = whisper.DecodingOptions()
result = whisper.decode(model, mel, options)

# Speech Recognition結果出力
print(result.text)

出力結果は以下の通りです。
自動で言語検出され、文字起こしも正確であることが見て取れます。

Detected language: en
Truth be told, I never graduated from college, and this is the closest I've ever gotten to a college graduation.

続いて、日本語音声ファイルの文字起こしを実行します。

# audioのロード
audio = whisper.load_audio('/content/test_files/audio_jp.mp3')
# padding/trimming(30秒)
audio = whisper.pad_or_trim(audio)

# log-Mel spectrogram生成
# modelと同じメモリに配置(cuda)
mel = whisper.log_mel_spectrogram(audio).to(model.device)

# 言語検出
_, probs = model.detect_language(mel)
print(f"Detected language: {max(probs, key=probs.get)}")

# 音声のデコード
options = whisper.DecodingOptions()
result = whisper.decode(model, mel, options)

# Speech Recognition結果出力
print(result.text)

出力結果は以下の通りです。

こちらも非常に高精度です。

Detected language: ja
無添加のシャボン玉石鹸ならもう安心!天然の保湿成分が含まれるため、肌に潤いを与え、すこやかに保ちます。お肌のことでお悩みの方は、ぜひ一度、無添加シャボン玉石鹸をお試しください。お求めは0120-0055-95まで。

まとめ

本記事では、Whisperを用いて、英語と日本語の音声ファイルから文字起こしを行う方法をご紹介しました。
精度もさることながら、前段に言語検出が含まれており、言語選択を省略できる点が使いやすいですね。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - Robust Speech Recognition via Large-Scale Weak Supervision

2. GitHub - openai/whisper

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology