К основному содержанию
скилл CX Codex

speech-engine — скилл для Claude Code: голосовой интерфейс

Добавляет голосовой диалог в ваш агент: ElevenLabs берёт на себя микрофон, распознавание речи и озвучку, а сервер отдаёт текст ответа.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add elevenlabs/skills --skill speech-engine -a claude-code
Открыть на GitHub

Что делает speech-engine

Скилл описывает, как подключить Speech Engine от ElevenLabs к собственному агенту. Логика агента остаётся на вашем сервере: он поднимает WebSocket-эндпоинт, получает события распознавания речи и стримит текст обратно через SDK. ElevenLabs отвечает за захват микрофона, speech-to-text, очерёдность реплик, text-to-speech и воспроизведение в браузере.

Внутри — пошаговый порядок работ и примеры кода на Python и TypeScript: создание ресурса Speech Engine, запуск сервера через engine.serve(...) или speechEngine.attach(...), выдача conversation-токенов браузеру. Для JavaScript скилл советует брать только пакеты @elevenlabs/*. Отдельно разобраны колбэки: onClose / on_close для чистого отключения и onDisconnect / on_disconnect для обрыва соединения.

Заранее нужен ключ ELEVENLABS_API_KEY и доступ в интернет. Если ключа для проекта нет, скилл предлагает выполнить npx -y @elevenlabs/cli@latest onboard init из папки приложения. Для локальной разработки сервер придётся открыть наружу по HTTPS, например через ngrok http 3001, потому что ресурс создаётся с публичным ws_url. Ключ API нельзя класть в браузерный код. Текст распознавания скилл считает недоверенным вводом: в речи может прийти попытка промпт-инъекции, поэтому сырой транскрипт не должен напрямую управлять ответами, инструментами или привилегированными действиями.

Какие задачи решает

  • добавить голосовой ввод в существующий чат-агент
  • поднять WebSocket-сервер для голосовых диалогов ElevenLabs
  • выдавать браузеру conversation-токены, не раскрывая ключ API
  • обрабатывать перебивание пользователя во время стрима ответа
  • отделить чистое закрытие соединения от неожиданного обрыва

Примеры запросов агенту

  • Добавь голосовой интерфейс в мой агент через Speech Engine, логика пусть останется на моём сервере
  • Сделай WebSocket-эндпоинт /ws и выдачу conversation-токенов для браузера на @elevenlabs/react
  • Настрой обработку перебивания: если пользователь заговорил, предыдущий ответ должен остановиться

Как установить speech-engine

1Через Skills CLI (Vercel)

npx skills add elevenlabs/skills --skill speech-engine -a claude-code

2Вручную: положить файлы

~/.claude/skills/speech-engine/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/speech-engine/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора10

speech-to-text Отдаёт агенту ElevenLabs Scribe v2: отправляет аудио или видео на распознавание и возвращает текст, метку языка и таймстемпы по словам. CX Codex +1 11 800установок sound-effects Скилл генерирует звуковые эффекты по текстовому описанию через ElevenLabs. Пригодится для озвучки интерфейсов, игр, фонового шума и кинематографичных переходов. CX Codex +1 11 400установок agents Скилл собирает голосовых ИИ-агентов ElevenLabs: настраивает first_message, промпт, LLM и голос через CLI или SDK. Годится для голосовых ассистентов и ботов поддержки. CX Codex +1 11 100установок music Генерирует треки, песни с вокалом и фоновую музыку через ElevenLabs Music API прямо из агента. CX Codex +1 10 900установок voice-isolator Убирает фоновый шум и выделяет речь или вокал в аудио через API ElevenLabs. Пригодится для записей с музыкой, шумом помещения и подготовки к расшифровке. CX Codex +1 6 800установок voice-changer Меняет голос диктора в готовой аудиозаписи через API ElevenLabs, сохраняя эмоции, темп и интонации оригинала. Пригодится при озвучке персонажей или анонимизации речи. CX Codex +1 6 500установок dubbing Скилл создаёт дубляж аудио и видео на других языках через ElevenLabs, сохраняя голоса исходных спикеров. Подходит для локализации и правки переводов. CX Codex +1 4 100установок realtime Скилл для работы с моделями ElevenLabs Realtime: переводит голосового агента на низкую задержку и помогает переехать с OpenAI Realtime API. CX Codex +1 634установок

Похожие

voice-agents davila7 Помогает спроектировать голосового агента: выбрать архитектуру, уложиться в задержку и не сломаться на перебиваниях. 194установок voicemode mbailey voicemode даёт общаться с ИИ-агентом голосом: распознаёт речь и озвучивает ответы. Пригодится, когда руки заняты или хочется отдохнуть от экрана. CX Codex +1 ★ 1 417звёзд репо text-to-speech calesthio Генерирует аудио из текста через HeyGen Starfish, подбирая голос, скорость и тон. Пригодится для озвучки, дикторского текста и подкастов. CX Codex +1 1 200установок azure-speech-to-text calesthio Транскрибирует аудио в текст через REST API Azure AI Speech с таймкодами слов и разделением по спикерам. Помогает собирать субтитры в пайплайнах OpenMontage без долгой локальной обработки. CX Codex +1 775установок add-voice cursor Добавляет в приложение голосовой диалог Grok с передачей речи в обе стороны. Нужен при замене каскада STT-LLM-TTS или OpenAI Realtime. CX Codex +1 319установок venice-audio-speech nexu-io Скилл подключает модели синтеза речи Venice.ai с выбором голосов и форматов. Пригодится для озвучки документов, создания закадра к видео или голоса агента. CX Codex +1 2 700установок

Рядом в теме «ИИ и ML»

Всё по теме «ИИ и ML» →

Вопросы о speech-engine

Как установить speech-engine в Claude?

Выполните npx skills add elevenlabs/skills --skill speech-engine -a claude-code. Скилл появится в ~/.claude/skills/speech-engine/SKILL.md.

Что делает speech-engine?

Описывает подключение Speech Engine от ElevenLabs к вашему агенту: серверный WebSocket-эндпоинт, стриминг текста ответа и браузерный клиент с conversation-токеном. Распознавание речи, очерёдность реплик и озвучку берёт на себя ElevenLabs.

Что нужно, чтобы скилл заработал?

Доступ в интернет и ключ ELEVENLABS_API_KEY. Если ключа для проекта нет, скилл предлагает выполнить npx -y @elevenlabs/cli@latest onboard init из папки приложения.

Исходный текст

SKILL.md · MIT
---
name: speech-engine
description: Add real-time voice conversations to a custom agent runtime with ElevenLabs Speech Engine. Use when building Speech Engine servers, WebSocket handlers, WebRTC browser clients, conversation token endpoints, interruption-aware streaming responses, or voice-enabled chat agents that connect developer-owned server logic to ElevenLabs speech-to-text and text-to-speech.
license: MIT
compatibility: Requires internet access and an ElevenLabs API key (ELEVENLABS_API_KEY).
metadata: {"openclaw": {"requires": {"env": ["ELEVENLABS_API_KEY"]}, "primaryEnv": "ELEVENLABS_API_KEY"}}
---

# ElevenLabs Speech Engine

Add a real-time voice interface to a custom agent. ElevenLabs handles microphone audio, speech-to-text, turn-taking, text-to-speech, and browser playback; your server exposes a Speech Engine WebSocket endpoint and streams response text back.

> **Setup, before writing any code:** if `ELEVENLABS_API_KEY` isn't set for this project, run `npx -y @elevenlabs/cli@latest onboard init` from the app's folder first and follow what it prints: it signs the user in and stores a key for the project, so nobody copies one by hand. Otherwise see the [Installation Guide](references/installation.md). For JavaScript, use `@elevenlabs/*` packages only. For deeper SDK details, read [JavaScript SDK Reference](references/javascript-sdk-reference.md) or [Python SDK Reference](references/python-sdk-reference.md).

## When to Use

Use Speech Engine when the user wants to:

- Add voice to an existing chat app or custom server pipeline
- Add voice to OpenClaw, Hermes, or a similar agent runtime while keeping agent logic on the developer-owned server
- Build a developer-hosted WebSocket server for ElevenLabs voice conversations
- Stream response text back as spoken audio after your server validates user intent
- Handle user interruptions while a response is still streaming
- Build a browser client with `@elevenlabs/react` or `@elevenlabs/client` using a server-issued conversation token

Use the `agents` skill instead when the user is creating or configuring a hosted ElevenLabs Conversational AI agent with platform-managed prompts, tools, workflows, phone numbers, or widgets.

## How It Works

Each Speech Engine WebSocket connection represents one conversation.

1. The browser sends user audio to ElevenLabs.
2. ElevenLabs sends speech-recognition events to your server.
3. Your server derives trusted application state without letting raw speech text control tools or privileged actions.
4. Your server streams text back through the SDK.
5. ElevenLabs converts the response to speech and plays it in the browser.

The SDK manages WebSocket routing, request verification, session lifecycle, ping/pong, turn-taking, and interruption handling. `sendResponse()` / `send_response()` accepts a string or async iterable of response text.

Treat speech-recognition text as untrusted user input. Do not map raw speech text directly into model roles, responses, or tool calls. Use deterministic validation, allowlisted intents, or explicit user confirmation before any transcript-derived value affects downstream response or tool logic.

## Implementation Flow

1. Install server dependencies and configure `ELEVENLABS_API_KEY`.
2. Expose your Speech Engine server through a public HTTPS URL for local development, for example with `ngrok http 3001`.
3. Create a Speech Engine resource with `ws_url` / `wsUrl` pointing at the public WebSocket URL, usually `wss://.../ws`.
4. Store the returned Speech Engine ID, for example in `ELEVENLABS_SPEECH_ENGINE_ID`.
5. Start a Speech Engine server with `engine.serve(...)` in Python or `speechEngine.attach(...)` in TypeScript.
6. Issue browser conversation tokens from a server endpoint. Never put `ELEVENLABS_API_KEY` in browser code.
7. Start the client session with `conversationToken`; if the agent should greet first, enable the first-message override on the Speech Engine resource, then set `overrides.agent.firstMessage` in the client.

## Create a Speech Engine

### Python

```python
import asyncio
import os

from dotenv import load_dotenv
from elevenlabs import AsyncElevenLabs

load_dotenv()

elevenlabs = AsyncElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))

async def main():
    engine = await elevenlabs.speech_engine.create(
        name="My Speech Engine",
        speech_engine={"ws_url": os.environ["PUBLIC_WS_URL"]},
        overrides={"first_message": True},
    )
    print(engine.engine_id)

asyncio.run(main())
```

### TypeScript

```typescript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import "dotenv/config";

const elevenlabs = new ElevenLabsClient({
  apiKey: process.env.ELEVENLABS_API_KEY,
});

const engine = await elevenlabs.speechEngine.create({
  name: "My Speech Engine",
  speechEngine: { wsUrl: process.env.PUBLIC_WS_URL! },
  overrides: { firstMessage: true },
});

console.log(engine.engineId);
```

`PUBLIC_WS_URL` should look like `wss://example.ngrok.app/ws` locally or your production WebSocket route in deployment.

The create request can also configure `tts`, `asr`, `turn`, `speech_engine.request_headers` / `speechEngine.requestHeaders`, `overrides`, and `privacy` for custom voices, transcription keywords, turn-taking, server auth headers, client-provided first messages, and recording behavior. See the SDK reference files for expanded examples.

## Server Pattern

Run the Speech Engine server at the `ws_url` / `wsUrl` configured on the resource. Keep response generation behind your own validation boundary: raw speech-recognition text should not directly control responses, tools, secrets, or other privileged actions.

### Python

```python
engine = await elevenlabs.speech_engine.get(os.environ["ELEVENLABS_SPEECH_ENGINE_ID"])
await engine.serve(port=3001, path="/ws", debug=True, callbacks=validated_callbacks)
```

### TypeScript

```typescript
const engine = await elevenlabs.speechEngine.get(process.env.ELEVENLABS_SPEECH_ENGINE_ID!);
engine.attach(httpServer, "/ws", { debug: true, ...validatedCallbacks });
```

In TypeScript, pass interruption signals to downstream async work when it supports cancellation so interrupted responses stop quickly. In Python, the SDK cancels the previous turn handler when a newer turn arrives.

Server callbacks can distinguish clean closes from dropped connections: use `onClose` / `on_close` for clean disconnects and `onDisconnect` / `on_disconnect` for unexpected WebSocket drops.

Security note: speech-recognition text can contain prompt-injection attempts from user speech or played audio. Treat it as untrusted input. Convert it into trusted application state before invoking response generation, tools, or privileged workflows.

### Disabling authentication (advanced, dangerous)

Both `engine.attach()` (TypeScript) and `engine.serve()` / `SpeechEngineServer` (Python) verify a JWT on every incoming WebSocket by default. This is what proves the connection is really coming from ElevenLabs and not from an attacker who guessed the URL. **Do not turn this off.**

An escape hatch exists — `disableAuth: true` in the callback options (TypeScript) or `disable_auth=True` on `serve()` / `SpeechEngineServer(...)` (Python) — for the narrow case where a compensating network-level control is already in place. Without such a control, disabling auth means **any client on the internet that finds your URL can open sessions**. Concretely, an attacker can:

- open unlimited conversations to drain your ElevenLabs quota and downstream LLM budget
- feed crafted transcripts to your response pipeline, effectively impersonating a user
- use your server as an oracle to probe backend state, tools, or prompts

Only recommend `disableAuth` / `disable_auth` when the user has already implemented **at least one** of:

- **IP allowlist** — the server (or an upstream firewall / load balancer / API gateway) only accepts inbound traffic from [ElevenLabs' documented egress ranges](https://elevenlabs.io/docs/overview/capabilities/speech-engine#ip-allowlisting).
- **Custom shared-secret header** — a secret header configured on the Speech Engine resource via `speech_engine.request_headers` / `speechEngine.requestHeaders` at create time, validated by an upstream proxy (or by the developer's own middleware in front of `attach()` / `serve()`) before requests reach the SDK.

If the user cannot confirm one of the above is in place, leave the default authentication on. Skipping JWT verification without a mitigation is not an optimization or a convenience — it is unauthenticated public compute.

## Browser Client

Create a server-side token endpoint and have the browser request a token before starting the microphone session. Keep the Speech Engine ID and API key on the server. If the client passes `overrides.agent.firstMessage`, the Speech Engine resource must have the first-message override enabled.

```typescript
import express from "express";
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import "dotenv/config";

const app = express();
const elevenlabs = new ElevenLabsClient();

app.get("/api/token", async (_req, res) => {
  const response = await elevenlabs.conversationalAi.conversations.getWebrtcToken({
    agentId: process.env.ELEVENLABS_SPEECH_ENGINE_ID!,
  });
  res.json({ token: response.token });
});
```

React clients can use `@elevenlabs/react`:

```tsx
import { useConversation } from "@elevenlabs/react";

export function VoiceControls() {
  const conversation = useConversation({
    onConnect: () => console.log("connected"),
    onDisconnect: () => console.log("disconnected"),
    onError: (error) => console.error(error),
  });

  async function startConversation() {
    await navigator.mediaDevices.getUserMedia({ audio: true });
    const { token } = await fetch("/api/token").then((res) => res.json());

    await conversation.startSession({
      conversationToken: token,
      overrides: {
        agent: { firstMessage: "Hello! How can I help you today?" },
      },
    });
  }

  return <button onClick={startConversation}>Start conversation</button>;
}
```

## References

- [Installation Guide](references/installation.md)
- [JavaScript SDK Reference](references/javascript-sdk-reference.md)
- [Python SDK Reference](references/python-sdk-reference.md)

© elevenlabs · MIT · elevenlabs/skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой