VoiceLabs: Reading Text Aloud

Turns text into spoken audio in the user's VoiceLabs voices and hands back the audio link. Use when the user asks to 'read this paragraph in my Narrator voice', 'narrate these five…

Alaeddin BENSALAH

@bsalaeddin

Install

$ openclaw skills install @bsalaeddin/voicelabs-reading-text-aloud

Read text aloud with VoiceLabs

Generate speech from the user's text in one of their voice profiles, wait for it to finish, and give them the audio link.

Connecting and calling the tools

Every tool in this skill comes from the voicelabs MCP server, the VoiceLabs connector, and is written here as voicelabs:<tool>. The server lists the named tools and the Code Mode pair side by side.

  • Tools listed by name: call them directly, for example voicelabs:list_voice_profiles.
  • Several operations in one round trip, or a named tool is missing: call voicelabs:search_tools first, then call each tool inside voicelabs:execute_typescript as external_<tool> (for example external_list_voice_profiles); the program must return its result. Scopes, confirmations and gates are identical on both surfaces.
  • "Tool not found": switch to the Code Mode route instead of retrying the direct call. If voicelabs:search_tools does not return the tool either, its OAuth scope was not granted; the user reconnects VoiceLabs and approves that scope.
  • No voicelabs tools at all: VoiceLabs is not connected yet. Install the VoiceLabs power, which adds the server; it signs in with OAuth on first use.

Tools you will use

  • voicelabs:list_voice_profiles: the account's voices with id, name, language, voice_type (preset or cloned) and engine.
  • voicelabs:ensure_voice_profile: make sure a named voice exists, creating it from a built-in preset if it does not. Safe to repeat.
  • voicelabs:speak: start a generation from text with profileId or profileName and optional language. Returns generationId with status generating.
  • voicelabs:get_generation: poll a generation; returns status (generating, completed, failed) and, once completed, audioUrl.
  • voicelabs:search_tools and voicelabs:execute_typescript: start several generations in one round trip for multi-part scripts.

Workflow

  1. Pick the voice. If the user named one, pass it as profileName. Otherwise call voicelabs:list_voice_profiles and ask which voice, or suggest one that matches the text's language.
  2. If the account has no voices, or voicelabs:speak returns NOT_FOUND, offer a built-in preset: call voicelabs:ensure_voice_profile with a name such as "Narrator" and use the id it returns.
  3. Call voicelabs:speak with the text and the voice. Keep the generationId.
  4. Call voicelabs:get_generation with that id. While the status is generating, call it again. When it is completed, give the user the audioUrl. If it is failed, report the error field.
  5. For a long script, split it at paragraph or section breaks and generate each part (see below). Return the links in order, labelled by section.

Several parts in one round trip

Call voicelabs:search_tools first to get the exact declarations, then start every part at once. Do not wait for audio inside the sandbox; return the ids and poll voicelabs:get_generation afterwards.

const parts = ["Section one text", "Section two text"];
const started = await Promise.all(
  parts.map((text) =>
    external_speak({ text, profileName: "Narrator" }).catch((e) => ({ error: String(e) })),
  ),
);
return started; // generationId per part, or "<CODE>: <details>"

Rules

  • Speak only the text the user gave or approved. Do not add intros, disclaimers, or extra lines.
  • Audio links expire after about 15 minutes. If the user comes back later, call voicelabs:get_generation again for a fresh link.
  • QUOTA_EXCEEDED: the account's allowance for the period is used. Relay the message as written and stop; do not push a plan or retry.
  • RATE_LIMITED: wait the retryAfterSeconds it names, then continue.
  • SCOPE_MISSING: the connection lacks voice:generate; the user can reconnect and grant it.
  • Arguments are strict and camelCase (profileId, not profile_id).

Top skills in this category

Ollama Local

@timverhoogt

Manage and use local Ollama models. Use for model management (list/pull/remove), chat/completions, embeddings, and tool-use with local LLMs. Covers OpenClaw sub-agent integration and model selection guidance.

117.4k

Humanizer

@biostartechnology

Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's comprehensive "Signs of AI writing" guide. Detects and fixes patterns including: inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.

714132k

gmail

@byungkyu

Gmail API integration with managed OAuth. Read, send, and manage emails, threads, labels, and drafts. Use this skill when users want to interact with Gmail. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a Gmail connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a Gmail action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with Gmail examples; they add no Gmail capability - Gmail is itself an event source, so its own events are in `references/google-mail/triggers.md`, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).

7540k

Summarize Pro

@mkpareek0315

When user asks to summarize text, articles, documents, meetings, emails, YouTube transcripts, books, PDFs, reports, conversations, or any long content. Also...

6332k

Session-logs

@guogang1024

Search and analyze your own session logs (older/parent conversations) using jq.

3147k