見出し画像

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()

この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?