こんにちは。サイオステクノロジーの和田拓也です。今回はAzure OpenAIを使って音声認識アプリを作ってみたので、作成手順や使用感を書いていきたいと思います。
前提条件
今回はPythonのStreamlitを使ってブラウザのマイクからインプットした音声をAIを使って文字お越ししていきます。StreamlitはPythonでWebアプリケーションを簡単に作ることができるフレームワークです。ここからはStreamlitが動く環境があることを前提に話を進めていきます。
Azure OpenAIモデル作成
まず初めにAzurePortalにアクセスして、リソースを作成します。MarketplaceでAzure OpenAIと検索して、リソース作成画面に飛びます。
作成をクリックすると、リソースの作成画面に飛びます。必要な項目を入力してリソースを作成します。今回はEast US 2をリージョンとして作成しました。
リソースの作成が終わったら、概要の上のほうにGo to Azure AI Foundry portalというボタンがあるのでクリックします。すると以下のようなページに移動します。
左側のメニューからデプロイをクリックします。すると、モデルのデプロイが行える画面が表示されます。モデルのデプロイをクリックして、基本モデルをデプロイするを選択します。
このような画面が表示されます。今回は音声認識のモデルを利用したいので、音声認識で絞り込みます。whisperというモデルのみが使えるみたいなので、今回はこちらを使用していきます。
モデルを作成し終わったら、左のメニューからホームをクリックして、表示されているエンドポイントとAPIキーをメモしておきます。
ソースコード実装
続いてソースコードのほうを実装していきます。Pythonを用いて以下のソースコードで動かしていきます。
import streamlit as st
from audio_recorder_streamlit import audio_recorder
import tempfile
from openai import AzureOpenAI
endpoint = "メモしたエンドポイント"
key = "メモしたAPIキー"
version = "2024-10-01-preview"
deployment_id = "whisper"
client = AzureOpenAI(
api_key=key,
api_version=version,
azure_endpoint = endpoint
)
def transcribe_audio_to_text(audio_bytes):
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_audio_file:
temp_audio_file.write(audio_bytes)
temp_audio_file_path = temp_audio_file.name
result = client.audio.transcriptions.create(
file=open(temp_audio_file_path, "rb"),
model=deployment_id
)
return result.text
st.title("Voice to Text Transcription")
# Streamlitウィジェットを使用して音声を録音
audio_bytes = audio_recorder(pause_threshold=30)
# 録音した音声を再生
if audio_bytes:
st.audio(audio_bytes, format='audio/wav')
# OpenAI Whisper APIを使用して音声をテキストに変換
if audio_bytes:
transcript = transcribe_audio_to_text(audio_bytes)
st.write(transcript)
これで一通り動く準備ができたので、実際に動作を確認していきたいと思います。
動作確認
Streamlitで立ち上げたブラウザにアクセスすると、以下のような画面が表示されます。
マイクのボタンをクリックして音声を録音します。すると、録音した音声を再生するボタンと、Azure OpenAIを使って文字お越しされたテキストが表示されます。
まとめ
今回は、Azure OpenAIの音声認識を使って音声認識アプリを作ってみました。使ってみた感想としては、音声認識の精度はかなり良い印象でした。しかし、無音の状態だとハルシネーションを起こすことがあったので、リアルタイムで音声認識させたい場合はすこし工夫が必要だと感じました。