AzureOpenAIで英会話力を向上したい~試行編①~
自動音声対話システムを構築するには、以下のステップを実行。
1. Amazon Transcribeで音声をテキストに変換
import boto3
import requests
import uuid
def transcribe_audio(file_path, region='us-east-1', lang='en-US'):
# Amazon Transcribeクライアントを作成
transcribe_client = boto3.client('transcribe', region_name=region)
# 一意のジョブ名をUUIDを使用して生成
job_name = "transcribe_job_" + str(uuid.uuid4())
# 音声をテキストに変換するジョブを開始
transcribe_client.start_transcription_job(
TranscriptionJobName=job_name,
Media={'MediaFileUri': file_path},
MediaFormat='mp3',
LanguageCode=lang
)
# ジョブの完了を待つ
while True:
status = transcribe_client.get_transcription_job(TranscriptionJobName=job_name)
if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
break
# 変換結果のURLを取得
result_url = status['TranscriptionJob']['Transcript']['TranscriptFileUri']
# 結果を取得して返す
transcript = requests.get(result_url).json()['results']['transcripts'][0]['transcript']
return transcript
2. ChatGPT APIを使用してテキストに応答
import openai
# OpenAI APIキーを設定
openai.api_key = 'YOUR_OPENAI_API_KEY'
def chat_with_friendly_english_teacher(prompt, model='text-davinci-003'):
# GPT-3によるチャット応答を生成(フレンドリーな英語の先生として)
response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": "You are a friendly and supportive English teacher."},
{"role": "user", "content": prompt}
]
)
# 応答のテキストを返す
return response.choices[0].message['content']
3. Amazon Pollyでテキストを音声に変換
import boto3
def synthesize_speech(text, output_format='mp3', voice_id='Joanna', region='us-east-1'):
# Amazon Pollyクライアントを作成
polly_client = boto3.client('polly', region_name=region)
# テキストを音声に変換するリクエストを送信
response = polly_client.synthesize_speech(
Text=text, # 変換するテキスト
OutputFormat=output_format, # 出力フォーマット(例:'mp3')
VoiceId=voice_id # 使用する音声のID(例:'Joanna')
)
# 音声データを読み込んで返す
return response['AudioStream'].read()
この関数は、Amazon Pollyを使用して指定されたテキストを音声に変換します。Text パラメータには変換するテキストを指定し、OutputFormat パラメータには出力される音声のフォーマット(例:'mp3')を指定します。VoiceId パラメータには使用する音声のIDを指定します(例:'Joanna')。変換された音声データは response['AudioStream'].read() を通じて取得できます。
4. Streamlitを使用してユーザーからの音声ファイルをアップロードし、アップロードされた音声ファイルをAmazon Transcribeを使用してテキストに変換する部分の実装例
import streamlit as st
import boto3
import requests
import uuid
# Amazon Transcribeで音声をテキストに変換
def transcribe_audio(file_content, region='us-east-1', lang='en-US'):
# Amazon Transcribeクライアントを作成
transcribe_client = boto3.client('transcribe', region_name=region)
# 一意のジョブ名をUUIDを使用して生成
job_name = "transcribe_job_" + str(uuid.uuid4())
# S3に音声ファイルをアップロード(事前にS3バケットを作成しておく必要があります)
s3_client = boto3.client('s3', region_name=region)
s3_bucket_name = 'your-s3-bucket-name'
s3_key = f'audio/{job_name}.mp3'
s3_client.put_object(Bucket=s3_bucket_name, Key=s3_key, Body=file_content)
# 音声をテキストに変換するジョブを開始
transcribe_client.start_transcription_job(
TranscriptionJobName=job_name,
Media={'MediaFileUri': f's3://{s3_bucket_name}/{s3_key}'},
MediaFormat='mp3',
LanguageCode=lang
)
# ジョブの完了を待つ
while True:
status = transcribe_client.get_transcription_job(TranscriptionJobName=job_name)
if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
break
# 変換結果のURLを取得
result_url = status['TranscriptionJob']['Transcript']['TranscriptFileUri']
# 結果を取得して返す
transcript = requests.get(result_url).json()['results']['transcripts'][0]['transcript']
return transcript
# Streamlitアプリのメイン関数
def main():
st.title("Friendly English Teacher Chatbot")
# 音声ファイルのアップロード
uploaded_file = st.file_uploader("Upload your audio file (mp3 format):", type=['mp3'])
if uploaded_file is not None:
# 音声をテキストに変換
with st.spinner('Transcribing audio...'):
transcript = transcribe_audio(uploaded_file.getvalue())
st.text_area("Transcribed text:", transcript)
# Streamlitアプリを実行
if __name__ == '__main__':
main()