コミュニティ主導の無料AIツール、TTS、Twitch配信者向けAPI
コミュニティ主導の無料AIツール、TTS、Twitch配信者向けAPI

Streamer.bot でカスタムスクリプトを使って AI 画像を生成する方法

Streamer.bot 内で直接、カスタム Execute Code スクリプトを追加するだけで、Twitch 配信向けの無料AI画像を生成する方法を学びます。サードパーティ製ミドルウェアは不要です。
このページは、利便性のために、私たちのやる気に満ちたAIインターンが英語から翻訳しました。まだ学習中のため、いくつか誤りがあるかもしれません。最も正確な情報については、英語版をご覧ください。
使い方ガイド Streamer.bot でカスタムスクリプトを使って AI 画像を生成する方法

PotatoHotDog は、サードパーティ製のミドルウェアを必要とせず、Streamer.bot から直接呼び出せる無料の AI画像生成 API を提供しています。このガイドでは、テキストプロンプトから AI 画像を生成し、それをディスクにダウンロードするための、小さなカスタム C# スクリプトを Streamer.bot の Execute Code サブアクションに追加する方法を紹介します。

このスクリプトには、PotatoHotDog APIキーと、生成したい画像を説明するプロンプトだけが必要です。ダウンロードした画像は、Streamer.bot のインストールディレクトリ内の専用フォルダに保存されます。

APIキーを用意する

もしすでにお持ちでない場合は、ダッシュボードから API キーを生成して準備しておいてください。次のステップで必要になります。

APIキー一覧へ PotatoHotDog ダッシュボードで APIキーを発行する

前提となる引数

AI画像を生成するには、Execute Code のサブアクションが実行される前に、Streamer.bot で2つの引数を指定しておく必要があります。言い換えれば、これらの2つを指定する必要があります:

  • APIキー。
  • 生成したい画像を説明するプロンプトの指示です。

これらは以下の Streamer.bot の引数に対応します。

  • potatoKey
  • potatoInstructions

アクション内で引数を指定するには、Sub Actions を右クリックして、Add、Core、Arguments を順に選択し、最後に Set Argument を選択します。

Streamer.bot で Set Argument サブアクションを追加

Streamer.bot で Execute Code アクションを追加する

Streamer.bot を開き、Actions タブに移動します。新しいアクションを作成するか、既存のアクションを開き、後で識別できる名前を付けてください。たとえば "PotatoHotDog AI Image" のように。

アクションを選択した状態で、サブアクションの下にある Add をクリックし、次に Core を選択してから Execute C# Code を選びます。これにより、Streamer.bot がその場でコンパイルして実行する生の C# コードを貼り付けられるサブアクションが追加されます。

Streamer.bot で C# コードを実行するサブアクションを追加

以下のスクリプトをコードエディタに貼り付けてください。 このスクリプトは potatoKey と potatoInstructions の引数を読み取り、私たちの Generate AI Image API を呼び出して画像を生成し、その URL を取得します。そして、生成された画像を Streamer.bot のインストールディレクトリ内にある temp_potatohotdog_images というフォルダへダウンロードします。

using System; using System.IO; using System.Net.Http; using Newtonsoft.Json.Linq; public class CPHInline { // Tracks the version of this script for troubleshooting and support. private const string VERSION = "1.0.0"; // Base URL for the endpoint that generates an AI image. private const string BASE_URL_GENERATE = "https://api-generate-image-v1.potatohotdog.com/"; // Tracks the next numbered log argument. private int logIndex = 0; // Reuses one HTTP client for all API requests. private static readonly HttpClient httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; // Adds a log message as a numbered action argument. private void Log(string message) { // Stores the message under a numbered key. CPH.SetArgument($"potatoLog{logIndex}", message); // Advances the log index for the next message. logIndex++; // Keeps the total log count in sync. CPH.SetArgument("potatoLogCount", logIndex); } // Ensures a required action argument exists and is not empty. private bool RequireArgument(string name, out string value) { // Fails when the argument is missing or blank. if (!CPH.TryGetArg(name, out value) || string.IsNullOrWhiteSpace(value)) { value = ""; return false; } return true; } // URL-encodes a value so it can safely be used in a query string. private string EncodeUrlValue(string value) { // Escapes reserved characters for safe use in a URL. return Uri.EscapeDataString(value); } // Performs an HTTP GET request and returns the response body. private string HttpGet(string url) { try { Log($"GET {url}"); // Sends the HTTP request synchronously. HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult(); // Reads the complete response body. string responseBody = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); Log($"HTTP status: {(int)response.StatusCode} {response.ReasonPhrase}"); // Stops when the server returns an unsuccessful status code. if (!response.IsSuccessStatusCode) { Log($"Error: HTTP request failed with status {(int)response.StatusCode} {response.ReasonPhrase}."); // Logs the server error response when available. if (!string.IsNullOrWhiteSpace(responseBody)) { Log($"Error response: {responseBody}"); } return null; } Log($"Received {responseBody.Length} characters."); return responseBody; } catch (Exception exception) { // Logs network, timeout, and other HTTP-related exceptions. Log($"Error: HTTP request failed: {exception.Message}"); return null; } } // Downloads a file from a URL and saves it to disk. private bool DownloadFile(string url, string destinationPath) { try { Log($"Downloading image from \"{url}\"."); Log($"Saving image to \"{destinationPath}\"."); // Sends the image download request. HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult(); Log($"Image download HTTP status: {(int)response.StatusCode} {response.ReasonPhrase}"); // Reads the complete image response into memory. byte[] fileData = response.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult(); // Stops when the image server returns an unsuccessful status. if (!response.IsSuccessStatusCode) { Log($"Error: Image download failed with status {(int)response.StatusCode} {response.ReasonPhrase}."); return false; } // Rejects an empty image response. if (fileData == null || fileData.Length == 0) { Log("Error: The downloaded image file is empty."); return false; } // Writes the downloaded image bytes to the destination file. File.WriteAllBytes(destinationPath, fileData); Log($"Downloaded {fileData.Length} image bytes."); // Confirms that the image file now exists on disk. if (!File.Exists(destinationPath)) { Log("Error: The image download completed, but the file does not exist on disk."); return false; } // Reports the final file size from disk. FileInfo fileInfo = new FileInfo(destinationPath); Log($"Image file saved successfully. File size: {fileInfo.Length} bytes."); return true; } catch (Exception exception) { // Logs download, filesystem, and permission errors. Log($"Error: Could not download the image file: {exception.Message}"); return false; } } // Extracts a required string value from a JSON response. private bool TryGetJsonString(string json, string propertyName, out string value) { value = ""; try { // Parses the response body as a JSON object. JObject jsonObject = JObject.Parse(json); // Retrieves the requested JSON property. JToken property = jsonObject[propertyName]; if (property == null) { Log($"Error: JSON response does not contain \"{propertyName}\"."); return false; } value = property.ToString(); // Rejects empty JSON string values. if (string.IsNullOrWhiteSpace(value)) { Log($"Error: JSON property \"{propertyName}\" is empty."); value = ""; return false; } return true; } catch (Exception exception) { // Logs malformed JSON and property conversion errors. Log($"Error: Could not parse JSON property \"{propertyName}\": {exception.Message}"); return false; } } // Creates and returns the dedicated PotatoImage folder. private string GetImageFolder() { // Uses Streamer.bot's application directory instead of the process working directory. string streamerBotFolder = AppDomain.CurrentDomain.BaseDirectory; // Places generated image files inside a dedicated subfolder. string imageFolder = Path.Combine(streamerBotFolder, "temp_potatohotdog_images"); Log($"Streamer.bot folder: \"{streamerBotFolder}\"."); Log($"Image folder: \"{imageFolder}\"."); // Creates the image folder if it does not already exist. if (!Directory.Exists(imageFolder)) { Log("Image folder does not exist. Creating it..."); Directory.CreateDirectory(imageFolder); Log("Image folder created."); } else { Log("Image folder already exists."); } return imageFolder; } // Runs the main PotatoHotdog AI image action. public bool Execute() { // Resets log numbering for this execution. logIndex = 0; CPH.SetArgument("potatoLogCount", 0); Log("Starting script..."); // Logs the script version so runs can be tracked over time. Log($"Version: {VERSION}"); // Retrieves the PotatoHotdog API key. if (!RequireArgument("potatoKey", out string potatoKey)) { Log("Error: potatoKey variable is missing. Please login to potatohotdog.com, generate an API key, create a set variable action and save the variable \"potatoKey\" with your key."); return false; } // Retrieves the prompt instructions describing the image to generate. if (!RequireArgument("potatoInstructions", out string potatoInstructions)) { Log("Error: potatoInstructions variable is missing. Create a set variable action and save the variable \"potatoInstructions\" with a description of the image you want generated."); return false; } // Logs the non-secret input values. Log("potatoKey was provided."); Log($"potatoInstructions=\"{potatoInstructions}\""); // Builds the API URL used to generate the AI image. string generateUrl = BASE_URL_GENERATE + "?key=" + EncodeUrlValue(potatoKey) + "&instructions=" + EncodeUrlValue(potatoInstructions); // Requests generation of the AI image. string generateJson = HttpGet(generateUrl); if (generateJson == null) { Log("Error: Failed to generate the AI image."); return false; } Log($"Generate response: {generateJson}"); // Extracts the generated item's ID, reused below as the local filename. if (!TryGetJsonString(generateJson, "itemID", out string itemID)) { Log("Error: Could not retrieve itemID from the generate response."); return false; } Log($"itemID=\"{itemID}\""); // Logs the generation duration when present, purely for troubleshooting. if (TryGetJsonString(generateJson, "duration", out string duration)) { Log($"duration={duration} second(s)"); } // Extracts the generated image URL from the response. if (!TryGetJsonString(generateJson, "imageURL", out string imageURL)) { Log("Error: Could not retrieve imageURL from the generate response."); return false; } Log($"imageURL=\"{imageURL}\""); string imageFolder; try { // Resolves and creates the dedicated PotatoImage directory. imageFolder = GetImageFolder(); } catch (Exception exception) { Log($"Error: Could not create or access the image folder: {exception.Message}"); return false; } // Reuses the item's own ID as the local filename instead of minting a new one. string imageFileName = $"{itemID}.png"; // Combines the image folder and unique filename. string imageFilePath = Path.Combine(imageFolder, imageFileName); Log($"Generated image filename: \"{imageFileName}\"."); Log($"Local image path: \"{imageFilePath}\"."); // Downloads the generated image file to the PotatoImage folder. if (!DownloadFile(imageURL, imageFilePath)) { Log("Error: Failed to download the generated AI image."); return false; } // Stores the remote image URL as a final action argument. CPH.SetArgument("potatoGeneratedImageURL", imageURL); // Stores the absolute local file path as a final action argument. CPH.SetArgument("potatoGeneratedImageFile", imageFilePath); Log($"potatoGeneratedImageURL=\"{imageURL}\""); Log($"potatoGeneratedImageFile=\"{imageFilePath}\""); Log("Finished."); return true; } }

スクリプトを貼り付けたら、Find Refs と Compile をクリックして、正常にコンパイルされることを確認してください。アクションを保存し、その後手動でトリガーするか、コマンドまたはチャンネルポイント報酬に紐づけて、画像が正しく生成されるかをテストします。

スクリプトを貼り付けて、Streamer.bot でコンパイルしてください。

ダウンロードした画像を確認する

アクションが実行されたら、アクション履歴を通じてアクション変数を確認し、すべてが期待どおりに動作したことを確認できます。

ここには、生成された画像がディスクに保存されたローカルパスが表示されます。パスは、あなたの Streamer.bot インストールディレクトリ内の temp_potatohotdog_images フォルダにあります。

アクション履歴で生成された画像の変数を確認する

ダウンロードした画像を直接表示するには、そのフォルダーを開いてください。

Streamer.bot のアクション履歴からアクション変数を確認する

トラブルシューティング

スクリプトが期待通りに動作しない場合、トラブルシューティングの最善の方法はアクションログを確認することです。

アクション履歴からアクション変数を確認することで、これを実行できます。

Streamer.bot のアクション履歴からアクション変数を確認する

このガイドは初出が2026-07-19で、最終更新は2026-07-19です。

ほかの類似ガイド

ほかにも、役に立つ使い方ガイドをいくつかご紹介します。

Streamer.botをAIに接続する方法
Streamer.botをAIに接続する方法
Streamer.bot で Fetch URL サブアクションと PotatoHotDog Generate AI Response API を使って、Twitch 配信の無料 AI(LLM)レスポンスを生成する方法を学びましょう。カスタムスクリプトは不要です。
ガイドを読む
Streamer.bot で 動的ブラウザソースを使って 無料の TTS 音声を再生する方法
Streamer.bot で 動的ブラウザソースを使って 無料の TTS 音声を再生する方法
Streamer.bot を使って、Dynamic Browser Source とシンプルな Fetch URL webhook リクエストを活用し、カスタムスクリプト不要で、あなたの Twitch 配信向けの無料 AI TTS(Text-to-Speech)音声を再生する方法を学びましょう。
ガイドを読む
Streamer.botでカスタムスクリプトを使って無料のTTS音声を再生する方法
Streamer.botでカスタムスクリプトを使って無料のTTS音声を再生する方法
Streamer.bot 内部で直接、カスタムの Execute Code スクリプトを追加することで、Twitch 配信用の無料 AI TTS(テキスト読み上げ)音声を再生する方法を学びます。Speaker.bot は不要です。
ガイドを読む