speech について
Drawcall Speech はテキストを再生可能な音声に変換し、アプリに音声を追加する開発者向けです。声の選択と任意の読み方指定を分け、同じリクエストの音声をキャッシュします。
主な機能
- 01テキストから音声 URL を生成
- 02名前付きボイスの選択
- 03任意の読み方指定
- 04テキスト内の演技指示
- 05同一リクエストのキャッシュ
活用シーン
- 01ゲームの NPC のセリフ追加
- 02ナレーションやチュートリアル音声の作成
- 03アクセシビリティ読み上げの提供
- 04UI 音声メッセージの再生
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ drawcall-ai/ speech --skill speechインストール後、Claude Code で/speechを入力して読み込まれたか確認します。
詳細
音声
NPC のセリフ、ナレーション、チュートリアル音声、アクセシビリティ向けの読み上げ、UI の音声セリフには Drawcall Speech を使用します。テキストを、アプリで読み込んで再生できる音声クリップの URL に変換します。
エンドポイント
Drawcall Speech はテキストを音声 URL に変換します。
GET https://v1.speech.drawcall.ai/?text=Hello+world&voice=Zephyr
text:必須。URL エンコード済みで、前後の空白を削除した最大 1000 文字のテキストです。style:任意。URL エンコード済みで、前後の空白を削除した最大 1000 文字のテキストです。口調、感情、アクセント、話す速さ、間などの読み上げ指示に使用します。voice:任意。デフォルトはZephyrです。- 未知の音声名も
Zephyrにフォールバックします。キャラクターの役割や読み上げに関する補足はstyleに記述してください。 - レスポンス:音声ファイル。通常は
audio/wavです。 - キャッシュ:生成されたクリップはテキスト、スタイル、音声でキャッシュされます。繰り返し再生する場合は、同一の URL を再利用してください。
- エラー:入力が無効な場合はプレーンテキストの
400、生成に失敗した場合は502です。
スタイル
一般的なセリフには text と voice を使用します。セリフ全体やクリップ全体に幅広い読み上げ指示が必要な場合にのみ、style を追加してください。これは一般的な TTS の形式に沿っており、読み上げるテキストと音声の選択は分け、読み上げ方の制御は任意としています。style は Drawcall Speech が公開している自然言語による読み上げ指示の名称です。普遍的な TTS 標準ではなく、利便性のための名称ですが、モデルのプロンプトの仕組みを意識させずに Gemini のスタイルプロンプトや Azure 形式の SSML の命名規則とうまく対応します。
読み上げる言葉は text に記述します。セリフ全体に口調、感情、アクセント、話す速さ、間の指示が必要な場合は、セリフ単位の読み上げメモを style に記述してください。制御が特定の単語や拍に限られる場合は、通常、text にインラインの演技指示を記述すれば十分で、別途 style を指定する必要はありません。スタイルによる制御はサンプル単位で正確なタイミングを保証するものではなく、最善努力の範囲です。正確なタイミングが必要な場合は、事前に音声を生成して編集してください。
適切なスタイル値の例:
Say warmly and excitedly, with a long pause after the first sentence.Read this as a spooky whisper, slowly, with a nervous laugh near the end.Use a calm British narrator tone and leave a short pause between clauses.
特定の箇所で読み上げ方を変える場合は、text にインラインの演技指示を記述する方法が適しています。[pause]、[long pause]、[whispers]、[shouting]、[happy]、[sad]、[laughs]、[very slow] など、角括弧で囲んだ指示を使用してください。このサービスでは、角括弧で囲んだ指示を読み上げる言葉ではなく演技メモとして扱うようモデルに指示しますが、動作はモデルに依存します。全体的な指示は style に、タイミングを指定する指示や局所的な切り替えは text に記述してください。
GET https://v1.speech.drawcall.ai/?text=Hello+from+Drawcall.+Now+we+continue.&voice=Puck&style=Say+warmly+and+excitedly,+with+a+long+dramatic+pause+after+the+first+sentence.
GET https://v1.speech.drawcall.ai/?text=[whispers]+I+found+it.+[long+pause]+[shouting]+Run+now!&voice=Puck&style=Start+tense,+then+turn+urgent.
初回リクエストの遅延
特定の text、style、voice の組み合わせが初めてリクエストされると、エンドポイントはクリップを生成してから配信する必要があります。この短い遅延により、テストで即時再生、アニメーションとの同期、または決定論的なタイミングを期待している場合、アプリ内の動作に問題が生じる可能性があります。
問題になる場合は、テストの前に必要な各セリフ、スタイル、音声についてエンドポイントを一度ずつ呼び出し、キャッシュをウォームアップしてください。同じ URL への後続のリクエストはキャッシュされ、即座に返されるはずです。
より厳密に制御するには、音声ファイルをダウンロードしてローカルに保存し、アプリから配信してください。セリフのテキストを 1 つのソースファイルにまとめたまま、すべてのセリフを事前にダウンロードする小さな音声スクリプトを用意する方法は、その中間的な選択肢として適しています。セリフを変更しても、ソースの変更は 1 か所だけで済みます。
例
HTML オーディオ:
<audio
controls
src="https://v1.speech.drawcall.ai/?text=Welcome+to+Drawcall&voice=Zephyr"
></audio>
Three.js のポジショナルオーディオ:
import * as THREE from "three";
const listener = new THREE.AudioListener();
camera.add(listener);
const speaker = new THREE.Object3D();
speaker.position.set(2, 1.5, -3);
scene.add(speaker);
const audio = new THREE.PositionalAudio(listener);
audio.setRefDistance(2);
audio.setRolloffFactor(1.5);
speaker.add(audio);
const text = encodeURIComponent("I am speaking from over here.");
const voice = encodeURIComponent("Puck");
new THREE.AudioLoader().load(
`https://v1.speech.drawcall.ai/?text=${text}&voice=${voice}`,
(buffer) => {
audio.setBuffer(buffer);
audio.setVolume(1);
audio.play();
},
);
音声
既知の音声には Zephyr、Puck、Charon、Kore、Fenrir、Leda、Orus、Aoede、Callirrhoe、Autonoe、Enceladus、Iapetus、Umbriel、Algieba、Despina、Erinome、Algenib、Rasalgethi、Laomedeia、Achernar、Alnilam、Schedar、Gacrux、Pulcherrima、Achird、Zubenelgenubi、Vindemiatrix、Sadachbia、Sadaltager、Sulafat があります。
ブラウザーで音声を再生するには、通常、クリックまたはタップが必要です。UI では、ユーザーの操作をきっかけに再生を開始し、必要に応じて事前にオーディオコンテキストを再開してください。