walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

AI とはじめる開発リハビリ(1)

ということで、AI たち(主に ChatGPT)と一緒に開発のリハビリとして何でも作っていきます。

↓前回の記事はこちら↓

walkingmask.hatenablog.com

今回は、OpenAI の Audio API の Text To Speech (TTS) が気になったので、「OpenAI TTS API の6種類の音声を好きな入力文で試せる UI を Jupyter Notebook で」作ります。

準備

準備したものを、以下にサクッと簡単にまとめます。

  • Docker 環境
  • Jupyter 環境を用意する
  • pip install openai もしておく
  • OpenAI の API Key を発行する
  • ChatGPT Plus を契約(この記事では ChatGPT-4 を使うため)

まずは考える

ここでいきなり ChatGPT に投げたほうが人間を辞め易いのでしょうが、まだその境地まで至れていないので、まずは頭の中でボヤッとどんな感じにするかを考えます。

  • Voice をプルダウンで選択
  • テキストを入力する
  • その他パラメータがあれば入力できるようにしておく
  • submit ボタンを押すと API にリクエストを投げる
  • 帰ってきた音声データをプレイヤーにロードして表示

これでいけそうだけど、ipywidgets とか何年も触ってないので、その辺は ChatGPT に聞きます。

ロジックと言えるロジックは API へのリクエストと音声データのロード部分なので、まずはそこをやっていきます。

TTS のサンプルを見ても、response.stream_to_file("output.mp3") みたいなのばっかりですが、ファイルには保存せずに直接プレイヤーにロードしたいので、まずはそのためにレスポンスの正体を見ていきます。

import os

from openai import OpenAI

os.environ["OPENAI_API_KEY"] = "sk-..."

client = OpenAI()

response = client.audio.speech.create(
    model="tts-1",
    input="こんにちは",
    voice="alloy",
)

で実行して、response を見てみる。

>>> type(reseponse)
openai._base_client.HttpxBinaryResponseContent

なるほどなるほど。よくわからないので ChatGPT さんに聞いてみる。

これで再生できなかったので、その原因を聞いてみたところ seek(0) してないかもということで、やってみたら再生できた。

あとはパラメータ設定用のウィジェットを作っていって、配置すれば良いはず。

音声再生速度は HTML を埋め込まないとプレイヤー側では制御できないようで気に入らなかったので、OpenAI API の speed で制御することにする。

速度制御用のスライダー。

引数の意味も答えてくれる。

イベントハンドラーについて聞く。

ここまでできたので、適当にウィジェットの配置を考えて、こんな感じの画像にして、、、

投げた。

結果的に帰ってきたのは widgets.VBox([text, voice, speed, button, audio]) だったので、あんまり聞く必要はなかったかも。。。

レイアウトだけは何とかして欲しいので質問する。「各ウィジェットを中央に寄せられますか?」に対しては、

# VBoxを使ってウィジェットを中央に配置
box_layout = widgets.Layout(display='flex',
                            flex_flow='column',
                            align_items='center',  # 中央揃え
                            width='100%')

# ウィジェットをVBoxにまとめる
box = widgets.VBox([text, voice, speed, button], layout=box_layout)

と、いい感じに返してくれました。

最後に自分好みにコードを整形して、できたのがこちら。

想像通りのものができた!コードは記事の最後に掲載します。

個人的には "echo" の声が好きでした。

ということで、今回は開発というよりは実験・検証的な物作りでしたが、OpenAI の TTS を試す Jupyter Notebook を書いてみました。

こんな感じで、はじめは小さく、けど徐々にそれなりの規模を作っていければいいと思っています。

↓出来上がったコード↓