doubao-tts
Skill0 starsChanged 26 days agoMITView on GitHub
Use for Doubao/Volcengine article audio (TTS), dual-speaker podcasts, ASR transcripts, or 语音妙记/智能妙记 for separate interview recordings. Covers text cleaning, V1/V3 endpoints, Flash/Standard ASR, native minutes with timestamps/summaries/chapters/todo/Q&A, private delivery and query-only recovery, lizliz.xyz publish paths, and ElevenLabs fallback routing.
- Reads credentials
9 other projects use a version of this.
Adopted by
Most recently taken up by
- calesthio/OpenMontagetheir own version, first seen Nov 9, 2026
- OpenMontageInc/OpenMontagetheir own version, first seen Nov 8, 2026
- agentrix-ai/skillstheir own version, first seen Oct 20, 2026
- Gopyr/gopyr-skills-hubtheir own version, first seen Oct 11, 2026
- lsongdev/skillstheir own version, first seen Sep 10, 2026
- OpenMinis/MinisSkillstheir own version, first seen Sep 4, 2026
Used with
Projects with it also use hyperframes-cli.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
OpenAISkillhyperframes-cli
HyperFrames CLI tool — hyperframes init, lint, inspect, preview, render, transcribe, tts, doctor, browser, info, upgrade, compositions, docs, benchmark. Use when scaffolding a project, linting, validating, inspecting visual layout in compositions, previewing in the studio, rendering to video, transcribing audio, generating TTS, or troubleshooting the HyperFrames environment.
Also in 3 projects that use this
Other versions9 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 9
- calesthio/OpenMontage★ 81ksame name
- OpenMontageInc/OpenMontage★ 81ksame name
- xvirobotics/metabot★ 999same name
- OpenMinis/MinisSkills★ 612same name
- LinHao-city/StoryMind★ 10same name
- WiseWong6/wise-skills★ 10same name
- agentrix-ai/skills★ 1same name
- Gopyr/gopyr-skills-hub★ 0same name
- lsongdev/skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository15 other files it gives its agents.
- ai-native-mihomoSkill
- ai-native-proof-ledgerSkill
- clerk-authSkill
- cloudflare-cost-guardSkill
- design-md-visual-systemSkill
- fleet-orchSkill
- geo-job-huntSkill
- github-telegram-feedback-pipelineSkill
- interactive-projects-streamSkill
- landing-page-replication-v5Skill
- seo-masterSkill
- talkcutSkill
- typesafe-aiSkill
- video-script-conversionSkill
- webgl-threejs-background-animationSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
18 rules. 0 are common, 8 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 6 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 26
Do not start on the old console for new setups — it is harder to navigate.
- Distinctive: line 30
Create or copy a single API Key from the new console's API Key management.
- Very specific: line 34
One key, many services: After topping up on the new console, that API Key is the credential for TTS, ASR (speech→text), Podcast generation, …
- Very specific: line 54
Do not narrate References / Footnotes by default: Stop before References / 参考资料 / Footnotes / 脚注 / Sources / 引用.
- Distinctive: line 56
Skip multi-voice smoke tests: when Liz already chose the default.
- Very specific: line 61
Start from this skill: when Liz mentions Doubao speech / TTS / ASR / 妙记 — read this checkout's SKILL.md and route to the relevant reference …
- Very specific: line 82
Best practice: put the real secret once under ~/.agents/secrets/ so Cursor / Claude / Codex / other agents sharing ~/.agents/skills can all …
- Very specific: line 103
Deprecated for new setups: Keep populated while tts-generate.py, podcast-generate.py, and asr-transcribe.py still expect them.
- Very specific: line 118
Do not put the API Key into the V1 Bearer.
- Very specific: line 136
If neither DOUBAO_API_KEY (or aliases) nor legacy App ID / Access Token is set: stop.
- Distinctive: line 183
Prefer for realtime / streaming text.
- Very specific: line 248
Place site audio: public/audio/articles/<slug>/<slug>.mp3 (or project convention).
- Distinctive: line 250
Verify size, duration, link.
- Very specific: line 261
Prefer native Doubao bitrate (~160 kbps).
- Very specific: line 299
Default speakers: zh_male_dayixiansheng_v2_saturn_bigtts + zh_female_mizaitongxue_v2_saturn_bigtts.
- Distinctive: line 393
Keep requested recordings separate.
- Distinctive: line 394
Default to transcription + automatic speaker IDs + word timestamps + summary + chapters + todo/Q&A.
- Distinctive: line 399
No minutes client is bundled yet.
“Common” is measured: kept by at least 6 in 10 of the 6 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Doubao TTS (TTS + Podcast + ASR + Voice Minutes)
Overview
Doubao / Volcengine(豆包语音)is widely regarded as top-tier Chinese speech AI and is the quality-default provider for Liz's writing pipeline. Prefer 火山引擎豆包 over generic TTS alternatives unless blocked.
This skill covers four 豆包语音 products: TTS (text→speech for article audio), Podcast (AI dual-speaker conversation), ASR (speech→text with optional diarization), and Voice Minutes / 语音妙记 (transcription plus native meeting summaries). On the new console, one API Key authenticates across these services via X-Api-Key. Endpoints and resource IDs still differ per product.
ElevenLabs has a cleaner HTTP API but weaker preferred voice/model quality for this workflow — last-resort fallback only (elevenlabs-tts). Do not choose it for convenience.
Onboarding (new console — preferred)
Do not start on the old console for new setups — it is harder to navigate. Use the new 豆包语音 console:
- Open the 火山引擎豆包语音新版控制台.
- Top up / activate the speech products you need (TTS, ASR, Podcast, etc.).
- Create or copy a single API Key from the new console's API Key management.
- Store it as
DOUBAO_API_KEY(canonical) in the writing-profile secrets path below. AliasDOUBAO_SPEECH_API_KEY/ legacyDOUBAO_TTS2_API_KEYare accepted. - Hand the key to the agent. If auth or product routing is unclear, also hand the 豆包语音产品简介 / 能力总览文档 (or the relevant API page from References / 参考文献).
One key, many services: After topping up on the new console, that API Key is the credential for TTS, ASR (speech→text), Podcast generation, and related 豆包语音 calls that accept X-Api-Key. You no longer need a separate App ID + Access Token pair for new-console workflows.
Existing bundled scripts (tts-generate.py, podcast-generate.py, asr-transcribe.py) still read the legacy App ID / Access Token env vars and old-console header shapes. Keep those vars populated until scripts are migrated; for new agent code prefer DOUBAO_API_KEY + X-Api-Key.
When to Use
- TTS: Liz asks to turn a writing project,
final.md, essay, or lizliz.xyz post into spoken audio (豆包 / 火山引擎 / ByteDance TTS). - Podcast: Liz asks to turn an article, TXT, URL, or topic into a dual-speaker AI podcast (豆包语音播客大模型). Separate product — activate via the new console (legacy activation deep-link also listed in References).
- ASR: Liz asks only for verbatim MP3 / WAV / OGG / voice memo / video-audio text (prefer Flash ASR).
- Voice Minutes: Liz asks for 豆包语音妙记 / 智能妙记, interview/meeting transcription plus native summaries, chapters, todo or Q&A, or to repeat the established separate-recording workflow. Read
references/doubao-minutes.md; do not substitute plain Flash ASR. - Debugging Doubao voices, payloads, article-audio placement, lizliz.xyz audio links, or ASR quality.
Don't use for:
- ElevenLabs-first generation →
elevenlabs-tts - Music tagging / source separation / MIDI / beat detection → separate SAMI / 智能K歌 product lines (see
references/volcengine-audio-ecosystem.md) - Real-time S2S voice agents → 端到端实时语音大模型 (out of scope; see References)
Core rules
- Do not read Markdown aloud. Strip YAML, heading markers, emphasis, footnotes, table pipes, HRs, raw URLs, images, code fences unless the content itself must be spoken.
- Do not narrate References / Footnotes by default. Stop before
References/参考资料/Footnotes/脚注/Sources/引用. Source appendix audio only if Liz asks. - Keep the article voice. Preserve Chinese punctuation rhythm, paragraph breaks, quotes, and English technical terms.
- Skip multi-voice smoke tests when Liz already chose the default.
- Default voice:
zh_female_vv_uranus_bigtts(Vivi2.0) unless Liz picks another or quota blocks. - Production TTS route: verified V1
https://openspeech.bytedance.com/api/v1/ttswithcluster: volcano_tts. V3 streaming is the migration/realtime path, not the article default. - Prefer new-console
DOUBAO_API_KEYfor new work; keep legacy App ID / Access Token only for existing scripts or V1 Bearer payloads until migrated. - ElevenLabs last resort only — quota/auth/platform failure, or explicit request. Keep provider visible in filenames/manifests.
- Start from this skill when Liz mentions Doubao speech / TTS / ASR / 妙记 — read this checkout's
SKILL.mdand route to the relevant reference before broad-searching old notes. Reusable playbooks belong here; recordings, transcripts, credentials and run receipts do not.
Environment contract
Secrets stay out of this file. Record variable names and paths only.
Canonical secrets + lookup order (first hit wins):
# Windows / multi-agent hub (preferred on this machine)
%USERPROFILE%\.agents\secrets\doubao-tts.env
%USERPROFILE%\.agents\secrets\elevenlabs.env
# Hermes writing-profile path (Linux / Hermes agents; keep as mirror)
~/.hermes/secrets/doubao-tts.env
~/.hermes/secrets/elevenlabs.env
~/.hermes/profiles/writing/.env.d/*.env -> ~/.hermes/secrets/*.env
~/.hermes/profiles/trading/.env.d/*.env -> ~/.hermes/secrets/*.env
~/.hermes/.env.d/*.env -> ~/.hermes/secrets/*.envBest practice: put the real secret once under ~/.agents/secrets/ so Cursor / Claude / Codex / other agents sharing ~/.agents/skills can all find it; mirror the same file to ~/.hermes/secrets/ if Hermes scripts still hard-code that path. Do not commit secrets into the skill folder.
Also mirror into profile .env when convenient (older scripts only source .env). New scripts should load .env and .env.d/*.env, and should also try ~/.agents/secrets/*.env before failing.
Writing-profile home: /home/ubuntu/.hermes/profiles/writing/.env
Preferred: single API Key (new console)
DOUBAO_API_KEY=... # canonical — X-Api-Key for TTS / ASR / Podcast (new console)
# accepted aliases (same value):
DOUBAO_SPEECH_API_KEY=...
DOUBAO_TTS2_API_KEY=... # historical name from TTS 2.0 samples; keep as aliasResolution order for new code: DOUBAO_API_KEY → DOUBAO_SPEECH_API_KEY → DOUBAO_TTS2_API_KEY.
Optional (shared): DOUBAO_TTS_CLUSTER=volcano_tts, DOUBAO_TTS_VOICE_TYPE=zh_female_vv_uranus_bigtts.
Legacy auth (old console) — existing scripts / V1 HTTP
Deprecated for new setups. Keep populated while tts-generate.py, podcast-generate.py, and asr-transcribe.py still expect them.
DOUBAO_TTS_APP_ID=... # old console App ID → X-Api-App-Key / X-Api-App-Id / V1 app.appid
DOUBAO_TTS_ACCESS_TOKEN=... # old Access Token → X-Api-Access-Key / V1 Authorization: Bearer; …
DOUBAO_TTS_SECRET_KEY=... # optional; some SDK variantsAliases (compat): VOLCENGINE_TTS_*, VOLC_TTS_*.
| Path | Auth shape |
| New console | X-Api-Key: $DOUBAO_API_KEY alone (ASR Flash, TTS V3, and related new-console APIs) |
| Old console / current scripts | X-Api-App-Key/X-Api-App-Id + X-Api-Access-Key, or V1 Authorization: Bearer; <token> + JSON app.appid/app.token |
Do not put the API Key into the V1 Bearer; header or the Access Token into X-Api-Key interchangeably — formats differ.
Shell export gotcha — plain source .env may not export to child Python:
set -a; . /home/ubuntu/.hermes/profiles/writing/.env; set +aPresence check (no secret dump):
python3 - <<'PY'
import os, re
for name in sorted(k for k in os.environ if re.search(r'(DOUBAO|VOLC|TTS)', k)):
print(f"{name}=<set>")
PYIf neither DOUBAO_API_KEY (or aliases) nor legacy App ID / Access Token is set: stop. Do not fall back to Edge/OpenAI or claim Doubao audio was generated.
TTS (文字→语音)
V1 HTTP — production default
Verified working for article audio. Official docs now list this under historical/小模型 docs, but the endpoint remains active and is Liz's reliable route from this server. Full parameter notes: V1 HTTP API.
This path still uses legacy App ID + Access Token in the JSON body and Authorization: Bearer; <AccessToken> — not DOUBAO_API_KEY / X-Api-Key. Bundled tts-generate.py matches this shape.
POST https://openspeech.bytedance.com/api/v1/tts
Authorization: Bearer; <AccessToken>
Content-Type: application/json(Bearer; with semicolon is intentional — official format.)
{
"app": {"appid": "APPID", "token": "TOKEN", "cluster": "volcano_tts"},
"user": {"uid": "unique_user_identifier"},
"audio": {
"voice_type": "zh_female_vv_uranus_bigtts",
"encoding": "mp3",
"speed_ratio": 1.0,
"volume_ratio": 1.0,
"pitch_ratio": 1.0
},
"request": {
"reqid": "uuid",
"text": "plain text",
"text_type": "plain",
"operation": "query",
"with_frontend": 1
}
}Success: code == 3000; audio in base64 data. Unique reqid per call (UUID).
Limits: Official small-model docs cite ~1024 UTF-8 bytes per request; HTTP also has a ~60s RPC timeout. For Liz's bigtts App, practical safe chunk size is ~1800–2000 characters. Chunks of 5000+ often fail with code:3031 / RPC timeout.
V3 / TTS 2.0 streaming — migration & realtime
Prefer for realtime / streaming text; keep V1 for batch article audio until a protocol helper is wired into scripts.
| Endpoint | Role |
wss://openspeech.bytedance.com/api/v3/tts/bidirection | Bidirectional stream (LLM token → audio) |
wss://openspeech.bytedance.com/api/v3/tts/unidirectional/stream | Full text in, audio stream out (WS) |
https://openspeech.bytedance.com/api/v3/tts/unidirectional | HTTP Chunked unidirectional |
https://openspeech.bytedance.com/api/v3/tts/unidirectional/sse | HTTP SSE unidirectional |
Bidirectional headers (new console):
X-Api-Key: $DOUBAO_API_KEY
X-Api-Resource-Id: seed-tts-2.0
X-Api-Connect-Id: <uuid>
X-Control-Require-Usage-Tokens-Return: *(DOUBAO_SPEECH_API_KEY / DOUBAO_TTS2_API_KEY aliases resolve to the same header value.)
Resource IDs: seed-tts-2.0 / seed-tts-1.0 / seed-tts-1.0-concurr / seed-icl-2.0 / seed-icl-1.0 (+ concurr). Full payload, additions (disable_markdown_filter, subtitles, dialects), and async long-text (/api/v3/tts/submit|query) → references/tts-streaming-v3.md. Official pages: 双向流式 TTS 2.0, V3 HTTP Chunked/SSE.
Known voices
Smoke-test voices on the current App rather than trusting a guide blindly. Common comparison set:
| voice_type | Notes |
zh_female_vv_uranus_bigtts | Default Vivi2.0 — model doubao-seed-tts-2.0; do not send emotion/neutral (ignored) |
zh_female_xueayi_saturn_bigtts | 薛艾依 / 绘本艾依 — observed working on V1 |
zh_female_wanwanxiaohe_moon_bigtts | Prior auth/resource mismatch — retest after package change |
zh_female_shuangkuaisisi_moon_bigtts | Prior auth/resource mismatch — retest after package change |
Vivi defaults: speed 1.0, volume 1.0, sample rate 24000, format mp3. If too lively, try speed 0.98 after a baseline at 1.0.
Discover voices via console or OpenAPI ListSpeakers / ListBigModelTTSTimbres.
Text cleaning checklist
MP3 is baked — clean before synthesize. Work in memory or /tmp; never modify the source manuscript for TTS.
- Strip YAML frontmatter (
---\n...\n---). - Cut from
## References/参考资料/Footnotes/脚注/Sources/引用/ Claim Check onward. - Strip all HTML (
<a id>,<span>, etc.). Leakage was read as "IA Intro". - Strip citation links entirely:
[N](#ref-N)→ remove (not bareN). - Strip MD:
#,**,*,[text](url)→text, images,---, backticks,>,[^N]. - Strip top audio links (
[收听音频版...](...)). - Save cleaned text under
/tmpfor audit.
Automated: scripts/strip-for-tts.py.
Article audio workflow
Skill dir:
SKILL_DIR="$HOME/.hermes/profiles/writing/skills/media/doubao-tts"
VENV_PY="/home/ubuntu/.hermes/hermes-agent/venv/bin/python3"- Clean:
python3 "$SKILL_DIR/scripts/strip-for-tts.py" <final.md> /tmp/<slug>-tts.txt - Generate (chunk → 2 parts under CF 25 MiB):
python3 "$SKILL_DIR/scripts/tts-generate.py" /tmp/<slug>-tts.txt /tmp/<slug>-tts/ <slug>
→<slug>-part1.mp3,<slug>-part2.mp3. Merge if total < 25 MiB:ffmpeg -y -i "concat:...-part1.mp3|...-part2.mp3" -c copy /tmp/<slug>-tts/<slug>.mp3 - Place site audio:
public/audio/articles/<slug>/<slug>.mp3(or project convention). - Link near top:
[收听音频版](/audio/articles/<slug>/<slug>.mp3). - Verify size, duration, link; push writing + site repos (writing Action syncs Markdown, not arbitrary local audio).
Audio-first stub (正文 not ready): minimal final.md with frontmatter + placeholder + audio link; copy MP3 into site public/audio/articles/; light sync checks only — not a full publish audit.
Multi-part source narration: boundary files tts-part-N.txt; text_type: plain; one MP3 + manifest per segment; ffprobe every file.
Chunking & quality
- Max ~2000 chars / request; split on
\n\n. - Concat:
ffmpeg -f concat -safe 0 -i list.txt -c copy out.mp3. - Group into 2+ parts for CF Pages 25 MiB/file limit.
- Prefer native Doubao bitrate (~160 kbps). Floor for publish: 96 kbps. Re-encode only if over limit:
ffmpeg -i in.mp3 -codec:a libmp3lame -b:a 96k -ac 1 out.mp3. Seereferences/cf-pages-size-limit.md.
Podcast (AI 播客)
Separate product from TTS. Full protocol: references/podcast-api.md. Session traps: references/podcast-session-learnings.md. Publish: references/lizliz.xyz-podcast-page.md. Official WS protocol: 播客 API websocket-v3.
wss://openspeech.bytedance.com/api/v3/sami/podcastttsNew console (preferred for new clients):
X-Api-Key: $DOUBAO_API_KEY
X-Api-Resource-Id: volc.service_type.10050
X-Api-App-Key: aGjiRDfUWi # fixed product key (still required by protocol docs)
X-Api-Request-Id: <uuid>Legacy / current podcast-generate.py headers:
X-Api-App-Id / X-Api-Access-Key / X-Api-Resource-Id: volc.service_type.10050
X-Api-App-Key: aGjiRDfUWi # fixedBinary frame message_type = 0b0001 (header byte1 0x14). Do not use TTS bidirectional 0b0011 → "unsupported message type (3)".
| action | Mode |
| 0 | Long-text / URL summarize → dual dialogue (default) |
| 3 | Direct nlp_texts dialogue synthesize |
| 4 | prompt_text web-search summarize |
Liz defaults (2026-07): action=0, mp3/24000/speech_rate=0, speakers dayi+mizai, random_order=false (male first), head+tail music on, AIGC watermarks off, strip MD first.
Default speakers: zh_male_dayixiansheng_v2_saturn_bigtts + zh_female_mizaitongxue_v2_saturn_bigtts. Alt pair: liufei + xiaolei. Official update (2026-03): TTS/ICL voices also allowed (same App as podcast); use speaker_info.speaker_additions for ICL model switches. New (2026-05): input_info.strict_audit.
Generate: $VENV_PY "$SKILL_DIR/scripts/podcast-generate.py" input.txt out.mp3
NLP-only transcript: scripts/extract-transcript.py (only_nlp_text). Prefer Flash ASR on the finished MP3 for subtitles (separate quota, matches actual audio).
ASR (语音→文字)
New console: same DOUBAO_API_KEY as TTS/Podcast (X-Api-Key). Legacy scripts: still use DOUBAO_TTS_APP_ID / DOUBAO_TTS_ACCESS_TOKEN with old header names.
Flash ASR — preferred ≤2h
One-shot; no submit/poll. Docs: 录音文件识别极速版 HTTP.
POST https://openspeech.bytedance.com/api/v3/auc/bigmodel/recognize/flashNew console headers:
X-Api-Key: $DOUBAO_API_KEY
X-Api-Resource-Id: volc.bigasr.auc_turbo
X-Api-Request-Id: <uuid>
X-Api-Sequence: -1Legacy / current asr-transcribe.py headers:
X-Api-App-Key / X-Api-Access-Key / X-Api-Resource-Id: volc.bigasr.auc_turbo
X-Api-Request-Id: <uuid> / X-Api-Sequence: -1{
"user": {"uid": "<APP_ID>"},
"audio": {"data": "<base64>"},
"request": {
"model_name": "bigmodel",
"enable_itn": true,
"enable_punc": true,
"enable_ddc": false,
"enable_speaker_info": true,
"show_utterances": true
}
}URL mode: "audio": {"url": "https://..."} instead of data.
| Param | Verbatim 逐字稿 | Clean reading |
enable_ddc | false (keep 嗯/啊/是吧) | true |
enable_punc | true | true |
enable_itn | true | true |
enable_speaker_info | true for podcasts | as needed |
Limits: ≤2h, ≤100 MB; WAV/MP3/OGG OPUS. Base64 inflates ~33% — prefer URL if raw > ~50 MB. Binary upload recommendation: keep under ~20 MB when possible.
Success header: X-Api-Status-Code: 20000000. Speaker in utterances[].additions.speaker.
| Code | Meaning |
| 20000000 | Success |
| 20000003 | Silent audio |
| 45000001 | Invalid params |
| 45000002 | Empty audio |
| 45000151 | Unsupported format |
| 55000031 | Server busy |
| 550xxxx | Internal error |
Script: scripts/asr-transcribe.py (maps ASR "1"/"2" → dayi/mizai for default podcast order).
Flash does not support customer-service extras: enable_emotion_detection, enable_gender_detection, enable_lid, show_volume, show_speech_rate (removed from Flash; use Standard).
Standard ASR — >2h or emotion / gender / LID
POST .../api/v3/auc/bigmodel/submit
POST .../api/v3/auc/bigmodel/queryResource IDs: volc.seedasr.auc (model 2.0) or volc.bigasr.auc (model 1.0). URL required (no base64). Docs: 录音文件识别标准版 HTTP. Feature matrix (emotion, diarization, ITN, etc.): 大模型录音文件识别能力表.
Emotion detection (enable_emotion_detection: true): Standard / streaming nostream / bidirectional-optimized ASR only. Labels: angry / happy / neutral / sad / surprise on utterance additions.emotion. Also: enable_gender_detection, enable_lid, show_volume, show_speech_rate.
Voice Minutes / 语音妙记
For separate interview recordings with native minutes, read the minutes playbook. It covers volc.lark.minutes, submit/query, the established Chinese-only parameters, bounded source delivery, duplicate-billing prevention and output review.
- Keep requested recordings separate. Preserve originals; distinguish remuxed originals from lossy recognition copies.
- Default to transcription + automatic speaker IDs + word timestamps + summary + chapters + todo/Q&A; no translation.
AllActivateselects bundled billing, not all features. Set each feature explicitly; retain the established billing choice unless an evidence-backed cost comparison justifies changing it.- Save task IDs and result files. A submit receipt is not completion; recover existing successful tasks by query/download, never by resubmission.
- Deliver separate readable Markdown and retain reviewed raw result JSON privately. Do not generate ZIP/SRT/TXT or publish/archive recordings by default.
No minutes client is bundled yet; the reference is the reusable contract, not a claim that the legacy ASR script implements minutes.
Failure signatures
| Signature | Meaning / action |
requested resource not granted | App lacks voice/resource — change package or voice |
resource ID is mismatched with speaker related resource | V3 resource/voice mismatch — use granted pair or V1 |
DNS fail speech.volcengineapi.com | Wrong host from this server — use openspeech.bytedance.com |
quota exceeded for types: text_words_lifetime | Lifetime words gone — stop retries; refresh package or ElevenLabs |
| Podcast: event 150 then silence | Quota exhaustion (no error frame) — do not retry |
code:3031 / RPC timeout | Chunk too large — shrink under ~2000 chars |
40200002 DeniedAccess:IllegalToken on SAMI | Wrong product line — need SAMI token, not TTS token |
websockets extra_headers TypeError | Use additional_headers (websockets ≥14) |
Quota APIs exist in console OpenAPI (QuotaMonitoring, UsageMonitoring, ResourcePacksStatus) — not wired in scripts; treat runtime quota errors as authoritative.
Beyond this skill
豆包语音 products here: TTS, Podcast, ASR, Voice Minutes (playbook; no bundled client). Adjacent (separate auth / out of default scripts):
- 声音复刻 ICL 1.0/2.0 (
seed-icl-*) - 异步长文本 TTS (
/api/v3/tts/submit|query) - 端到端实时语音大模型, 语音同传
- SAMI MusicTagging / 音源分离, 智能K歌, 豆包音乐模型
Details: references/volcengine-audio-ecosystem.md. Search Volcengine docs before assuming credential reuse.
Common Pitfalls
Text & cleaning
- Feeding raw
final.md→ reads MD/HTML/refs aloud. - HTML
<a id>leakage (#1 artifact) — strip all tags. - Citation
[N](#ref-N)left as bare numbers (#2) — remove entirely. - Partial-TTS requests still fed full article — trim first, then strip.
Auth & protocol
- Swapping
DOUBAO_API_KEYwith V1 Access Token (or putting Access Token inX-Api-Key) — formats are not interchangeable. - Starting new setups on the old console when the new console is available.
- Podcast
message_type=0b0011copied from TTS bidirectional samples. - ASR headers ≠ TTS V1
Authorization: Bearer;— useX-Api-*(new: Key alone; legacy: App-Key + Access-Key). - Wrong ASR resource ID (
volc.bigasr.auc_turbovsvolc.seedasr.aucvsvolc.bigasr.auc). - Assuming Flash ASR supports emotion detection — it does not.
- SAMI/MusicTagging with TTS credentials →
40200002.
Runtime & publish
- Scripts path: use
$SKILL_DIR/scripts/, not writing-reposcripts/. - Podcast/ASR need Hermes venv Python (
websockets). - Regenerating good audio only for provenance without being asked.
- Claiming deploy before site has both MP3 + Markdown link and CF Pages actually succeeded (CI green ≠ Pages deployed; 25 MiB trap).
- Expecting bundled scripts to read
DOUBAO_API_KEYalready — they still use legacy App ID / Access Token until migrated.
Verification Checklist
- Correct product chosen (TTS vs Podcast vs ASR vs Voice Minutes); for minutes also run the reference's completion checks
- Env present: prefer
DOUBAO_API_KEY(or alias); legacy App ID / Access Token if using bundled scripts (<set>check) - Cleaned
/tmptext audited — no YAML/HTML/citations/References - Voice / resource ID matches granted package
- Every MP3: non-trivial size,
ffprobeduration plausible, each file < 25 MiB - Article Markdown has intended audio link only
- Podcast: correct
message_type, event 150 not followed by silent hang - ASR: status
20000000; verbatim usesenable_ddc: false - Provider name visible if ElevenLabs fallback used
- After push: live URL or CF Pages deployment status checked if 404
Scripts & local references
SKILL_DIR="$HOME/.hermes/profiles/writing/skills/media/doubao-tts"
VENV_PY="/home/ubuntu/.hermes/hermes-agent/venv/bin/python3"| Path | Role |
scripts/strip-for-tts.py | MD → speakable plain text |
scripts/tts-generate.py | V1 chunked TTS → 2-part MP3 (legacy App ID / token) |
scripts/podcast-generate.py | Dual-speaker podcast WS (legacy headers) |
scripts/extract-transcript.py | Podcast NLP-only transcript JSON |
scripts/asr-transcribe.py | Flash ASR → subtitle JSON (legacy headers) |
references/doubao-minutes.md | Separate-recording native minutes, Chinese-only parameters, source delivery and safe recovery |
references/podcast-api.md | Podcast API + Liz defaults |
references/podcast-session-learnings.md | Protocol/quota/venv traps |
references/tts-streaming-v3.md | V3/TTS 2.0 streaming matrix |
references/volcengine-audio-ecosystem.md | SAMI / emotion / product boundaries |
references/cf-pages-size-limit.md | 25 MiB diagnostic |
references/lizliz.xyz-podcast-page.md | Site podcast publish |
references/2026-06-17-prigogine-audio.md | Historical session notes |
Split from doubao-elevenlabs-tts. Fallback skill: elevenlabs-tts.
References / 参考文献
Console & onboarding
- 火山引擎豆包语音新版控制台总览 — 推荐入口:充值/开通服务、创建并复制单一 API Key;新账号不要走旧控制台。
- 豆包语音产品简介与能力总览 — 产品体系与场景说明;拿不准该开哪个服务时把这篇甩给 AI。
- 播客服务旧版开通深链(service/10028) — 历史开通入口;新设置优先用新版控制台总览代替。
TTS
- 豆包语音合成 V1 HTTP(小模型/历史非流式) — Liz 当前文章音频生产路径:
/api/v1/tts、Authorization: Bearer;、base64 音频、reqid唯一性。 - 双向流式语音合成 WebSocket(TTS 2.0) —
wss://.../api/v3/tts/bidirection;X-Api-Key+seed-tts-2.0;会话事件与audio_params。 - HTTP Chunked / SSE 单向流式 V3 — 一次性送全文、流式出音频;资源 ID 与计费(
seed-tts-*/seed-icl-*)对照表。 - 豆包大模型音色列表(含 2.0) — 查
voice_type/ speaker;播客也可选用同表 TTS 音色(需同 App 授权)。
ASR
- 录音文件识别极速版 HTTP(Flash) — 一次请求返回结果;
volc.bigasr.auc_turbo;新控制台仅需X-Api-Key;明确不含情绪/性别等客服字段。 - 录音文件识别标准版 HTTP(submit/query) — >2h 或需 emotion/gender/LID;
volc.seedasr.auc/volc.bigasr.auc。 - 大模型语音识别能力对照表 — 流式 vs 文件、情绪检测、说话人分离、ITN/顺滑等功能矩阵。
Podcast
- 语音播客大模型 API(websocket-v3) —
podcasttts端点、二进制帧、action 0/3/4、strict_audit、event 150–363、发音人对。
Change log
2026-10-26 → v1.3.0
- Added the established separate-recording Voice Minutes playbook and entry routing; existing TTS/Podcast/Flash code paths unchanged.
- Made Chinese-only useful features, billing-versus-feature semantics, bounded source delivery and query-only recovery explicit.
- Kept private recordings, transcripts, credentials and per-run receipts outside the reusable skill.
2026-07-30 nuance → v1.2.0
- Added Onboarding for new console: top up → single API Key → one key for TTS/ASR/Podcast; prefer new console over old.
- Promoted canonical
DOUBAO_API_KEY(DOUBAO_SPEECH_API_KEY/DOUBAO_TTS2_API_KEYaliases); moved App ID / Access Token under Legacy auth. - Overview: 豆包语音 framed as top-tier Chinese speech AI.
- Replaced bare doc bookmarks with annotated References / 参考文献; linked console + product overview + API pages inline where cited.
- Documented new-console header shapes alongside legacy script headers; noted scripts not yet migrated off legacy env vars.
- Pitfalls/checklist updated for single-key vs legacy mismatch.
2026-07-30 audit → v1.1.0
- Restructured to Hermes best-practice shape: Overview, When to Use (+ don'ts), product sections, organized Pitfalls, Verification Checklist.
- Completed frontmatter:
version,author,license,tags,related_skills; description now starts withUse when. - Verified V1/Flash/Standard/Podcast endpoints against official docs; confirmed
Bearer;and Flash resourcevolc.bigasr.auc_turbo. - Added V3 streaming matrix (bidirectional / unidirectional WS / HTTP Chunked / SSE) +
references/tts-streaming-v3.md. - Corrected emotion detection: Standard/streaming only — not Flash ASR.
- Documented new vs old console auth (
X-Api-Keyalone vs App-Key + Access-Key). - Podcast: noted
strict_audit,aigc_metadata, TTS/ICL speakers +speaker_additions(official 2026-03/05 updates). - Noted V1 listed under historical docs but remains production path; official 1024-byte small-model limit vs observed ~2k-char chunk practice.
- Flagged QuotaMonitoring/UsageMonitoring OpenAPI existence; adjacent products (async long-text, S2S, 同传, 妙记, ICL).
- Script paths confirmed under
media/doubao-tts; venv path documented; strip script aligned to multi-name References cut.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

