KNOWLEDGE - COLUMN ナレッジ - コラム

AIを使って音声を文章化してみよう

コラムイメージ

関連するソリューション

業務改革

AI

グローバルイノベーションセンター
テクニカルスペシャリスト 黒住 好忠

こんにちは。テクニカルスペシャリストの黒住です。

先月末の2022年9月21日に、OpenAIからWhisperという「音声を聞き取って文章化するAI」がオープンソースで公開されました。Whisperは日本語を含む、数十種類の言語に対応しているので、録画したオンラインミーティングやウェビナーを簡単に文章化できるようになります。

今回は、Whisperの基本的な使い方や、応用例について紹介したいと思います。

Whisperとは

冒頭でも紹介したとおり、WhisperはOpenAIがオープンソースで公開した「自動音声認識」システムです。マルチリンガルな人間と同じように、複数の音声(言葉)を聞き取って、それぞれの言語で文章化したり、英語に翻訳して出力することが可能です。

公開されているWhisperのAIモデルは、累計68万時間(年に換算すると77年以上)に及ぶ大規模な音声データを元に学習されており、多少の雑音が混ざっている状態でも高い精度で音声を認識できるようになっています。

音声認識の「速度と精度」はトレードオフの関係にあるので、Whisperでは目的に合わせて使い分けができるように、多言語に対応したモデルであれば「tiny、base、small、medium、large」という5つのモデルが提供されています。速度優先ならtiny寄りのモデル、精度優先ならlarge寄りのモデルを使うと良いでしょう。

また、これらのモデルは「MIT License」の下で配布されているため、商用利用も可能です。

Whisperを使ってみよう

Whisperはコマンド操作で利用する事も可能ですが、今回はPythonプログラムから利用する方法を紹介します。以降のコードでは、全て「mediumモデル」を利用しています。

以下は、オンラインミーティングの会話を録音した音声ファイル(sample.flac)を聞き取るPythonプログラムのコードになります。今回はflac形式の音声ファイルを使用していますが、Whisperはwav、mp3などの音声ファイルや、mp4などの動画ファイルなど、数多くのフォーマットに対応しています。そのため、録画したオンラインミーティングの動画ファイルであっても、直接Whisperで処理することが可能です。

import whisper

model = whisper.load_model("medium")
result = model.transcribe("./data/sample.flac")
print(result["text"])

わずか4行のコードですが、これだけで音声ファイルの会話を聞き取って、日本語の漢字変換なども含めて自動で文章化され、以下のような内容が出力されます。

このままでは読みづらいため、以下のようなコードで「各セグメント単位」の情報を取得することも可能です。セグメント単位で処理すれば、それぞれの文章の開始・終了時間(秒)などの情報も取得できるようになります。

各セグメントは、ある程度文章の区切りが良いタイミングで分割されるのですが、Whisperの内部では「30秒単位に区切りながら処理」している都合で、長い会話が複数セグメントに分割される場合もあります。(ただし単語の区切りは意識した作りになっているため、単語の途中で強制的に分割されるようなことはありません)

# セグメントごとに表示
for seg in result["segments"]:
    id, start, end, text = [seg[key] for key in ["id", "start", "end", "text"]]
    print(f"{id:03}: {start:5.1f} - {end:5.1f} | {text}")

英語に翻訳して出力

続いて、聞き取った内容を「英語に翻訳して出力」するコードを紹介します。使用する音声ファイルは先ほどと同じ(つまり日本語の会話)ですが、結果を英語に翻訳した形で出力させます。

最初のコードと似ているのですがtask=”translate”という形で、タスクを指定している点が異なります。

import whisper

model = whisper.load_model("medium")
result = model.transcribe("./data/sample.flac", task="translate")
print(result["text"])

また、英語で出力する場合であっても、セグメント単位での操作が可能です。

# セグメントごとに表示
for segment in result["segments"]:
    id, start, end, text = [segment[key] for key in ["id", "start", "end", "text"]]
    print(f"{id:03}| {start:5.1f} - {end:5.1f} | {text}")

感情分析(応用)

最後に、応用例として「他のAIと組み合わせた感情分析」の例をご紹介します。

Whisperを利用すると「音声を文章化」できるので、その文章を「他のAIで更に分析」して、それぞれの会話の内容が「ポジティブな内容なのか、ネガティブな内容なのか」を併せて判断するようにしています。このような感情分析は、コールセンターの音声分析などでも役立ちそうですよね。

import whisper
from transformers import pipeline

# 音声から文字の書き起こし
whisper_model = whisper.load_model("medium")
segments = whisper_model.transcribe("./data/sample.flac")["segments"]
segments_text = [seg["text"] for seg in segments]  # textだけをリストで抽出

# 書き起こした文章の感情分析
sentiment_model = pipeline(
    "sentiment-analysis",
    model="daigo/bert-base-japanese-sentiment",
    tokenizer="daigo/bert-base-japanese-sentiment",
)
sentiments = sentiment_model(segments_text)

# 文字起こしした内容と感情分析結果を結合して結果表示
for segment, sentiment in zip(segments, sentiments):
    id, start, end, text = [segment[key] for key in ["id", "start", "end", "text"]]
    label, score = [sentiment[key] for key in ["label", "score"]]

    print(f"{id:03}| {start:5.1f} - {end:5.1f} | {label[:2]} {score:4.2f} | {text}")

コードを実行すると、感情分析の結果を「ネガ/ポジ」で表示できます。ネガポジの後ろの数字は、その予測確率を表していて、例えば「ポジ 0.99」であれば「99%の確率でポジティブ」という意味になります。

以下の結果を見ていただけると、「データに誤りがあった」、「このままだとまた同じ間違いが出てくる」という会話が、期待通りに「ネガティブ判定」されていることが分かると思います。

最後に

Whisperを利用すれば、数行のコードで「多言語に対応した音声認識」や「英語への翻訳」が可能になります。現時点では、リアルタイムの音声処理には対応していませんが、利用するプログラム側で工夫すれば「ある程度リアルタイムに近い形での利用」も可能だと思われます。

また、他のNLP系のAIモデル(感情分析、固有名詞識別、要約、翻訳、質疑応答など)と組み合わせることで、活用の幅が広がると思います。多くのNLPモデルは「英語にしか対応していないケースも多い」のですが、この場合でもWhisperの英語翻訳を使えば、ある程度のモデルが利用できるようになるはずです。

Whisperは複数言語に対応した数少ないモデルなので、是非試してみてくださいね。

それでは、また次回のコラムでお会いしましょう。

リンク集

記事に関する参考情報への外部リンクを以下にまとめて記載しています。

当サイトの内容、テキスト、画像等の転載・転記・使用する場合は問い合わせよりご連絡下さい。

エバンジェリストによるコラムやIDグループからのお知らせなどを
メルマガでお届けしています。

メルマガ登録ボタン


黒住 好忠

株式会社インフォメーション・ディベロプメント フェロー

この執筆者の記事一覧

関連するソリューション

業務改革

AI

関連するナレッジ・コラム

AI倫理~AIとの向き合い方と制度~

ITエンジニアの現地作業 ミスを減らす!作業本番のポイントとは

NTTのIP網移行と、通信の未来とは