9月に卒業したAIIT(社会人大学院)の授業の中で、雑に作ったコードがあり、そちらを供養。
Streamlit を初めて使ったんですが、プロトタイプを簡単に作るのは結構便利でした。
Streamlit documentation
他の方の説明しているブログなど。
www.alpha.co.jp
書籍も出ているみたいですね。
一旦、自分の書いたコードはこんな感じです。
授業の縛りでPythonでしたが、今後こういう系はM1Chipで動くようになったMojoとかでトライしてみたいところ。
import subprocess
import streamlit as st
import openai
import asyncio
speakers = {
"四国めたん": {
"ノーマル": 2,
"あまあま": 0,
"ツンツン": 6,
"セクシー": 4
},
"ずんだもん": {
"ノーマル": 3,
"あまあま": 1,
"ツンツン": 7,
"セクシー": 5
},
"春日部つむぎ": {
"ノーマル": 8
},
"雨晴はう": {
"ノーマル": 10
},
"波音リツ": {
"ノーマル": 9
},
"玄野武宏": {
"ノーマル": 11
},
"白上虎太郎": {
"ノーマル": 12
},
"青山龍星": {
"ノーマル": 13
},
"冥鳴ひまり": {
"ノーマル": 14
},
"九州そら": {
"ノーマル": 16,
"あまあま": 15,
"ツンツン": 18,
"セクシー": 17,
"ささやき": 19
}
}
def get_chat_ai_answer(text_input):
openai.api_key = st.secrets["chatgpt_api_key"]
messages = [{"role": "user", "content": text_input + "という大喜利に答えて。10文字以上50文字以内で答えよ"}]
completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages)
response_data = completion["choices"][0]["message"]["content"].strip()
with open("text.txt", "w", encoding="utf-8") as f:
f.write(response_data)
return response_data
def generate_image(prompt):
response = openai.Image.create(prompt=prompt, n=1, size="512x512")
image_url = response["data"][0]["url"]
return image_url
async def get_audio_query(speaker_id):
audio_query_cmd = f'curl -s -X POST "localhost:50021/audio_query?speaker={speaker_id}" --get --data-urlencode ' \
f'text@text.txt > query.json '
subprocess.run(audio_query_cmd, shell=True, check=True)
synthesis_cmd = f'curl -s -H "Content-Type: application/json" -X POST -d @query.json ' \
f'"localhost:50021/synthesis?speaker={speaker_id}" '
response = subprocess.run(synthesis_cmd, shell=True, check=True, capture_output=True)
with open("audio.wav", "wb") as file:
file.write(response.stdout)
def main():
st.title("大喜利のお題にAIが答えてくれるアプリ")
text_input = st.text_area("大喜利のお題入力欄", value="", key="text_input",
placeholder="ex) AIITで3ヶ月に1度しか提供されない学食のメニューとは")
selected_speaker = st.selectbox("お題に答えてくれる人", list(speakers.keys()))
if st.button("AIが回答して、イメージ画像が出るよ", key="generate_button"):
response_data = get_chat_ai_answer(text_input)
st.spinner("画像生成中...")
image_url = generate_image(response_data + "という返答のイメージ画像")
st.success("画像生成が完了しました!")
st.image(image_url, caption="Generated Image", use_column_width=True)
st.spinner("音声生成中...")
speaker_id = speakers[selected_speaker]["ノーマル"]
asyncio.run(get_audio_query(speaker_id))
st.success("音声生成が完了しました!")
st.audio("audio.wav", format="audio/wav")
st.write("Response Data:", response_data)
if __name__ == "__main__":
main()