Blockrun
BlockRunAI/blockrun-mcp
Pay-per-call access to AI models, real-time data, media generation and multi-chain RPC over x402 micropayments (USDC on Base or Solana), or a BlockRun account API key.
Async speech-to-speech voice conversion via Venice — re-record a source recording in a different voice while keeping delivery and timing.
$ npx skills add veniceai/skills --skill venice-audio-voice-changer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install veniceai/skills venice-audio-voice-changer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/venice-audio-voice-changer .claude/skills/venice-audio-voice-changer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "venice-audio-voice-changer" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-voice-changer into .claude/skills/venice-audio-voice-changer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-voice-changer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/veniceai/skills/tree/main/skills/venice-audio-voice-changerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add veniceai/skills --skill venice-audio-voice-changer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install veniceai/skills venice-audio-voice-changer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/venice-audio-voice-changer .agents/skills/venice-audio-voice-changer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "venice-audio-voice-changer" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-voice-changer into .agents/skills/venice-audio-voice-changer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-voice-changer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add veniceai/skills --skill venice-audio-voice-changer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install veniceai/skills venice-audio-voice-changer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/venice-audio-voice-changer .cursor/skills/venice-audio-voice-changer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "venice-audio-voice-changer" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-voice-changer into .cursor/skills/venice-audio-voice-changer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-voice-changer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/veniceai/skills.git --path skills/venice-audio-voice-changer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add veniceai/skills --skill venice-audio-voice-changer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install veniceai/skills venice-audio-voice-changer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/venice-audio-voice-changer .gemini/skills/venice-audio-voice-changer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "venice-audio-voice-changer" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-voice-changer into .gemini/skills/venice-audio-voice-changer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-voice-changer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install veniceai/skills venice-audio-voice-changerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add veniceai/skills --skill venice-audio-voice-changer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/venice-audio-voice-changer .github/skills/venice-audio-voice-changer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "venice-audio-voice-changer" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-voice-changer into .github/skills/venice-audio-voice-changer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-voice-changer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add veniceai/skills --skill venice-audio-voice-changer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install veniceai/skills venice-audio-voice-changer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/veniceai/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/venice-audio-voice-changer .opencode/skills/venice-audio-voice-changer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "venice-audio-voice-changer" agent skill from https://github.com/veniceai/skills/tree/main/skills/venice-audio-voice-changer into .opencode/skills/venice-audio-voice-changer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "venice-audio-voice-changer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
venice-audio-voice-changerAsync speech-to-speech voice conversion via Venice — re-record a source recording in a different voice while keeping delivery and timing.
Venice Audio Voice Changer is an agent skill from veniceai/skills. Async speech-to-speech voice conversion via Venice — re-record a source recording in a different voice while keeping delivery and timing. Covers POST /audio/voice-changer/quote (unauthenticated), /queue (multipart file or JSON audiourl), /retrieve and /complete, how to discover voice-changer models (modelspec.voicechanger on /models?type=music), accepted formats, the source-length cap, whole-minute billing, refunds, and what each endpoint refuses. Note that no voice-changer model is currently open to regular API…
Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Media & Creative. It works with x402. The repository describes itself as: Agent Skills for the Venice.ai API. One folder per surface area, each with a SKILL.md for agent runtimes (Cursor, Claude, Codex, etc.). The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 5eaeac5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.venice.aiFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
VENICE_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Venice Audio Voice Changer loads about 2.8k tokens when it runs. Until then it costs about 138 tokens; SKILL.md has 1,025 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from veniceai/skills at commit 5eaeac5, republished under its MIT licence (© veniceai). 1,025 words, ~2,821 tokens.
.claude/skills/venice-audio-voice-changer/SKILL.md (or your agent's skills folder)./audio/voice-changer/*)Speech-to-speech conversion: upload a recording, get the same speech back in a different voice, with the original pacing, emotion and timing preserved. It's asynchronous, with its own quote → queue → retrieve → complete family (parallel to, but separate from, venice-audio-music).
Availability (checked 2026-09-30): the endpoints are in the public API spec, but the only voice-changer model,
elevenlabs-voice-changer, is not yet open to regular API keys. It is not listed byGET /models, and regular keys (or no key) get404 "Specified model not found"from every endpoint below. Before using this skill, confirm that a model withmodel_spec.voice_changer: trueshows up inGET /models?type=musicfor your key; if none does, the feature isn't available to you.
| Method | Path | Auth | Notes |
|---|---|---|---|
POST | /api/v1/audio/voice-changer/quote | None required (key optional) | Price for a source of N seconds. |
POST | /api/v1/audio/voice-changer/queue | Bearer key or x402 (SIWX) | multipart/form-data (file) or JSON (audio_url). Charges and enqueues. 40 req/min per user. |
POST | /api/v1/audio/voice-changer/retrieve | Bearer key or x402 (SIWX) | Status JSON or the converted audio. 120 req/min per user. |
POST | /api/v1/audio/voice-changer/complete | Bearer key or x402 (SIWX) | Release the provider-held media. |
Each endpoint only accepts voice-changer models (400 otherwise, naming the endpoint to use instead), and /audio/quote, /audio/queue, /audio/retrieve, /audio/complete refuse voice-changer models the same way.
For text → speech use venice-audio-speech; to create a reusable voice from a sample, see voice cloning there.
There is no ?type=voice-changer filter. Voice-changer models are music-type models whose model_spec carries:
| Field | Meaning |
|---|---|
voice_changer | true on voice-changer models only. |
accepted_audio_formats | Containers accepted for the source, judged from the file's bytes (not its name or Content-Type). mp4 covers M4A. |
max_source_audio_duration_seconds | Longest source accepted; longer → 422 before any charge. |
supports_background_noise_removal | Whether remove_background_noise is honored. |
supports_seed | Whether seed is honored. |
voices, default_voice, supports_custom_voice_id | Target voices; with supports_custom_voice_id: true you may pass a provider Voice ID. |
pricing.durations | Whole-minute price tiers keyed by source length. |
elevenlabs-voice-changer supports: formats mp3, wav, ogg, mp4, aac; max source 300 s; noise removal and seed supported; the curated ElevenLabs voices (Aria default, Roger, Sarah, …) or any ElevenLabs Voice ID; output mp3. Read its price tiers from pricing.durations rather than hard-coding them.
POST /audio/voice-changer/quotecurl https://api.venice.ai/api/v1/audio/voice-changer/quote \
-H "Content-Type: application/json" \
-d '{ "model": "elevenlabs-voice-changer", "duration_seconds": 52 }'Response: { "quote": <USD>, "duration_seconds": 52 }.
| Field | Notes |
|---|---|
model | Required. A voice-changer model. |
duration_seconds | Required. Positive integer or numeric string, ≤ max_source_audio_duration_seconds. |
This is an estimate for the length you declare. The actual charge uses the length Venice measures when you queue; if both round up to the same whole minute the price is identical.
POST /audio/voice-changer/queueSupply the source exactly once — a multipart file or a JSON audio_url. Both or neither → 400.
# Upload
curl https://api.venice.ai/api/v1/audio/voice-changer/queue \
-H "Authorization: Bearer $VENICE_API_KEY" \
-F "model=elevenlabs-voice-changer" \
-F "file=@take-03.wav" \
-F "voice=Roger" \
-F "remove_background_noise=true"
# By URL
curl https://api.venice.ai/api/v1/audio/voice-changer/queue \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs-voice-changer",
"audio_url": "https://example.com/take-03.mp3",
"voice": "Roger",
"seed": 42
}'Response:
{ "model": "elevenlabs-voice-changer", "queue_id": "…", "status": "QUEUED", "duration_seconds": 52 }duration_seconds is the source length measured server-side — the exact quantity billed.
| Field | Notes |
|---|---|
model | Required. |
file | Multipart source recording, max 25 MB. |
audio_url | Public http(s) URL. Venice fetches it (30 s timeout, 25 MB cap), validates the bytes, and forwards only the bytes — the URL itself is never passed to the provider. |
voice | 1–60 chars. A curated voice or provider Voice ID. Defaults to default_voice. Not checked against voices at queue time — an unknown Voice ID fails with 400 at queue or on retrieve. |
remove_background_noise | Boolean ("true" / "false" in multipart). |
seed | Non-negative integer, for reproducible output. |
The body is strict — unknown fields → 400. Format, length, seed and balance are checked before you're charged. A voice the provider rejects at queue time returns 400, and any charge is refunded immediately.
POST /audio/voice-changer/retrievecurl https://api.venice.ai/api/v1/audio/voice-changer/retrieve \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-voice-changer","queue_id":"..."}' \
--output converted.mp3200 {"status":"PROCESSING","average_execution_time":<ms>,"execution_duration":<ms since queued>}.200 with the audio bytes, plus x-venice-audio-format, x-venice-inference-time (s), x-venice-model-id, x-venice-model-name, and x-venice-audio-duration when known.{ "error": "…", "credits_refunded": true|false }. If the provider accepted then failed the job, the charge is refunded; when credits_refunded is false, the message says whether anything is owed. The verdict is stored, so later polls return the same answer without a second refund.delete_media_on_completion: true releases the provider copy as soon as the audio is returned.The audio is delivered once. After a successful download, the next retrieve for that queue_id returns 404. Save the bytes on the first success.
POST /audio/voice-changer/completecurl https://api.venice.ai/api/v1/audio/voice-changer/complete \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs-voice-changer","queue_id":"..."}'Returns {"success": true} once the provider-held media is released (false if the delete didn't go through). Safe to call more than once. Skip it if you retrieved with delete_media_on_completion: true.
import fs from 'node:fs/promises'
const base = 'https://api.venice.ai/api/v1'
const auth = { Authorization: `Bearer ${process.env.VENICE_API_KEY}` }
const model = 'elevenlabs-voice-changer'
async function convert(path: string, voice: string) {
const form = new FormData()
form.append('model', model)
form.append('voice', voice)
form.append('file', new Blob([await fs.readFile(path)]), 'source.wav')
const queued = await fetch(`${base}/audio/voice-changer/queue`, { method: 'POST', headers: auth, body: form })
if (!queued.ok) throw new Error(`queue ${queued.status}: ${await queued.text()}`)
const { queue_id, duration_seconds } = await queued.json()
console.log('billed seconds:', duration_seconds)
while (true) {
const res = await fetch(`${base}/audio/voice-changer/retrieve`, {
method: 'POST',
headers: { ...auth, 'Content-Type': 'application/json' },
body: JSON.stringify({ model, queue_id, delete_media_on_completion: true }),
})
if (!res.ok) throw new Error(`retrieve ${res.status}: ${await res.text()}`)
if (!(res.headers.get('content-type') ?? '').startsWith('application/json')) {
await fs.writeFile('converted.mp3', Buffer.from(await res.arrayBuffer()))
return
}
await new Promise(r => setTimeout(r, 3000))
}
}| Code | Meaning |
|---|---|
400 | Strict-body error; both or neither of file / audio_url; audio_url unreachable or unusable; source not in accepted_audio_formats, has a video track, or its length can't be read; voice rejected by the provider (at queue, or later on retrieve — then refunded); non-voice-changer model; unknown / foreign queue_id ("Request ID is invalid."). |
401 | Authentication failed. |
402 | Insufficient balance (checked against the price for the measured length). Wallet callers above the $0.10 floor but below the price get the plain {"error":"Insufficient USD or Diem balance…"} body, not PAYMENT_REQUIRED. |
403 | A PRIVATE_ONLY key calling an anonymized model, or region restriction. |
404 | Model not found (today: every regular API key); on retrieve, media expired or already delivered. |
413 | Uploaded file over 25 MB. |
422 | Source longer than max_source_audio_duration_seconds (at queue, not charged); or, on retrieve, a provider content-policy rejection (refunded). |
429 | Rate limited (40/min queue, 120/min retrieve, per user). |
500 | Inference failure; body carries credits_refunded on retrieve. |
503 | Model at capacity. |
504 | On retrieve: the provider never accepted the job and it can no longer complete (after ~10 min); charge refunded. |
See venice-errors for general body shapes.
404 on quote with a correct model id means your key can't use it.200 means you've been charged. Keep the queue_id and poll instead.© veniceai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/venice-audio-voice-changer of veniceai/skills.
Open the folder on GitHubat commit 5eaeac5
Venice Audio Voice Changer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Venice Audio Voice Changer this skillveniceai/skills | 144 | — | ~2.8k | Automated safety check: Pass | MIT | |
| BlockrunBlockRunAI/blockrun-mcp | 391 | — | ~2.7k | Automated safety check: Pass | MIT | |
| BlockRun Image GenerationBlockRunAI/ClawRouter | 6.6k | — | ~2.1k | Automated safety check: Pass | MIT | |
| Run402LeoYeAI/openclaw-master-skills | 2.2k | — | ~4.8k | Automated safety check: Pass | MIT | |
| Cap Cinematic Demo GeneratorCapSoftware/Cap | 23k | — | ~2.4k | Automated safety check: Pass | Custom licence | |
| Musictadaspetra/loop | 296 | 2 repos | ~827 | Automated safety check: Pass | MIT |
BlockRunAI/blockrun-mcp
Pay-per-call access to AI models, real-time data, media generation and multi-chain RPC over x402 micropayments (USDC on Base or Solana), or a BlockRun account API key.
BlockRunAI/ClawRouter
Generates or edits images through ClawRouter's local image API, with a choice of models and sizes and payment handled automatically through x402.
LeoYeAI/openclaw-master-skills
Provision Postgres databases, deploy static sites, generate images, and build full-stack webapps on Run402 using x402 micropayments.
CapSoftware/Cap
Turns any URL into a short cinematic product-demo video on macOS, scouting the page, recording it with virtual input, then treating the clip with Cap's 3D camera and music.
tadaspetra/loop
Generate music using ElevenLabs Music API. An agent skill from tadaspetra/loop.
coinbase/agentic-wallet-skills
Crypto wallet operations via the awal CLI — sign in, check balances, send USDC/ETH/POL/SOL, trade tokens, fund the wallet, and use the x402 payment protocol to discover paid services, pay for API…
veniceai/skills
Picks which Venice text model to call for a prompt based on privacy tier, input modality, capabilities and cost, and decides when to escalate from a local agent.
veniceai/skills
Documents Venice's model discovery endpoints, GET /models, /models/traits and /models/compatibility_mapping, so an agent can pick a model by capability, constraint or price.
veniceai/skills
Manages Venice API keys through the /api_keys endpoints: create, list, update and revoke keys, set spending limits, and read rate limits.
veniceai/skills
High-level map of the Venice.ai API: base URL, auth modes per endpoint, endpoint categories, response headers, pricing model, error shape and versioning.
veniceai/skills
Async music, sound-effect and long-form voice generation via Venice.
veniceai/skills
Generate speech from text via POST /audio/speech, and clone a voice via POST /audio/voices.
Works with
Categories
Async speech-to-speech voice conversion via Venice — re-record a source recording in a different voice while keeping delivery and timing. Venice Audio Voice Changer is an agent skill from veniceai/skills. Async speech-to-speech voice conversion via Venice — re-record a source recording in a different voice while keeping delivery and timing.
Venice Audio Voice Changer fits situations like: media & Creative work in your project.
Run `npx skills add veniceai/skills --skill venice-audio-voice-changer -a claude-code`. Or copy the skill folder (skills/venice-audio-voice-changer in veniceai/skills) into .claude/skills/venice-audio-voice-changer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add veniceai/skills --skill venice-audio-voice-changer -a codex`. Or copy the skill folder (skills/venice-audio-voice-changer in veniceai/skills) into .agents/skills/venice-audio-voice-changer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add veniceai/skills --skill venice-audio-voice-changer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/venice-audio-voice-changer, .gemini/skills/venice-audio-voice-changer, .github/skills/venice-audio-voice-changer and .opencode/skills/venice-audio-voice-changer in your project.
Going by SKILL.md and its folder, Venice Audio Voice Changer needs the command-line tools its instructions call (curl) and credentials named VENICE_API_KEY. Our summary lists: A credential in VENICE_API_KEY.
SKILL.md names 1 domain. In commands or code: api.venice.ai; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Venice Audio Voice Changer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Venice Audio Voice Changer: Blockrun (BlockRunAI/blockrun-mcp, 391 stars), BlockRun Image Generation (BlockRunAI/ClawRouter, 6.6k stars), Run402 (LeoYeAI/openclaw-master-skills, 2.2k stars) and Cap Cinematic Demo Generator (CapSoftware/Cap, 23k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
veniceai (a GitHub organization) maintains it in veniceai/skills, which has 144 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 5, 2026.
Source: veniceai/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.