見出し画像

ChatGPTで音声対話システムを作る


2023年11月7日 OpenAI DevDayが開催された.
既に触れられた方も多いだろうが,GPT-4 Turbo,Assitants API,GPTs,Text-to-Speech等,大幅にアップデートされた.

https://openai.com/blog/new-models-and-developer-products-announced-at-devday


OpenAI

本記事の主題

本記事では,OpenAIのAPIのみで,音声対話システムを構築する方法を書き記す.

背景

私は,IT・通信会社でUI/UXデザイナーをしつつ,大学院で音声情報検索を研究している,しがない社会人大学院生である.

昨年度まで,音声対話型情報検索を研究する上で,Wizard-Of-Oz法をベースとしたシステム(実験者がシステムに扮して,ユーザのクエリに回答するようなもの)を構築し,ユーザ実験を行なっていた.

Wizard-Of-Oz法を用いていた理由としては,シンプルに様々なドメインに対応する音声情報検索システムの構築が難しかったからである.正確には,あるドメインのみに対応した言語モデルを構築することは可能であるが,自分の研究上,必要性がなかったので踏み込んでいなかった.
私の研究は,あくまでユーザとシステム間のインタラクションにフォーカスを当てているため,ガッツリと言語モデルを構築する必要はなく,そこは別の人に任せる姿勢であった.

とはいえ,Wizard-Of-Ozを用いた実験には限界がある.例えば,ユーザからの想定していなかったクエリに回答ができずに,ユーザがシステムを過小評価してしまい,実験結果に多少なりとも影響が見られることがあった.
クエリに対する回答の信頼性はさておき,あらゆる質問に対して,回答する必要性を感じており,頭を抱えていた.

しかし,ここ一年,ChatGPTの登場により,状況は一変する.研究テーマの変更を余儀されなくなる人もいれば,恩恵に預かった人もいる.

私は,後者であり,ChatGPTによって,これで実験精度を高められるとなと感じた.
ただ,OpenAIのText-to-Speech(以後TTS)のAPIがなく,音声対話システムの構築には,別のAPIを叩かなければならないのと,あまり日本語のTTSで良いものが見つからず,手間がかかり,かつレスポンスも悪いというように,課題が散漫している状況であった.

OpenAI の大幅アップデート

ここでようやく冒頭に話が戻る.
9月末辺りに,音声対応機能がリリースされていたが,開発者にはオープンにされていなかった.今か今かと待ち侘び,2023年11月6日,ついにOpenAIからTTSがリリースされたのである.
シンプルなコードで,実装することが可能となった.

ChatGPTと対話しよう

Speech To TextはOpenAIのWhisper.TTSは8種類くらいから声を選べるので,OpenAIのDocumentを参考に好きなように実装いただきたい.
なお,LangChainを用いて対話を保持する機能を実装している.
Templateの中の文言によってChatGPTの振る舞いを制御できる.
”さようなら”というの対話が終了するようになっている.

.envファイルを作って以下のように,自身のAPI-keyを設定する.

OPENAI_API_KEY=sk-***

test.pyファイルを作って,以下のコードを記述

import os
from langchain.prompts.prompt import PromptTemplate
import openai
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from playsound import playsound
import speech_recognition as sr
from io import BytesIO
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())

openai.api_key= os.environ["OPENAI_API_KEY"]


llm = ChatOpenAI(model_name="gpt-4-1106-preview",temperature=0)
template = """次の会話は調べ物をしている人とエキスパートとの対話です.エキスパートは,物知りで,非常に短い言葉,100字程度でわかりやすく,応答することができます.

Current conversation:
{history}
Researcher: {input}
Expert:"""
PROMPT = PromptTemplate(input_variables=["history", "input"], template=template)
conversation = ConversationChain(
    prompt=PROMPT,
    llm=llm,
    verbose=True,
    memory=ConversationBufferMemory(human_prefix="Researcher"),
)


EXIT_PHRASE = 'さようなら'
flag = True

while flag:
    #input audio
    r = sr.Recognizer()
    with sr.Microphone(sample_rate=16000) as source:
        print("何か話してください")
        audio = r.listen(source)
        print("音声を取得しました")
    
        #speechtotext

    audio_data = BytesIO(audio.get_wav_data())
    audio_data.name = "from_mic.wav"
    transcript = openai.audio.transcriptions.create(
    model="whisper-1", 
    file=audio_data, 
    response_format="text"
    )
    print(f"You:{transcript}")
    
    if EXIT_PHRASE in transcript.lower().strip():
        flag = False
    
    user_message = transcript
    ai_message = conversation.run(input=user_message)

    response = openai.audio.speech.create(
        model="tts-1",
        voice="onyx",
        input=ai_message,
        speed=1.2
    )
    response.stream_to_file("output.mp3")
    playsound("output.mp3")

    print(f"AI:{ai_message}")

ターミナル上でpython3 test.pyと実行すると,システムが立ち上がる.

様々なモジュールをインポートする必要があるが,その都度出てくるエラー等でインストールをして対応すれば問題なく動く.

終わりに

デザイナーの仕事仲間内でも,今回のアップデートは話題の中心を占めていた.チームメンバーは,GPTsを用いてアイデアのブラッシュアップの技法であるラウンドロビンを作⁩ったり,Image To Imageで同じような雰囲気のアイデアカードを作ったりしてデザインプロセスへの適用も本格的に進めていっている.

ここ最近のAIの進歩には目を見張るものがある.一寸の油断も許さない状況であると認識し,常にキャッチアップをしていきたいものである.





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