OpenAI APIによる音声認識の精度改善:文字起こしポストプロセッシングの実践

2023/12/23に公開

cover

はじめに

今回は、前回の記事で作成した Streamlit と Whisper を使った文字起こしアプリを「ポストプロセッシング」にフォーカスして、より議事録作成用に改善してみます。

https://zenn.dev/gixo/articles/54062bd7814f41

前回の記事では、Whisper で得たテキストデータを利用し、Streamlit を通じて使いやすいアプリケーションに仕上げることを目指しました。今回は、そのアプリをさらに改善し、議事録作成に特化したものにしてみます。

前回作成したアプリの不足する点は以下の通りです。

  • 会議が長くなると、音声ファイルが大きくなり API 制限の 25MB を超えてしまう
  • 句読点がないので、文章が読みにくい
  • 専門用語が多いような会議の文字起こしでは、認識制度が低くなる

これらの問題を解決するために、前回作成したアプリに以下の機能を追加してみます。

  • 音声ファイルを分割して API 制限を回避する
  • OpenAI API の ChatCompilation を使って文字起こしした文章を校正する
  • 専門用語の認識精度を向上させるために、prompt に会議の文脈情報を追加する

ポストプロセッシングとは

音声認識のポストプロセッシングは、音声認識システムから得られたテキストデータを洗練し、修正するための手法です。これは、認識されたテキストの品質を向上させ、特定のアプリケーションやユースケースに合わせて適切なフォーマットや文法に調整するために使用されます。

以下は、音声認識のポストプロセッシングに関するステップと考慮すべき事項です。

  • テキストの正確性を向上させる(テキストクリーニング)
  • 誤認識や誤字の修正(エラー修正)
  • テキストのフォーマットを変更する(テキストフォーマット)

今回は、このポストプロセッシングプロセスをすべて OpenAI API の ChatCompletions にお任せして簡単に実装してみます。

音声ファイルを分割して API 制限を回避する

まずはじめに、音声ファイルを分割するために Pydub を使ってみます。

Pydub は、Python で音声ファイルを扱うためのライブラリです。音声ファイルの分割や結合、音量の調整など、さまざまな処理を簡単に行うことができます。

Pydub のインストール

まずはじめに、Pydub をインストールします。

pip install pydub

※ この処理では、音声ファイルを取り扱うため、ffmpeg が必要になります。ffmpeg がインストールされていない場合は、以下のコマンドでインストールしてください。

pip install ffmpeg

音声ファイルの分割

次に、音声ファイルを分割してみます。試しに、音声ファイル無音区間で 60 秒ごとに分割することにします。

test_split_audio.py
from pydub import AudioSegment
from pydub.silence import split_on_silence

audio_file = "sample.wav"
max_size = 60 * 1000  # 60 秒

# 音声ファイルを読み込む
sound = AudioSegment.from_file("sample.wav", format="wav")

# 無音区間ごとに分割する
chunks = split_on_silence(sound, min_silence_len=1000, silence_thresh=-50)

# 60秒以内に収まる範囲で、分割した音声ファイルを結合して適切なサイズにする
combined_chunks = []
current_chunk = chunks[0]
for chunk in chunks[1:]:
    if len(current_chunk) + len(chunk) < max_size:
        current_chunk += chunk
    else:
        combined_chunks.append(current_chunk)
        current_chunk = chunk
combined_chunks.append(current_chunk)

# 分割した音声ファイルを保存する
for i, chunk in enumerate(combined_chunks):
    chunk.export(f"sample_{i}.wav", format="wav")

これで、音声ファイルを分割することができました。

OpenAI API の ChatCompilation を使って文字起こしした文章を校正する

次に、OpenAI API の ChatCompletions を使って文字起こしした文章を校正してみます。

ChatCompletions は、OpenAI API の中でも特に高い精度で文章を生成することができるモデルです。このモデルを使うことで、文字起こしした文章を校正することができます。

※ OpenAI API Key が必要になります。キー情報を持っていない場合は、リンクから新たに取得して、ルートディレクトリに .env ファイルとして用意下さい。

ChatCompletions のインストール

まずはじめに、OpenAI をインストールします。

pip install openai

ChatCompletions を使って文章を生成する

次に、ChatCompletions を使って文章を生成してみます。試しに、以下の文章を生成してみます。

入力

お電話ありがとうございます大変申し訳ございませんが本日の営業はすべて終了させていただきましたまたのお電話をお待ちしております

test_chatcompletions.py
import os

from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()  # .env から環境変数を読み込む

# 環境変数からAPIキーを読み込む
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)

transcript = "お電話ありがとうございます大変申し訳ございませんが本日の営業はすべて終了させていただきましたまたのお電話をお待ちしております"

prompt = f"##音声文字起こしで不自然な文を修正し、自然な文章にしてください。文章の修正は句読点の追加と誤字脱字の修正にとどめ、要約は絶対にしないでください。\n##音声文字起こし\n{transcript}\n##修正した文章\n"
messages = [
    {"role": "system", "content": "あなたは優秀な日本語の編集者です。"},
    {"role": "user", "content": prompt},
]
# 言語モデルは応答速度を重視して、gpt-3.5-turbo-1106を使用する
text_modified = client.chat.completions.create(
    model="gpt-3.5-turbo-1106",
    messages=messages,
    temperature=0,
)
print(text_modified.choices[0].message.content)

出力

お電話ありがとうございます。大変申し訳ございませんが、本日の営業はすべて終了させていただきました。またのお電話をお待ちしております。

句読点が追加されて、文章が読みやすくなりました。
この方法を採用することで、自動文字起こしの精度が大幅に向上し、ユーザーが手動で行う必要のある校正作業を最小限に抑えることができます。これにより、議事録作成の効率が大きく改善されるでしょう。

専門用語の認識精度を向上させるために、prompt に会議の文脈情報を追加する

上記の ChatCompletions を使って文字起こしした文章を校正する方法は、一般的な文章に対しては有効ですが、専門用語が多いような文章に対しては、認識精度は十分ではありません。

そこで、専門用語が多いような文章に対しては、prompt に会議の文脈情報を追加することで、認識精度を向上させてみます。

入力

クラウドのえダブエスにログインして下さいログインしたらラムダで関数を作成してこの子度をコピーして下さい関数名は何でもいいですが今回はテスとします関数をさくせしたらテストをくりっくして実行して下さい実行するとこのようなすつろくが表示されます

prompt に会議の文脈情報を追加する

先程のコードの prompt に会議の文脈情報を追加してみます。

prompt = f"##以下は、データ分析基盤の構築に関するコンサルティング会社における会議の会話の音声認識テキストです。特定の専門用語やIT用語が誤って認識されている可能性があります。音声文字起こしで不自然な文を修正し、自然な文章にしてください。文章の修正は句読点の追加と誤字脱字の修正にとどめ、要約は絶対にしないでください。\n##音声文字起こし\n{transcript}\n##修正した文章\n"

出力

Lambda の AWS にログインしてください。ログインしたら、関数を作成して、このコードをコピーしてください。関数名は何でもいいですが、今回は"test"とします。関数を作成したら、テストをクリックして実行してください。実行すると、このような出力が表示されます。

prompt で文脈情報を与えたことで、専門用語の誤認識部分が修正され、認識精度が向上しました。

追加機能を実装したアプリのコード

追加機能を実装したアプリのコードを紹介します。

https://github.com/y-tsuritani/streamlit-audio-transcribe/blob/main/app/audio_transcribe.py

主なポイントは以下の通りです。

  1. 音声ファイルを分割して API 制限を回避する

    • Whisper の API 上限である 25MB を超えないよう、10 分ごとに分割する(split_audio 関数)
    • 音声ファイルは、汎用性を高めるために、mp3 形式で保存する(convert_audio_to_mp3 関数)
  2. ChatCompletions を使って文字起こしした文章を校正する

    • 校正する文章も API 上限を超えないよう、句読点ごとに分割する(correct_japanese_text 関数)
    • 業界用語を効率よく校正するために、prompt に会議が行われた業界情報を追加する(correct_japanese_text 関数内 prompt 変数)

追加機能の効果検証

追加機能の効果を検証するために、IT 業界の用語が多く含まれる音声ファイルを用意し、文字起こしした結果を比較してみます。

今回は、検証用に適した音声ファイルがなかったので、ChatGPT に生成してもらった以下の内容を自分で音読しました。

バッチ処理をオンプレミスからクラウド(例えばGoogle Cloud Platform)へ移行する際に注意すべき点は以下の通りです:

セキュリティとコンプライアンス:

クラウドサービスプロバイダのセキュリティ規格とコンプライアンスを確認(例: Google CloudのIAMポリシー)
データの暗号化とアクセス制御を適切に設定
データ移行:

データの移行計画を立て、データの整合性を保つ
GCPの「Cloud Storage Transfer Service」や「BigQuery Data Transfer Service」を活用
依存関係の管理:

オンプレミスのシステムとの依存関係を特定し、クラウド移行後の対応策を準備
ネットワーク設定(VPC、VPN)やAPI呼び出しの調整
パフォーマンスとスケーリング:

クラウドリソースの自動スケーリング機能の活用(例: GCPのCompute Engine)
バッチ処理の実行に必要なリソースの見積もりと最適化
コスト管理:

クラウドリソースのコスト管理と最適化(例: GCPの「Cloud Billing」)
使用状況の監視と課金アラートの設定
ディザスタリカバリとバックアップ:

データのバックアップとリカバリプランの策定(例: GCPの「Cloud Storage」)
災害時のデータ復旧手順の確立
監視とログ管理:

システムの監視とログ管理(例: GCPの「Stackdriver」)
アラート設定とインシデント対応プロセスの整備
これらの点を検討し、計画的にクラウドへの移行を進めることが重要です。

条件

検証には以下の3種類の条件を設定しました。

  • Whisper で文字起こししただけの文章
  • Whisper で文字起こしした文章を ChatCompletions で校正した文章。プロンプトに業界用語を追加しない。
  • Whisper で文字起こしした文章を ChatCompletions で校正した文章。プロンプトに業界情報を追加する。

検証1:Whisper で文字起こししただけの文章

バッジ処理をオンプレミスからクラウド 例えば Google クラウドプラットフォームへ 移行する際に注意すべき点は以下のとおりです 一つ目はセキュリティとコンプライアンスについてです クラウドサービスプロバイダーの セキュリティ規格とコンプライアンスを確認してください 例えば Google クラウドの IAM ポリシーなどが活用できます データの暗号化とアクセス制限を 適切に設定してください 次にデータ移行についてです データの移行計画を立て データの整合性を保ってください GCP のクラウドストレージトランスファーサービスや ビッグクエリデータトランスファーサービスを 活用してください 三つ目に依存関係の管理です オンプレミスのシステムとの依存関係を特定し クラウド移行後の対応策を準備してください ネットワーク設定は VPC や VPN の設定をし API 呼び出しの調整も行ってください 四つ目にパフォーマンスとスケーリングです クラウドリソースの自動スケーリング機能を 活用してください 例えば GCP のコンピュートエンジンが活用できます バッジ処理の実行に必要なリソースの見積もりと 最適化を行ってください 五つ目はコスト管理です クラウドリソースのコスト管理と 最適化を利用してください GCP ではクラウドビリングを活用できます 使用状況の監視と課金アラートについても 設定を行ってください デザスタリカバリとバックアップも行ってください データのバックアップとリカバリプランの策定です GCP ではクラウドストレージで設定を行ってください また災害時のデータ復旧手順についても 確立してください 最後に監視とログ管理です システムの管理とログ管理 例えば GCP ではスタックドライバーなどが利用できます アラートの設定とインシデント対応のプロセスも 整備を行ってください 以上の点を検討して計画的に クラウドへの移行を進めることが重要です

  • 句読点などがなく、文章が読みにくい
  • 業界用語が多いため、認識精度が低い 意外と認識精度が高い(あれ?)

検証2;Whisper で文字起こしした文章を ChatCompletions で校正した文章。プロントに業界情報追加なし

バッジ処理をオンプレミスからクラウド(例えば Google クラウドプラットフォーム)へ移行する際に注意すべき点は以下のとおりです。一つ目はセキュリティとコンプライアンスについてです。クラウドサービスプロバイダーのセキュリティ規格とコンプライアンスを確認してください。例えば、Google クラウドの IAM ポリシーなどが活用できます。データの暗号化とアクセス制限を適切に設定してください。次にデータ移行についてです。データの移行計画を立て、データの整合性を保ってください。GCP のクラウドストレージトランスファーサービスやビッグクエリデータトランスファーサービスを活用してください。三つ目に依存関係の管理です。オンプレミスのシステムとの依存関係を特定し、クラウド移行後の対応策を準備してください。ネットワーク設定は VPC や VPN の設定をし、API 呼び出しの調整も行ってください。四つ目にパフォーマンスとスケーリングです。クラウドリソースの自動スケーリング機能を活用してください。例えば、GCP のコンピュートエンジンが活用できます。バッジ処理の実行に必要なリソースの見積もりと最適化を行ってください。五つ目はコスト管理です。クラウドリソースのコスト管理と最適化を利用してください。GCP ではクラウドビリングを活用できます。使用状況の監視と課金アラートについても設定を行ってください。デザスタリカバリとバックアップも行ってください。データのバックアップとリカバリプランの策定です。GCP ではクラウドストレージで設定を行ってください。また、災害時のデータ復旧手順についても確立してください。最後に監視とログ管理です。システムの管理とログ管理。例えば、GCP ではスタックドライバーなどが利用できます。アラートの設定とインシデント対応のプロセスも整備を行ってください。以上の点を検討して計画的にクラウドへの移行を進めることが重要です。

  • 句読点や鉤括弧が追加され、文章が読みやすくなった
  • 業界用語が多いため、認識精度が低い 意外と認識精度が高い(あれ?)

検証3:Whisper で文字起こしした文章を ChatCompletions で校正した文章。プロントに業界情報を追加あり

バッチ処理をオンプレミスからクラウド(例えば Google クラウドプラットフォーム)へ移行する際に注意すべき点は以下のとおりです。
まず、セキュリティとコンプライアンスについてです。クラウドサービスプロバイダーのセキュリティ規格とコンプライアンスを確認してください。例えば、Google クラウドの IAM ポリシーなどが活用できます。データの暗号化とアクセス制限を適切に設定してください。
次に、データ移行についてです。データの移行計画を立て、データの整合性を保ってください。GCP のクラウドストレージトランスファーサービスやビッグクエリデータトランスファーサービスを活用してください。
三つ目に依存関係の管理です。オンプレミスのシステムとの依存関係を特定し、クラウド移行後の対応策を準備してください。ネットワーク設定は VPC や VPN の設定をし、API 呼び出しの調整も行ってください。
四つ目にパフォーマンスとスケーリングです。クラウドリソースの自動スケーリング機能を活用してください。例えば、GCP のコンピュートエンジンが活用できます。バッチ処理の実行に必要なリソースの見積もりと最適化を行ってください。
五つ目はコスト管理です。クラウドリソースのコスト管理と最適化を利用してください。GCP ではクラウドビリングを活用できます。使用状況の監視と課金アラートについても設定を行ってください。デザスタリカバリとバックアップも行ってください。データのバックアップとリカバリプランの策定は GCP のクラウドストレージで設定を行ってください。また、災害時のデータ復旧手順についても確立してください。
最後に監視とログ管理です。システムの管理とログ管理、例えば GCP ではスタックドライバーなどが利用できます。アラートの設定とインシデント対応のプロセスも整備を行ってください。
以上の点を検討して計画的にクラウドへの移行を進めることが重要です。

  • 句読点や鉤括弧だけでなく、改行まで追加されて、ほぼ議事録になりそうな文章になった
  • 業界用語の誤認識が修正され、認識精度が向上している そもそも Whisper の認識精度が高い(あれ?)

検証結果

検証結果は以下の通りです。

条件 文章 認識制度
検証1 文章が読みにくい 業界用語が多いため、認識精度が低い 普通に認識した(あれ?)
検証2 句読点や鉤括弧が追加され、文章が読みやすくなった 業界用語が多いため、認識精度が低い 普通に認識した(あれ?)
検証3 句読点や鉤括弧だけでなく、改行まで追加されて、ほぼ議事録になりそうな文章になった 業界用語の誤認識が修正され、認識精度が向上している そもそも Whisper の認識精度が高い(あれ?)

まとめ

今回は、前回の記事で作成した Streamlit と Whisper を使った文字起こしアプリをもっと議事録作成用にいくつか改善してみました。

今回の改善で、30 分以上と長い会議の文字起こしでも、API 制限を超えることなく文字起こしを行うことができるようになりました。また、ChatCompletions を使って文字起こしした文章を校正することで、文字起こしの精度が向上しました。

最後の検証については、手元の実際の会議音声を使ってみた際は、具体的な用語が認識されなかった部分がプロンプトで誤認識の修正が行えていたのですが、今回は Whisper の認識精度が高く、プロンプトを使わなくてもほぼ正確に認識されていました。録音環境が良かったので、精度が高くなったのかもしれません。

議事録の自動化における優先度は、録音環境の改善 > プロンプトによる誤認識の修正 ということになりそうです。ただ、録音環境はいつでも完璧にはいかない部分があるので、プロンプトによる誤認識の修正は、議事録作成の効率を大きく向上させることができるでしょう。

また、業界用語を含む会議の文字起こしにおいても、与えるプロンプトを改善することにより、このような改善は大きな効果を発揮するでしょう。

今回の記事を通じて、Streamlit と Whisper を使った文字起こし文章を OpenAI API を使って簡単にポストプロセッシングする方法と実装を学びました。このアプリを使えば、議事録作成の効率が向上するでしょう。ぜひ、このアプリを活用してみてください!

Github リポジトリ

https://github.com/y-tsuritani/streamlit-audio-transcribe/

参考

前回記事

先駆者様

公式ドキュメント

GitHubで編集を提案
ギックス

Discussion