テックブログ

エルカミーの技術ブログです

📝 議事録作成システムの構築 2/3回(Speech to Text編)

関連記事

  1. 議事録作成システムの構築 1/3(音声データの分割編)
  2. 議事録作成システムの構築 2/3回(Speech to Text編)

はじめに


この記事では、議事録作成システムを開発していきます。1時間以上の会議を想定し、会議の音声データを文字起こし、議事録作成まで説明していきます。GoogleのSpeech to TextやOpenAIのAPIを活用し、実装します。

1つの記事に纏めるのは難しいので、記事を何回かに分けたいと思います。開発の流れは以下のようになります。

💡
開発の流れ
  1. 音声データの分割
  2. 分割した音声データを文字起こし
  3. 文字起こしした文章から議事録を作成

前回記事では、音声データを分割し、処理しやすい長さにしました。この分割した音声データを使って、今回は2. 分割した音声データを文字起こしについて説明していきます。

前回記事はこちらからご覧ください。

分割した音声データを文字起こし


前回、音声データを分割し、Google Cloud Storage (GCS)にアップロードしました。今回はアップロードした音声データを使って、GoogleのSpeech to TextのAPIで非同期処理を行い、文字起こししていきます。

分割した音声データを文字起こしを行う流れは以下の通りです。

💡
分割した音声データを文字起こし
  1. GCSにアップロードされた音声ファイルを文字起こし
  2. 文字起こしした文章を1つに纏める
  3. 文字起こしした文章をテキストファイルとして保存する

コード全体を先に示しておきます。全体像を知りたい方はご覧ください。

コード全体
import os

from google.cloud import speech, storage


def get_blobs(bucket_name):
    # Get list of files in the bucket
    storage_client = storage.Client()
    blobs = storage_client.list_blobs(bucket_name)
    return blobs


def transcribe_audio(blob, bucket_name):
    gcs_uri = f"gs://{bucket_name}/{blob.name}"
    audio = speech.RecognitionAudio(uri=gcs_uri)
    config = speech.RecognitionConfig(
        encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
        language_code="ja-JP",
        sample_rate_hertz=16000,
    )
    client = speech.SpeechClient()
    operation = client.long_running_recognize(config=config, audio=audio)
    print("Waiting for operation to complete...")
    response = operation.result(timeout=300)
    text = ""
    for result in response.results:
        text += result.alternatives[0].transcript
    print(text)
    return text


if __name__ == "__main__":
	api_key_path = "api_key_path"
  os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = api_key_path
	bucket_name = "bucket_name"
	blobs = get_blobs(bucket_name)
	blobs = sorted(blobs, key=lambda blob: int(blob.name.split("_")[2].split(".")[0]))
	text = ""
	for blob in blobs:
	    if blob.name.startswith("sumiful_mp4_") and blob.name.endswith(".wav"):
	        # Transcribe the audio file
	        text += transcribe_audio(blob, bucket_name)
	
	with open("text_file_path", "w", encoding="utf-8") as f:
	    f.write(text)

1. GCSにアップロードされた音声ファイルを文字起こし

GCSにアップロードされた音声ファイルをGoogleのSpeech to Text APIを使って文字に変換します。

以下の関数でこの操作を行っています。

def transcribe_audio(blob, bucket_name):
    gcs_uri = f"gs://{bucket_name}/{blob.name}"
    audio = speech.RecognitionAudio(uri=gcs_uri)
    config = speech.RecognitionConfig(
        encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
        language_code="ja-JP",
        sample_rate_hertz=16000,
    )
    client = speech.SpeechClient()
    operation = client.long_running_recognize(config=config, audio=audio)
    response = operation.result(timeout=300)
    text = ""
    for result in response.results:
        text += result.alternatives[0].transcript
    print(text)
    return text

引数はGCSの音声ファイルを指すblobと前回作成したGCSのバケット名を指すbucket_nameです。引数から、GCSの音声ファイルのURIを作成し、音声データを非同期に文字起こしします。

この関数は、各音声ファイルに対して呼び出され、文字起こししたテキストは後のステップで纏められます。

2. 文字起こしした文章を1つに纏める

次に、これらの文字起こしを1つのテキストとして纏めます。これは、transcribe_audio関数から返されるテキストを連結することで行います。

blobs = get_blobs(bucket_name)
blobs = sorted(blobs, key=lambda blob: int(blob.name.split("_")[2].split(".")[0]))
text = ""
for blob in blobs:
    if blob.name.startswith("sumiful_mp4_") and blob.name.endswith(".wav"):
        # Transcribe the audio file
        text += transcribe_audio(blob, bucket_name)

各音声ファイルが文字起こしされ、それぞれのテキストがtext変数に追加されていきます。

3. 文字起こしした文章をテキストファイルとして保存する

最後に、纏めたテキストをテキストファイルとして保存します。後で参照して、議事録を作成します。

	with open("text_file_path", "w", encoding="utf-8") as f:
	    f.write(text)

まとめ


本記事では、議事録作成システムの開発における「文字起こし」に焦点をあてて説明しました。GoogleのSpeech to TextのAPIを使用して、非同期処理で文字起こしを行い、テキストファイルとして保存しました。今回で、議事録作成のための準備ができました。次回は、このテキストデータを使用して議事録を作成する方法について説明します。

参考