Pythonで音声データから話者認識と文字起こしをする方法

Python

はじめに

さて今回は、Pythonを使った音声データの話者認識+音声文字起こしについてまとめたいと思います。

実は以前、Whisperを使った音声データ文字起こしのやり方についてまとめました。まだ記事を読んでいない方はそちらをチェックです!

そちらでご紹介した内容ですと、例えば複数の人が会話している音声データだったとしても、誰がどのような発言をしたかは分かりません。ただ単純に、音声データが文字起こしされ、テキストの羅列として出力するだけです。

それでももちろん素晴らしい技術ですが、今回はもう少し発展的な話として、音声データを話者認識し、その後文字起こしする方法についてお話します。

実は事前準備として、話者認識だけ実施する手順についてはまとめています。そちらを応用して実行していきますので、まだ読んでいない方はそちらも合わせてご覧ください。

それではさっそく見ていきましょう~

pyannote.audioとは??

今回は話者認識/話者分離(speaker diarization)を実施するにあたり、Pythonの「pyannote.audio」というライブラリを利用いたしました。まずはどのようなライブラリか、しっかりと理解しておきましょう。

pyannote.audioは、音声処理に特化したPythonライブラリで、特に音声認識や音声分離などのタスクで使用されます

主な機能として、音声の話者分離(誰が話しているかを特定する)、音声区間検出(音声がある部分を識別する)、話者認識(話者の特定)などがあります。

このライブラリはディープラーニング技術を活用し、音声処理の精度を高めるために事前学習されたモデルを提供しています。初心者でも使いやすいAPIが用意されており、音声データの解析や処理を簡単に行えるため、研究者や開発者が音声関連のプロジェクトで利用することができます。

以下GitHubもご参考になればと思います。

実行環境

今回は、Google Colaboratory(Google Colab)を活用しました。皆さんも簡単に利用できますので、是非試してみてくださいね。

ちなみに、ランタイムのタイプ(処理の方式)は「T4 GPU」を選択しています。

これはなぜかというと、ずばりCPUと比較してGPUの方が処理速度が格段に速いからです。デフォルトでは「CPU」で処理する方式となっていますので、必ず変えるようにしましょう。

余談ですが、なぜGPUの方が処理が速いの?!と気になっている方は以下をチェックです。

また、ランタイムのタイプ変更方法が分からない方は、以下記事を参考にしてください。

事前準備

続いて、色々な事前準備を済ませましょう。

Hugging Faceアカウントの作成

今回のライブラリを利用するには、Hugging Faceアカウントが必須です。アカウントを作ったことが無い方は、まずはアカウントを作成しましょう。

アカウントの作成手順を知りたい方は以下をチェックです!

ライブラリの利用承認

続いて、ライブラリ・リポジトリの利用承認をしておきましょう。

「user conditions」のAcceptという手順ですね。

下記2つのURLにそれぞれアクセスして、必要事項を記入し、リポジトリのアクセスボタンを押下してください。

Hugging Faceアクセストークンの作成

ライブラリの利用には、Hugging Faceのアクセストークンも必要です。

作成方法が分からない方は以下をチェックです!

話者認識+文字起こしの実行

いよいよお待ちかねの話者認識/話者分離(speaker diarization)です。

ライブラリのインストール

まずは必要なライブラリをインストールしましょう。

!pip install -qq git+https://github.com/openai/whisper.git
!pip install -qq pydub
!pip install -qq polars
!pip install -qq speechbrain==0.5.12
!pip install -qq ipython==7.34.0
!pip install -qq pyannote.audio==3.1.1
!pip install -qq pydub==0.25.1
!pip install -qq speechbrain==0.5.14
!pip install -qq soundfile==0.12.1
!pip install -qq lightning==2.0.1
!pip install -qq --no-cache-dir \
torch==2.2.0+cu121 \
torchaudio==2.2.0+cu121 \
torchvision==0.17.0+cu121 \
torchtext==0.17.0+cpu \
torchdata==0.7.1 \
--index-url https://download.pytorch.org/whl/cu121

不用意に2回インストールしているライブラリもありますね・・・、後で整理します。

ちなみに「-qq」はインストールの出力を最小限に抑えるオプションで、表示されるメッセージを少なくします。

話者認識+文字起こし

さて、必要な準備はできたのであとは以下のコードを実行するのみです。

# 必要なライブラリのインポート
from pyannote.audio import Pipeline, Audio
from pyannote.core import Segment, notebook, Annotation
import json
from pydub import AudioSegment
import polars as pl
import whisper
import torch
import torchaudio

# Whisperモデルの読み込み
model = whisper.load_model("large")

# 音声ファイルの指定
audio_file = "file_name.wav"

# pyannoteのパイプライン設定
# use_auth_tokenには作成したご自身のアクセストークンを入力
pipeline = Pipeline.from_pretrained(
     "pyannote/speaker-diarization-3.1"
     , use_auth_token="ご自身のアクセストークンを入力"
 )

# GPU設定
pipeline.to(torch.device("cuda"))

waveform, sample_rate = torchaudio.load(audio_file)
diarization = pipeline({"waveform": waveform, "sample_rate": sample_rate})

# オーディオファイルの長さを取得
audio = Audio(sample_rate=16000, mono=True)
duration = audio.get_duration(audio_file)

for segment, _, speaker in diarization.itertracks(yield_label=True):
    # セグメントの終了時間がファイルの長さを超えないようにクリッピング
    start_time = segment.start
    end_time = min(segment.end, duration)
    # クロップの実行
    waveform, sample_rate = audio.crop(audio_file, Segment(start_time, end_time))
    text = model.transcribe(waveform.squeeze().numpy())["text"]
    print(f"[{start_time:03.1f}s - {end_time:03.1f}s] {speaker}: {text}")

細かい解説はさておき、ポイントだけ説明しますね。

  • Whisperモデル:
    Whisperモデルは適当に使いたいものを選択してください。精度の良いモデルを使えば使うほど、実行には時間がかかりますので要注意です。まぁ実際使うのであれば「large」一択な気もしますが・・・。
  • 音声ファイル:
    音声ファイルは「.wav」ファイルしか実行できないので注意してくださいね。
  • アクセストークン:
    「use_auth_token=”ご自身のアクセストークンを入力してください”」には、事前準備で作成したご自身のアクセストークンを入力してください。
  • GPU処理:
    「pipeline.to(torch.device(“cuda”))」についてはGPU処理をしたいから入れているだけです。入れなくても動きはしますがめちゃくちゃ処理が遅くなります。
  • 出力形式:
    出力は話者、時間、発言のテキストデータが出力されるようにしています。この辺りはお好みで調整してください。正直ご自身が使いやすいようにカスタマイズしていただければOKです。

最後に

さて今回は、Pythonを使った音声データの話者認識+音声文字起こしについてまとめました。

マスターするとものすごく色んな使い方ができますね~。

是非活用してみてください。こんなことにも使えますよ!といったアイデアがあれば教えてもらえるとい嬉しいです!

以上!

前回まとめた記事も読んでもらえると嬉しいです。

その他の勉強記事も是非!

コメント

タイトルとURLをコピーしました