本記事では、OpenAIが発表した音声認識技術Whisperを用いて英語と日本語の音声ファイルから文字起こしを行うをご紹介します。
Whisper
概要
Whisperは、OpenAIが発表した音声認識技術です。
Whisperは、68万時間もの多言語の音声データを用いてトレーニングされ、標準的なベンチマークによって十分に一般化されていることが示されています。
このモデルは、精度と堅牢性に優れ、様々な言語をサポートしています。
サポート言語とそれぞれのWord Error Rateは以下の通りです。上段から順に精度が高いことを示しています。日本語は上から6番目に位置しています。
詳細はこちらの論文をご参照ください。
本記事では上記手法を用いて、英語と日本語の音声ファイルから文字起こしを行う方法をご紹介します。
デモ(Colaboratory)
それでは、実際に動かしながら文字起こしを行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo
また、下記から直接Google Colaboratoryで開くこともできます。
なお、このデモは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
0 件のコメント :
コメントを投稿