関連記事
はじめに
この記事では、議事録作成システムを開発していきます。1時間以上の会議を想定し、会議の音声データを文字起こし、議事録作成まで説明していきます。GoogleのSpeech to TextやOpenAIのAPIを活用し、実装します。
1つの記事に纏めるのは難しいので、記事を何回かに分けたいと思います。開発の流れは以下のようになります。
- 音声データの分割
- 分割した音声データを文字起こし
- 文字起こしした文章から議事録を作成
前回記事では、音声データを分割し、処理しやすい長さにしました。この分割した音声データを使って、今回は2. 分割した音声データを文字起こしについて説明していきます。
前回記事はこちらからご覧ください。
分割した音声データを文字起こし
前回、音声データを分割し、Google Cloud Storage (GCS)にアップロードしました。今回はアップロードした音声データを使って、GoogleのSpeech to TextのAPIで非同期処理を行い、文字起こししていきます。
分割した音声データを文字起こしを行う流れは以下の通りです。
- GCSにアップロードされた音声ファイルを文字起こし
- 文字起こしした文章を1つに纏める
- 文字起こしした文章をテキストファイルとして保存する
コード全体を先に示しておきます。全体像を知りたい方はご覧ください。
コード全体
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を使用して、非同期処理で文字起こしを行い、テキストファイルとして保存しました。今回で、議事録作成のための準備ができました。次回は、このテキストデータを使用して議事録を作成する方法について説明します。