生成AIのインプットに動画を使うため、まずはトランスクリプトを生成しよう[Azure AI Speech Services]

# はじめに
生成AIによって文章情報をインプットに要約や提案などのアウトプットを提供する機会が多くなっていると思います。動画からトランスクリプトを抽出することができれば、動画をインプットにして生成AIに作業させることができ、活用の幅が広がるはずです。そこで本記事ではAzure AI Speech ServicesとMoviePyを活用して動画からトランスクリプトを生成する方法を紹介します。

# 使うもの
今回の方法ではPythonの実行環境、Azureアカウントが必要です。Azure AI Speech ServicesというAzureソリューションとMoviePyというPythonのライブラリを活用して実現します。

### Azure AI Speech Services
Azure AI Speech Servicesは以下のような機能を提供しています。今回は音声のテキスト変換の機能を活用しますが、生成AIと相性のよい機能が多いと感じています。

| 機能 | 概要 |
|:-:|:-:|
| 音声のテキスト変換  | マイク、オーディオファイル、BLOBストレージなど様々なソースからオーディオをテキストに変換 |
| テキストを音声に変換 | 入力テキストを人間のような合成音声に変換 |
| 音声翻訳 | 音声のリアルタイムの多言語翻訳がアプリケーション、ツール、デバイスで可能 |
| 話者認識  | 固有の音声特性によって話者を検証および識別するアルゴリズムを提供 |
| 発音評価 | 発音を評価し、話された音声の正確性と流暢性に関するフィードバックを提供 |
| 意図認識 | トランスクリプトからユーザーの実現したい行動をくみ取る |

詳細はMicrosoftのドキュメントをご確認ください。

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/overview

#### Azure AI SpeechモデルとAzure OpenAIのWhisperモデルのどちらを使うべきか
Microsoftのドキュメントにてシナリオごとにどちらが適切か整理されています。単純な文字起こしの場合Azure OpenAIのWhisperモデルのファイルサイズ制限が25MBということもあり、それを超えるような大きなファイルの場合はAzure AI Speechモデルが推奨という使い分けになりそうです。

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/whisper-overview#whisper-model-via-azure-ai-speech-or-via-azure-openai-service

### MoviePy
Pythonで動画編集ができるライブラリです。動画を切り取ったり、くっつけたり、エフェクトを付けたりすることができますが、ここでは動画から音声を抽出するために活用します。

MoviePyのドキュメントはこちらをご確認ください。

https://zulko.github.io/moviepy/index.html

# やってみよう
### 動画から音声ファイルを抽出する

#### サンプルの動画を用意する
まず動画が必要なためサンプルを用意します。私は以下MicrosoftのAzure Well-Architected Framework High Availabilityのトレーニングから動画（3分ほど）をダウンロードしました。

https://learn.microsoft.com/en-us/training/modules/azure-well-architected-reliability/2-high-availability

#### 必要なMoviePyのライブラリをインストールする
音声ファイルの抽出に必要なMoviePyのライブラリをインストールします。
```
pip install moviepy
```

#### 音声ファイルを抽出するためのスクリプトを実行する
音声ファイル抽出のためのPythonスクリプトを作成します。
```
from moviepy.editor import *
video_file = "YOURMOVIE FILE"
output_file = "YOURMOVIE FILE.wav"


#load the video clip
video = VideoFileClip(video_file)

#extract the audio from the video
audio = video.audio

# Set the desired audio parameters
audio_params = {
    "codec": "pcm_s16le",
    "fps": 16000,  # Set the desired sampling rate: 16000 Hz
    # "fps": 8000,  # Alternatively, set the sampling rate to 8000 Hz
    "nchannels": 1,  # Mono audio
    "bitrate": "16k"  # Set the desired bitrate
}

# output the audio file
audio.write_audiofile(output_file)
```

実行すると以下の結果と音声ファイルが得られます。
```
PS C:\Users\kei\work\transcript> python .\toaudio.py
MoviePy - Writing audio in WAF-reliability.wav
MoviePy - Done.
```

### 音声ファイルからトランスクリプトを生成する
#### Azure AI Speech Serviceを設定する

Azure AI ServicesにAzure Speech（音声サービス）があるので作成を押下して新規に作成します。私は先に作ってしまったので画像だと価格レベルがStandard S0になっていますが、Free F0でも音声ファイル5時間分/月までは無料で使えるようです。
![azurespeech.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/15b77685-0e04-6347-adef-90943cfdbd97.png)

#### Azure AI Speech Servicesのライブラリをインストールする
Azure AI Speech Servicesの利用に必要なライブラリをインストールします。
```
pip install azure-cognitiveservices-speech
```

#### 音声ファイルからトランスクリプトを生成するスクリプトを実行する
音声ファイルからトランスクリプトを生成するスクリプトを作成します。speech_key, service_region, audio_fileは適切なものに変更ください。speech_keyは生成したAzure AI Speech Servicesのページから確認することができます。
```
import azure.cognitiveservices.speech as speechsdk
import time

# Set up the Azure Speech configuration
speech_key = "YOURKEY"
service_region = "YOUR REGION"
speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

# Set the audio file path
audio_file = "YOUR MOVIEFILE.wav"

# Set up the audio configuration
audio_config = speechsdk.audio.AudioConfig(filename=audio_file)

# Create a speech recognizer object
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

# Create an empty list to store the transcription results
transcriptions = []

# Define an event handler for continuous recognition
def continuous_recognition_handler(evt):
    if evt.result.reason == speechsdk.ResultReason.RecognizedSpeech:
        transcriptions.append(evt.result.text)

# Start continuous recognition
speech_recognizer.recognized.connect(continuous_recognition_handler)
speech_recognizer.start_continuous_recognition()

# Wait for the recognition to complete
timeout_seconds = 600  # Set a timeout value (in seconds) based on your audio file length
timeout_expiration = time.time() + timeout_seconds

while time.time() < timeout_expiration:
    time.sleep(1)  # Adjust the sleep duration as needed

# Stop continuous recognition
speech_recognizer.stop_continuous_recognition()

# Combine transcriptions into a single string
transcription = ' '.join(transcriptions)

# Write the transcription to a file
output_file = "transcription.txt"
with open(output_file, "w") as file:
    file.write(transcription)

print("Transcription saved to: " + output_file)
```

実行すると以下の結果とテキストファイルが得られます。
```
PS C:\Users\kei\work\transcript> python .\toaudio.py
Transcription saved to: transcription.txt
```

# まとめ
動画ファイルからトランスクリプトを生成することができました。生成AIとの組み合わせでまず思い付く使い道としてはセミナーの要約、議事録作成などへの活用が便利と思います。Azure AI Speech Servicesにはテキストを音声に変換するというサービスもあるので音声アシスタントとしての使い道にも応用できるとよいのですが、リアルタイム性を考慮したアーキテクチャの検討が必要ですのでもっと練ってみたいと思います。

# 参考
https://techcommunity.microsoft.com/t5/azure-architecture-blog/video-transcription-using-azure-speech-and-moviepy/ba-p/3888177