AITuberKitを、IBM Cloud Code Engineで動かすまで

# この記事について
この記事は、[ニケさん](https://x.com/tegnike)が、開発および公開されている『[AITuberKit](https://github.com/tegnike/aituber-kit/)』を、Dockerfileを用いてコンテナをビルドし、IBM Cloud Code Engineで動かすまでに行ったことをまとめたものになります。

## IBM Cloud Conde Engineで、AITuberKitを動かした様子
URLを見ると、codeengine.appdomain.cloudが含まれており、IBM Cloud Code Engine上で動いていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/985cd06e-c84f-15e4-076e-39432af679d2.png)

この記事で、OpenAIのAPI Keyを、IBM Cloud Code Engineの「Environment Variables」タブに環境変数を記述することで、AITuberKitに認識させています。

# IBM Cloud Code Engineを使う理由
IBM Cloud Code Engineを使うことで、インターネットで公開するためのドメインやSSL/TLSサーバ証明書が自動で付与されるとともに、自動スケール機能があるため、ゲームや今回のようなアプリケーションに向いています。

# AITuberKitとは
[ニケちゃん](https://x.com/tegnike)さんが、開発および公開されている『[AITuberKit](https://github.com/tegnike/aituber-kit/)』は、個人利用や教育目的、非営利利用では無償利用のソフトウェアです。ビジネスでの利用は有償になりますので、詳しくは[ライセンス](https://github.com/tegnike/aituber-kit/blob/main/docs/license.md)をご確認ください。
AITuberKitを使うことで、YouTubeやZoomなどで配信することでAITuber/AIライバーになることができます。また自分用のパソコン内で動かすことで、プライベートな家庭教師や、友人や家族に話すことが難しい内容を話せる相談相手として使うことができます。

## 相談相手として利用する場合の注意点
LLM（大規模言語モデル）に質問し、その返答を音声で読みあげます。人間と違い、どのような質問をしても否定されることはないので、頼れる相棒として、また良き隣人として精神的に依存しやすいことが考えられます。実際に運用してみたところでは、利用しすぎには注意する必要があります。

# 作業環境の準備
Docker Desktop、もしくはDocker互換環境を用意してください。
Macを使っている方は、OrbStackでも良いでしょう。

## Docker Hubのアカウント取得
https://hub.docker.com/ にアクセスします。「Sing Up」をクリックしてユーザー登録を行い、Docker Hubユーザー名を取得します。ここでは、workuser1 とします。各自のアカウント名に読み替えてください。

# コンテナのビルド
Githubのリポジトリからダウンロードし、コンテナイメージをつくるべくビルドの作業を行います。
Githubのリポジトリからダウンロードしたファイルに「Dockerfile」が含まれているので、それを使います。
```
git clone https://github.com/tegnike/aituber-kit.git
cd aituber-kit
docker build -t workuser1/aituber-kit .
```
ビルド結果を確認するために、コンテナイメージを確認します。
```
docker images
```
実行結果
```
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
workuser1/aituber-kit   latest    51acc348c396   2 minutes ago   2.69GB
```
 - workuser1 は、Docker Hubのユーザー名なので、各自で読み替えてください。
 - IMAGE IDは、ビルド毎かつ各自で異なる値になります。自分の環境で確認してください。
 - TAGは特に指定しなければ、最新のものを示す、latest になります。
 - SIZEが、GB単位なのでIBM Cloudのコンテナレジストリの無料枠の対象外のため、Docker Hubにビルドしたコンテナをアップロードします。

# コンテナイメージをアップロード
Docker Hubsにビルドしたコンテナイメージをアップロードします。
## Docker Hubにログイン
次のコマンドを実行します。workuser1 は、Docker Hubのユーザー名なので、各自で読み替えてください。
```
docker login --username workuser1
```
passwordの入力が求められるので、入力し、Enterキーを押します。
ログインできると、次のように表示されます。
```
Login Succeeded
```
## コンテナイメージのアップロード
ビルド済みのコンテナイメージを、Docker Hubにアップロードします。次のコマンドを実行します。workuser1 は、Docker Hubのユーザー名なので、各自で読み替えてください。
```
docker push workuser1/aituber-kit:latest
```
実行結果として、次のように表示されます。
```
The push refers to repository [docker.io/workuser1/aituber-kit]
8e46b7249092: Pushed
b62eec8b9be7: Pushed
99b7d6775038: Pushed
e9597bc1831b: Pushed
259c3c29c17c: Pushed
7df03414f5a4: Mounted from library/node
c8f2469bd408: Mounted from library/node
393a1f3c1d17: Mounted from library/node
cb4ea2995b11: Mounted from library/node
96d99c63b722: Mounted from library/node
00547dd240c4: Mounted from library/node
b6ca42156b9f: Mounted from library/node
24b5ce0f1e07: Mounted from library/node
latest: digest: sha256:f6dbee97812773f7b9e6845bbe69548a9dd0bc4a33c2b62f03cae9f432a23a42 size: 3056
```

docker.io/workuser1/aituber-kit と書かれた部分をあとで使います。workuser1 は、Docker Hubのユーザー名なので、各自で読み替えてください。

# IBM Cloud Code Engineで動かす
[IBM Cloud Code Engine](https://cloud.ibm.com/containers/serverless/overview)にアクセスします。画面内の「Start Creating」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/225f70da-a4d4-8982-1eca-0677ee3103a0.png)

## Start Creating 画面
「Start Creating」画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/e56ab59f-2242-4b66-5642-49706911088a.png)

### プロジェクトの作成
「Start Creating」画面で、「Create project +」をクリックします。Code Engineで稼働するコンテストベースのアプリケーションを管理するフォルダのようなものが、プロジェクトです。
画面内で、プロジェクト名を入力し、「Create」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/46b588a7-590a-ecb2-c857-797752cdf025.png)

### Generalの設定
下図のように、「Application」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/e56ab59f-2242-4b66-5642-49706911088a.png)

### Codeの設定
Docker Hubにアップロード済みのコンテナイメージを使用するので、「Use an existing container image」を選びます。
「Image reference」の欄には、先ほど確認した「docker.io/workuser1/aituber-kit」を入力します。workuser1 は、Docker Hubのユーザー名なので、各自で読み替えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/e749b05f-f0fc-bec6-42c9-9db47eb00705.png)

### Resources & scaling の設定
#### Instance resources の設定
アプリケーションに割り当てる仮想CPUとメモリ、一時的に使用するストレージサイズを設定することができます。ストレージサイズは、標準で0.4GBです。
AITuberKitの利用には、0.5 vCPU/2GB でも動きますが、より安定して動かすには、1.0 vCPU/2GB 以上が望ましいです。
#### Autoscaling -instance scaling range の設定
負荷増大時にスケールする範囲を選ぶことができます。
アプリケーションとして起動したコンテナを「Instance」と言います。今回は、「Min number of instances」を0とし、「Max number of instances」を1としました。本番運用では、「Max number of instances」を2以上とした方が良いでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/86d4597a-06e2-7a74-9846-f7a9cad7f855.png)

各種設定を確認後、画面右側の「Create」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/d1c672de-f5bd-e47f-b15b-ef82817e3af6.png)

## Instanceの起動
アプリケーションが作成され、指定したコンテナイメージをもとにコンテナが起動します。下図のように「Ready」と表示されるまで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/7b4d127d-4b19-e643-dced-0f5273dc7961.png)

## 環境変数の設定
AITuberKitにおける環境変数は、OpenAIのAPIキーなどがあります。設定可能な環境変数は、Gitリポジトリからダウンロードしたファイルのうち、「.env」ファイルをご覧ください。
この記事では、「OPENAI_KEY」と「OPENAI_TTS_KEY」の２つの値を設定します。

「Configuration」タブをクリックします。
「Environment variables」タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/9d693a01-0d8d-89a8-3c26-7b7f97eecde4.png)

「Add environment variable +」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/5ca216dd-bedc-e969-8775-efa4a24d1543.png)

下図のように「OPENAI_KEY」と「OPENAI_TTS_KEY」の２つの環境変数（environment variable）を登録します。「Value」に入れる値は、どちらも、OpenAPIのAPIキーの値になります。OpenAPIのAPIキーは、[こちら](https://platform.openai.com/settings/organization/api-keys)から取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/89b93813-babb-5db0-8af1-79356b66cdda.png)

どちらも登録時に「Create」をクリックします。
また、「Deploy changes as revision」が表示されるので、「Deploy」をクリックすることを忘れないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/f0bdb169-faaa-4600-4be5-bb47012a5f00.png)

「Environment variables」タブ下に、「OPENAI_KEY」と「OPENAI_TTS_KEY」の２つの環境変数（environment variable）が登録されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/4f5e3867-d772-a238-341e-163b08b0410b.png)

## 動作確認
画面右上に表示されている「Test application」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/7f2991c9-463d-8930-8c43-8fdcc4a74dac.png)

「Test application」と表示されるので、「Application URL」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/6c0bc2cb-9664-3fbe-e3cd-48d836eb5ce0.png)

AITuberKitの標準の状態が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/a156e167-06d0-6b29-479e-13246fe48200.png)

表示されたメッセージを読み、「CLOSE」をクリックします。標準のAIキャラクター（AIアバター）が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/d6c4ad4d-2078-be78-7b4d-9119573fd774.png)

この状態で、IBM Code Engine側の設定で、「OPENAI_KEY」と「OPENAI_TTS_KEY」の２つの環境変数（environment variable）が「AI設定」と「音声設定」の「APIキー」として登録済みなので、日本語で質問をすれば、OpenAI製LLMの「gpt4o」が回答を生成し、音声読み上げで話してくれます。

AIキャラクター（アバター、VRMファイル）の変更や背景画像、画面の日本語化、LLMの変更など各種設定は、画面左上の歯車のアイコンをクリックすることで変更ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/5c73424b-7b2a-112f-7cfe-d388a814cbe8.png)

実際に変更すると、冒頭のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/985cd06e-c84f-15e4-076e-39432af679d2.png)

「AI設定」と「音声設定」の「APIキー」である各環境変数の設定は、「OPENAI_KEY」と「OPENAI_TTS_KEY」で行ったように、IBM Cloud Code Engine側で制御しましょう。

# ここから拡張するには
「AI設定」で、ollamaを指定することができるので、別サーバーでollama経由で、好みのLLMを使うことができる。たとえば、著名なLLMでは、日本語LLMの「Llama 3 ELYZA JP 8B」や、エンタープライズ向けに多言語対応かつ著作権問題を回避しているIBMのLLMである「Granite3.0（granite3-moeやgranite3-dense）」などがある。
また、生成AIアプリケーション開発フレームワークである「Dify」と連携することもできるので、拡張範囲が広い。

# まとめ
大学や高校で、生成AIの活用例として使っていただくと好評なAITuberKitを触れてもらいやすくする際に、インターネットで公開するためのドメインやSSL/TLSサーバ証明書が必要になるので、手軽な方法としてIBM Cloud Code Engineを使って動作させる方法について記述した。
メタバース内のアバターと連動させたAIアバターは、VRヘッドセットを使うことで高い没入感が得られるが準備が少々手間なので、手軽に使いたい場合はAITuberKitの方が向いている。