☎️

長時間音声データをAzure AI SpeechのFast Transcription API (preview)で文字起こしする

2024/07/19に公開

2024年5月のMicrosoft Buildで発表された「Fast Transcription API」がパブリックプレビューになっていたので試してみました。

Fast Transcription APIとは

Fast Transcription APIとは、Azure AI Speechファミリーの一部で、

  • 長さ: 2時間未満
  • サイズ: 200MB未満

の音声やビデオの文字起こしを高速に行うことが出来ます。
公式ブログによると、以下のようなユースケースを想定しているようです。

コール センターで働く一般的なエージェントは、通話ごとに 3 ~ 5 分かけてメモを作成します。Fast Transcription API と Azure OpenAI サービスを組み合わせると、このタスクを自動化して、コール センターの作業時間を何千時間も短縮できます。患者との会話を記録する医療従事者は、これらの記録を数秒で分析できます。同様に、メディアやコンテンツの作成者は、ポッドキャストやインタビューが終わるとすぐに分析して洞察を抽出できます。

OpenAIのWhisperはファイルサイズに25MBの制限がある[1]ため、大きなファイルは分割して処理をする必要がありますが、その手間が省けるのはありがたいですね。

サポートされているオーディオ形式

以下のとおりです。動画にも対応しているのは嬉しいですね。

  • WAV
  • MP3
  • OPUS/OGG
  • FLAC
  • WMA
  • AAC
  • ALAW in WAV container
  • MULAW in WAV container
  • AMR
  • WebM
  • M4A
  • SPEEX

検証

検証用のデータは以前こちらの記事で利用したデータを使います。

公式のドキュメントを参考にPythonでAPIを実行してみます。

import os
import requests
import json
import time
from dotenv import load_dotenv

load_dotenv()

def test_speech_to_text_api(file_path, api_url, subscription_key):
    headers = {
        "Accept": "application/json",
        "Ocp-Apim-Subscription-Key": subscription_key
    }

    definition = {
        "locales": ["ja-JP"],
        "profanityFilterMode": "Masked",
        "channels": [0,1]
    }

    files = {
        "audio": ("audio.wav", open(file_path, "rb")),
        "definition": (None, json.dumps(definition), "application/json")
    }

    start_time = time.time()
    response = requests.post(api_url, headers=headers, files=files)
    end_time = time.time()

    print(f"API Response Time: {end_time - start_time:.2f} seconds")
    print(f"Status Code: {response.status_code}")
    print(f"Response: {response.json()['combinedPhrases'][0]['text']}")

file_path = os.getenv("AUDIO_FILE_PATH")
subscription_key=os.getenv("SUBSCRIPTION_KEY")
region=os.getenv("REGION")

api_url = f"https://{region}.api.cognitive.microsoft.com/speechtotext/transcriptions:transcribe?api-version=2024-05-15-preview"

test_speech_to_text_api(file_path, api_url, subscription_key)

出力結果

出力結果は以下のようになりました。

API Response Time: 21.33 seconds
Status Code: 200
Response: エックス株式会社のワイです。お忙しいところ恐れ入ります。こちらはゼット株式会社のエーと申します。はい、どういったご用件でしょうか?今日は新しいAIを利用した顧客管理ツールについてご案内をさせて頂きたくご連絡をさせていただきました。最近、そういった営業の面は多いんですよ。すでに導入検討してるシステムもありますし、なるほど、そうでしたか?じゃあ今回はええと新しいあ。 多くの企業様にAIツールのご導入が進んでいますね。ただ、弊社のツールは一般的なCRMとは一線を画していて、従来のCRMシステムでは難しかったディープラーニングによる高度の顧客分析を可能にしております。例えば、お客様の購買履歴だけでなく、お客様のサポート履歴やお問い合わせ履歴も組み合わせて次のアクションをAIが提案する機能など、非常に高度なサポートが可能です。おおそうなんですね。 でも新しいツールを導入するのはコストもかかるし、自動のデータを移行する手間もあるのになかなかすみませんね。なるほどですね。弊社ではデータの移行サポートを行っており、お客様の業務負荷を最小限に抑えてのシステム移行をサポートさせていただきます。また、コストについてもお客様のご予算に応じた17プランをご提案させていただいております。導入のメリットについて、詳しくは資料をお送りさせて頂ければと思いますが、いかがでしょう資料ですか?うーん、まあいいいですかね? ありがとうございます。承知いたしました資料をお送りさせていただくとともに、後日お時間をいただけるのであれば、オンラインのデモンストレーションもさせていただきます。

・・・以下略・・・

何度か試しましたが、処理にかかる時間は平均して21秒程度でした。

Deepgramの文字起こし時間が3秒ほどだったのでそれと比較すると時間がかかっていますが、文字起こしの精度はかなり高いことがわかりました。

長時間の音声データで試す

せっかくなので1時間以上の音声でも試してみたいと思います。
ただ手元に長時間の通話音声のファイルが無いため、さきほどの検証で利用したデータを合成して1時間の音声ファイルを作成します。

from pydub import AudioSegment
import math

def extend_mp3_file(input_file, output_file, target_duration):
    audio = AudioSegment.from_mp3(input_file)
    
    # 元のファイルの長さ(ミリ秒)
    original_duration = len(audio)
    
    # 必要な繰り返し回数を計算
    repeat_times = math.ceil(target_duration * 1000 / original_duration)
    
    # 音声を繰り返して結合
    extended_audio = audio * repeat_times
    
    # 目標の長さにトリミング
    extended_audio = extended_audio[:target_duration * 1000]
    
    # ファイルを保存
    extended_audio.export(output_file, format="mp3")
    
    # ファイルサイズを確認
    file_size = extended_audio.frame_count() * extended_audio.frame_width / (1024 * 1024)
    print(f"作成されたファイルのサイズ: {file_size:.2f} MB")
    print(f"作成されたファイルの長さ: {len(extended_audio) / 1000:.2f} 秒")

# 使用例
input_file = "5min.mp3"  # 5分のMP3ファイルのパス
output_file = "1hour.mp3"  # 出力ファイルのパス
target_duration = 3600  # 目標の長さ(秒)、1時間 = 3600秒

extend_mp3_file(input_file, output_file, target_duration)

このスクリプトを実行して1時間の音声データができました。

出力結果

作成したデータを利用して最初の検証スクリプトで実行してみます。

API Response Time: 130.81 seconds
Status Code: 200
Response: ルックス株式会社のワイです。お忙しいところ恐れ入ります。こちらはゼット株式会社のエーと申します。はい、どういったご用件でしょうか?

・・・以下略・・・

130秒ほどかかりましたが無事に処理が完了しました。
時間はそれなりにかかりますが、1時間分の会話がこの時間で処理できるとかなり作業効率が上がりそうですね。

まとめ

今回はFast Transcription APIを試してみました。
まだパブリックプレビューですが、速度・精度ともに期待出来る結果だったので正式リリースが楽しみです。

ステレオ(2チャンネル)で録音された音声であればパラメータで指定するだけで簡単に話者分離も出来るようなので、コールセンター等のシステムであれば有効に活用できそうですね。

今回は以上です。

脚注
  1. Azure OpenAIのバッチ文字起こしを利用すると1GBまでのファイルを処理できるようなので非同期処理でも対応可能なユースケースではこちらを利用してもよいと思います ↩︎

SMARTCAMP Engineer Blog

Discussion