【ChatGPT×CRI Atom Craft】AIにロボットスクリプトを書かせたい!

こんにちは。開発の宮下です。

対話型のAIがアツい今日このごろですが、鉄は熱いうちに……ということで、今回はOpenAIのAPIを使用してCRI Atom Craft ロボットのスクリプトを書いてもらいます。

ロボットAPIはCRI Atom Craftの操作を自動化することが出来る機能です。
しかし、Pythonを使用してスクリプトを記述しなければならないため、プログラミングが苦手だとどうしても障壁が高くなってしまいます。

Pythonの文法に精通しているであろうchatGPTならその障壁も取っ払ってくれるはず!
ついでにCRI Atom Craftに組み込めば直ぐに動作も確認できて万々歳!

なにはともあれ、まずは検証としてchatGPTにロボットAPIを使用したスクリプトを書いてもらいます。

どうやら存じ上げないようです。CRI Atom Craft ロボットは物理的なロボットではありません。

ロボットAPIを覚えさせる

学習範囲に含まれていないのかは分かりませんが、ただchatGPTに訊いただけではロボットAPIを知らない体で回答されることが分かりました。
そこで別の手法としてOpenAI APIを使用し、ロボットAPIを使用したスクリプトを書いてもらえるようにAIに指示をしています。

OpenAI APIには”system”という、AIの振る舞いを指定できる項目があるため、ここにロボットAPIの内容を書き込みます。

以下の条件に従って、ロールプレイをします。
あなたはCRI Atom CraftのロボットAPIを使用したPythonスクリプトを作成するチャットボットです。

CRI Atom Craftで使用するオブジェクトは木構造で連結されます。オブジェクトの生成の際は親オブジェクトが必要になります。

CRI Atom Craftで使用するオブジェクトにはタイプが割り当てられています。以下はそれらのタイプの名称と内部で使用する識別文字の一例です。

ワークユニット : WorkUnit
キューシートルートフォルダー : CueSheetRootFolder
キューシートフォルダー : CueSheetFolder
キューシート : CueSheet
キューフォルダー : CueFolder
キュー : Cue
ループマーカー : LoopMarker
シーケンス開始マーカー : StartMarker
シーケンス停止マーカー : EndMarker
コールバックマーカー : CallbackMarker
トラック : Track
ウェーブフォームリージョン : WaveformRegion
マテリアル : Material
ユーザーがこのリストに無いタイプを指定した場合、英訳して入力してください。

APIが提供する全ての関数の関数の戻り値は、常に下記の連想配列が返されます。
result[“succeed”]成功した場合は True, 失敗した場合は False.
get,findといったデータを取得する関数は、連想配列内にresult[“data”]が含まれます。
result[“data”]にはオブジェクトやリスト、オブジェクトが持つ値(文字列)といった内容が格納されています。内容は関数ごとに異なります。データを取得する関数は[“data”]が必須です。

プロジェクトに関する操作には下記のモジュールをインポートします。
cri.atomcraft.project
以降はcri.atomcraft.projectを使用した関数の説明です。

create_object(parent_object, object_type, object_name) はオブジェクトを作成する関数です。

find_object(search_root, object_type, object_name) はオブジェクトを検索して取得する関数です。
第一引数はNoneを指定可能です。Noneを指定した場合、プロジェクト全体を検索します。
第三引数は省略可能です。省略した場合、第二引数のオブジェクトのタイプと一致するオブジェクトを取得します。

色々書いていますが、ざっくり3つの項目に分けられます。

  1. CRI Atom Craftでのデータの表現方法
  2. オブジェクトの種類
  3. 関数の説明

この文章をsystemに指定して、Playgroundで実行してみた結果はこちらです。

画像だと少し見づらいので結果を以下に引用します。

以下は、親オブジェクトを指定してキューを作成するスクリプト例です。


import cri.atomcraft.project as project

# 親オブジェクトを取得する
parent = project.find_object(None, “WorkUnit”, “親オブジェクトの名前”)[“data”]

# キューを作成する
result = project.create_object(parent, “Cue”, “キューの名前”)

if result[“succeed”]:
print(“キューを作成しました。”)
else:
print(“キューの作成に失敗しました。”)

上記の例では、親オブジェクトの名前が「親オブジェクトの名前」であるオブジェクトを検索して、
そのオブジェクトの下に新しいキューオブジェクトを作成しています。

注意点として、親オブジェクトが検索できなかった場合や、す

実行できるかは怪しいですが、内容はロボットAPIを使用したものになっています!
後はsystemに指定する文章を追記していけば、ロボットAPIの他の関数も使用して書いてくれそうです。

CRI Atom Craftに組み込んでみる

次に、CRI Atom CraftからOpenAI APIを呼び出すUIを作成して、chatGPTっぽいものを作ってみます。

テキストを送信する際に、先程説明したAPIの説明文を一緒に送っています。
実際に動作している画面はこちらです。
※動画内でsystemに指定している文章は上記よりも更に手を加えているため、説明されていないAPIも出力されています。

実際に書いてくれたコードはこちらです。

import cri.atomcraft.project as proj
import cri.atomcraft.preview as prev
import cri.atomcraft.view as view

# 検索するキューシートの名前
cue_sheet_name = "MyCueSheet"

# 検索するキューの種類
cue_type = "Cue"

# 検索するパラメーター名
parameter_name = "Volume"

# ボリュームの閾値
threshold = 0.5

# キューシートを取得する
cue_sheet = proj.find_object(None, "CueSheet", cue_sheet_name)["data"]

# キューを検索する
cue_list = proj.find_objects(cue_sheet, cue_type)

# ボリューム値が閾値以下のキューを検索する
result_list = []
for cue in cue_list:
    volume = float(proj.get_value(cue, parameter_name)["data"])
    if volume <= threshold:
        result_list.append(cue)

# 検索結果を表示する
if len(result_list) > 0:
    view.log("ボリューム値が{0}以下のキューが{1}個見つかりました。".format(threshold, len(result_list)))
    for cue in result_list:
        view.log("{0} : ボリューム値 {1}".format(cue.Name, proj.get_value(cue, parameter_name)["data"]))
else:
    view.log("ボリューム値が{0}以下のキューは見つかりませんでした。".format(threshold))

なお、正しく動くコードを書いてくれるかは現状運任せです。体感では10回に1回正しく動くコードを書いてくれます。
正答率をどう上げるかが目下の課題です。

まとめ

今回はOpenAI APIを使用して、CRI Atom CraftのロボットAPIを使用したPythonスクリプトを書かせてみました。
ロボットAPIの内容を覚えさせることで、対話による指定で複雑なスクリプトを組んでくれます。

現状、この機能は開発途中なので提供はされていません。
正答率以外にも機密情報の取り扱いといった課題はまだまだありますが、是非とも公開まで持っていきたい機能です。

ゆくゆくはロボットAPIだけではなく、文章の指示でCRI Atom Craftの直接操作を行えるかも試してみたい……!
面白いと思って頂けたら、シェアして頂けると嬉しいです!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です