Communitygithub.com

Doubao TTS (TTS + 팟캐스트 + ASR)

AI 코딩 어시스턴트를 위한 다운로드 가능한 에이전트 스킬 — 랜딩 페이지 복제, WebGL Three.js 배경, Doubao TTS 및 팟캐스트, 비디오 스크립트, GEO 구직, DESIGN.md 시각 시스템. 압축 풀고 사용하세요. MIT 라이선스.

Doubao TTS (TTS + 팟캐스트 + ASR)란 무엇인가요?

이 스킬은 Doubao/Volcengine(豆包语音) 음성 AI 제품군을 AI 코딩 어시스턴트(예: Claude Code, Cursor, Codex)와 통합하여 텍스트-음성(TTS), AI 듀얼 스피커 팟캐스트 생성, 그리고 화자 분리가 포함된 음성-텍스트(ASR) 변환을 지원합니다. 새로운 콘솔 환경에서는 단일 API 키(`DOUBAO_API_KEY`)로 모든 서비스에 인증할 수 있어 설정이 간소화되었습니다. 이 스킬은 음성 생성 전 마크다운 정리, 효율적인 청크 분할 및 결합, Cloudflare Pages의 25MiB 파일 크기 제한 처리를 포함한 완전한 오디오 워크플로우를 제공합니다. Doubao를 최상위 중국어 음성 AI로 권장하며, ElevenLabs는 최후의 대체 수단으로만 사용합니다. 또한 V1 HTTP 및 V3 스트리밍 엔드포인트를 모두 포괄하며, 레거시 App ID/Access Token 인증과 새로운 콘솔 API 키 인증을 모두 지원합니다.

지원 대상~Claude Code✓Codex CLI~Cursor
npx skills add lizliz404/agent-skills

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Doubao TTS (TTS + 팟캐스트 + ASR)은(는) 무엇을 하나요?

개요

Doubao / Volcengine(豆包语音)은 최고 수준의 중국어 음성 AI로 널리 인정받고 있으며, Liz의 글쓰기 파이프라인에서 품질 기본 공급자입니다. 차단되지 않는 한 일반 TTS 대안보다 火山引擎豆包을 선호하세요.

이 스킬은 세 가지 豆包语音 제품을 다룹니다: TTS(텍스트→음성, 기사 오디오용), 팟캐스트(AI 듀얼 스피커 대화), ASR(선택적 화자 분리가 포함된 음성→텍스트). 새 콘솔에서는 하나의 API 키가 X-Api-Key를 통해 이 서비스들에 인증할 수 있습니다. 엔드포인트와 리소스 ID는 제품마다 여전히 다릅니다.

ElevenLabs는 더 깔끔한 HTTP API를 제공하지만 이 워크플로우를 위한 선호 음성/모델 품질이 약합니다 — 최후의 대체 수단으로만 사용하세요(elevenlabs-tts). 편의를 위해 선택하지 마세요.

온보딩 (새 콘솔 — 권장)

새로운 설정에서는 구 콘솔에서 시작하지 마세요 — 탐색이 더 어렵습니다. 새 豆包语音 콘솔을 사용하세요:

  1. 火山引擎豆包语音新版控制台를 엽니다.
  2. 필요한 음성 제품(TTS, ASR, 팟캐스트 등)을 충전/활성화합니다.
  3. 새 콘솔의 API 키 관리에서 단일 API 키를 생성하거나 복사합니다.
  4. 아래 글쓰기 프로필 시크릿 경로에 DOUBAO_API_KEY(정식 키)로 저장합니다. 별칭 DOUBAO_SPEECH_API_KEY / 레거시 DOUBAO_TTS2_API_KEY도 허용됩니다.
  5. 키를 에이전트에 전달합니다. 인증 또는 제품 라우팅이 명확하지 않으면 豆包语音产品简介 / 能力总览文档(또는 참고 자료 / 参考文献의 관련 API 페이지)도 함께 전달하세요.

하나의 키, 여러 서비스: 새 콘솔에서 충전하면 해당 API 키가 TTS, ASR(음성→텍스트), 팟캐스트 생성 및 X-Api-Key를 허용하는 관련 豆包语音 호출의 자격 증명이 됩니다. 새 콘솔 워크플로우에서는 별도의 App ID + Access Token 쌍이 더 이상 필요하지 않습니다.

기존 번들 스크립트(tts-generate.py, podcast-generate.py, asr-transcribe.py)는 여전히 레거시 App ID / Access Token 환경 변수와 이전 콘솔 헤더 형식을 읽습니다. 스크립트가 마이그레이션될 때까지 해당 변수를 유지하세요. 새 에이전트 코드는 DOUBAO_API_KEY + X-Api-Key를 선호합니다.

사용 시기

  • TTS: Liz가 글쓰기 프로젝트, final.md, 에세이 또는 lizliz.xyz 게시물을 음성 오디오로 변환하도록 요청합니다(豆包 / 火山引擎 / ByteDance TTS).
  • 팟캐스트: Liz가 기사, TXT, URL 또는 주제를 듀얼 스피커 AI 팟캐스트로 변환하도록 요청합니다(豆包语音播客大模型). 별도 제품 — 새 콘솔을 통해 활성화하세요(레거시 활성화 딥링크도 참고 자료에 나열됨).
  • ASR: Liz가 MP3 / WAV / OGG / 음성 메모 / 비디오 오디오를 있는 그대로의 텍스트로 변환하도록 요청합니다(Flash ASR 선호).
  • Doubao 음성, 페이로드, 기사 오디오 배치, lizliz.xyz 오디오 링크 또는 ASR 품질 디버깅.

사용하지 말아야 할 경우:

  • ElevenLabs 우선 생성 → elevenlabs-tts
  • 음악 태깅 / 소스 분리 / MIDI / 비트 감지 → 별도 SAMI / 智能K歌 제품 라인(references/volcengine-audio-ecosystem.md 참조)
  • 실시간 S2S 음성 에이전트 → 端到端实时语音大模型(범위 외, 참고 자료 참조)

핵심 규칙

  1. 마크다운을 소리 내어 읽지 마세요. YAML, 제목 마커, 강조, 각주, 테이블 파이프, 수평선, 원시 URL, 이미지, 코드 펜스를 제거하세요. 단, 내용 자체가 발화되어야 하는 경우는 예외입니다.
  2. 기본적으로 참고 자료/각주를 나레이션하지 마세요. References/参考资料/Footnotes/脚注/Sources/引用 이전에서 중단하세요. Liz가 요청하는 경우에만 출처 부록 오디오를 제공하세요.
  3. 기사 음성을 유지하세요. 중국어 문장 부호 리듬, 단락 나누기, 인용문 및 영어 기술 용어를 보존하세요.
  4. Liz가 이미 기본값을 선택한 경우 다중 음성 스모크 테스트를 건너뛰세요.
  5. 기본 음성: zh_female_vv_uranus_bigtts (Vivi2.0). Liz가 다른 음성을 선택하거나 할당량이 차단되지 않는 한 사용합니다.
  6. 프로덕션 TTS 경로: cluster: volcano_tts와 함께 검증된 V1 https://openspeech.bytedance.com/api/v1/tts. V3 스트리밍은 마이그레이션/실시간 경로이며, 기사 기본값이 아닙니다.
  7. **새 작업에는 새 콘솔 DOUBAO_API_KEY**를 선호하세요. 마이그레이션될 때까지 기존 스크립트 또는 V1 Bearer 페이로드에 대해서만 레거시 App ID / Access Token을 유지하세요.
  8. ElevenLabs는 최후의 수단으로만 사용하세요 — 할당량/인증/플랫폼 실패 또는 명시적 요청 시. 파일 이름/매니페스트에 공급자를 표시하세요.
  9. Liz가 Doubao TTS / 기사 오디오를 언급할 때 이 스킬부터 시작하세요 (skill_view / 레지스트리) — 묻힌 노트를 광범위하게 검색하지 마세요.

환경 계약

시크릿은 이 파일 밖에 보관하세요. 변수 이름과 경로만 기록하세요.

정식 시크릿 + 심볼릭 링크:

/home/ubuntu/.hermes/secrets/doubao-tts.env
/home/ubuntu/.hermes/secrets/elevenlabs.env
/home/ubuntu/.hermes/profiles/writing/.env.d/*.env -> /home/ubuntu/.hermes/secrets/*.env
/home/ubuntu/.hermes/profiles/trading/.env.d/*.env -> /home/ubuntu/.hermes/secrets/*.env
/home/ubuntu/.hermes/.env.d/*.env -> /home/ubuntu/.hermes/secrets/*.env

편리할 때 프로필 .env에도 미러링하세요(이전 스크립트는 .env만 소스합니다). 새 스크립트는 .env 및 .env.d/*.env를 로드해야 합니다.

글쓰기 프로필 홈: /home/ubuntu/.hermes/profiles/writing/.env

권장: 단일 API 키 (새 콘솔)

DOUBAO_API_KEY=...                 # 정식 — TTS / ASR / 팟캐스트용 X-Api-Key (새 콘솔)
# 허용된 별칭 (동일한 값):
DOUBAO_SPEECH_API_KEY=...
DOUBAO_TTS2_API_KEY=...            # TTS 2.0 샘플의 역사적 이름; 별칭으로 유지

새 코드의 해석 순서: DOUBAO_API_KEY → DOUBAO_SPEECH_API_KEY → DOUBAO_TTS2_API_KEY.

선택 사항(공유): DOUBAO_TTS_CLUSTER=volcano_tts, DOUBAO_TTS_VOICE_TYPE=zh_female_vv_uranus_bigtts.

레거시 인증 (이전 콘솔) — 기존 스크립트 / V1 HTTP

새 설정에는 사용 중단됨. tts-generate.py, podcast-generate.py, asr-transcribe.py가 여전히 필요로 하는 동안 유지하세요.

DOUBAO_TTS_APP_ID=...              # 이전 콘솔 App ID → X-Api-App-Key / X-Api-App-Id / V1 app.appid
DOUBAO_TTS_ACCESS_TOKEN=...        # 이전 Access Token → X-Api-Access-Key / V1 Authorization: Bearer; …
DOUBAO_TTS_SECRET_KEY=...          # 선택 사항; 일부 SDK 변형

별칭(호환): VOLCENGINE_TTS_*, VOLC_TTS_*.

경로인증 형식
새 콘솔X-Api-Key: $DOUBAO_API_KEY 만 사용 (ASR Flash, TTS V3 및 관련 새 콘솔 API)
이전 콘솔 / 현재 스크립트X-Api-App-Key/X-Api-App-Id + X-Api-Access-Key, 또는 V1 Authorization: Bearer; <token> + JSON app.appid/app.token

API 키를 V1 Bearer; 헤더에 넣거나 Access Token을 X-Api-Key에 상호 교환하여 넣지 마세요 — 형식이 다릅니다.

셸 내보내기 주의사항 — 일반 source .env는 하위 Python으로 내보내지 않을 수 있습니다:

set -a; . /home/ubuntu/.hermes/profiles/writing/.env; set +a

존재 확인 (시크릿 덤프 금지):

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>")
PY

DOUBAO_API_KEY(또는 별칭)도 레거시 App ID / Access Token도 설정되지 않은 경우: 중단하세요. Edge/OpenAI로 대체하거나 Doubao 오디오가 생성되었다고 주장하지 마세요.


TTS (文字→语音)

V1 HTTP — 프로덕션 기본값

기사 오디오에 대해 검증되어 작동 중입니다. 공식 문서는 이제 이를 역사적/소모델 문서에 나열하지만, 엔드포인트는 활성 상태로 유지되며 이 서버에서 Liz의 신뢰할 수 있는 경로입니다. 전체 매개변수 참고: V1 HTTP API.

이 경로는 여전히 JSON 본문과 Authorization: Bearer; <AccessToken>에서 레거시 App ID + Access Token을 사용합니다 — DOUBAO_API_KEY / X-Api-Key가 아닙니다. 번들된 tts-generate.py가 이 형식과 일치합니다.

POST https://openspeech.bytedance.com/api/v1/tts
Authorization: Bearer; <AccessToken>
Content-Type: application/json

(Bearer; with semicolon은 의도적입니다 — 공식 형식입니다.)

{
  "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
  }
}

성공: code == 3000; data의 base64 오디오. 호출당 고유 reqid (UUID).

제한: 공식 소모델 문서는 요청당 ~1024 UTF-8 바이트를 인용합니다. HTTP에도 약 60초 RPC 시간 제한이 있습니다. Liz의 bigtts App의 경우 실질적인 안전 청크 크기는 ~1800–2000자입니다. 5000자 이상의 청크는 종종 code:3031 / RPC timeout으로 실패합니다.

V3 / TTS 2.0 스트리밍 — 마이그레이션 및 실시간

실시간/스트리밍 텍스트에 선호합니다. 프로토콜 도우미가 스크립트에 연결될 때까지 배치 기사 오디오에는 V1을 유지하세요.

엔드포인트역할
wss://openspeech.bytedance.com/api/v3/tts/bidirection양방향 스트림 (LLM 토큰 → 오디오)
wss://openspeech.bytedance.com/api/v3/tts/unidirectional/stream전체 텍스트 입력, 오디오 스트림 출력 (WS)
https://openspeech.bytedance.com/api/v3/tts/unidirectionalHTTP Chunked 단방향
https://openspeech.bytedance.com/api/v3/tts/unidirectional/sseHTTP SSE 단방향

양방향 헤더 (새 콘솔):

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 별칭은 동일한 헤더 값으로 해석됩니다.)

리소스 ID: seed-tts-2.0 / seed-tts-1.0 / seed-tts-1.0-concurr / seed-icl-2.0 / seed-icl-1.0 (+ concurr). 전체 페이로드, 추가 사항(disable_markdown_filter, 자막, 방언) 및 비동기 긴 텍스트(/api/v3/tts/submit|query) → references/tts-streaming-v3.md. 공식 페이지: 双向流式 TTS 2.0, V3 HTTP Chunked/SSE.

알려진 음성

맹목적으로 가이드를 신뢰하기보다는 현재 App에서 음성을 스모크 테스트하세요. 일반적인 비교 세트:

voice_type참고
zh_female_vv_uranus_bigtts기본값 Vivi2.0 — 모델 doubao-seed-tts-2.0; emotion/neutral을 보내지 마세요 (무시됨)
zh_female_xueayi_saturn_bigtts薛艾依 / 绘本艾依 — V1에서 작동 확인됨
zh_female_wanwanxiaohe_moon_bigtts이전 인증/리소스 불일치 — 패키지 변경 후 재테스트
zh_female_shuangkuaisisi_moon_bigtts이전 인증/리소스 불일치 — 패키지 변경 후 재테스트

Vivi 기본값: 속도 1.0, 볼륨 1.0, 샘플레이트 24000, 형식 mp3. 너무 활기차면 1.0 기준 후 속도 0.98을 시도하세요.

콘솔 또는 OpenAPI ListSpeakers / ListBigModelTTSTimbres를 통해 음성을 찾으세요.

텍스트 정리 체크리스트

MP3는 구워집니다 — 합성 전에 정리하세요. 메모리 또는 /tmp에서 작업하고, TTS를 위해 소스 원고를 절대 수정하지 마세요.

  1. YAML 머리말 제거 (---\n...\n---).
  2. ## References / 参考资料 / Footnotes / 脚注 / Sources / 引用 / Claim Check 이후부터 잘라냅니다.
  3. 모든 HTML 제거 (<a id>, <span> 등). 누출은 "IA Intro"로 읽혔습니다.
  4. 인용 링크를 완전히 제거: [N](#ref-N) → 제거 (숫자 N만 남기지 않음).
  5. MD 제거: #, **, *, [text](url)→text, 이미지, ---, 백틱, >, [^N].
  6. 상단 오디오 링크 제거 ([收听音频版...](...)).
  7. 감사용으로 정리된 텍스트를 /tmp에 저장합니다.

자동화: scripts/strip-for-tts.py.

기사 오디오 워크플로우

스킬 디렉토리:

SKILL_DIR="$HOME/.hermes/profiles/writing/skills/media/doubao-tts"
VENV_PY="/home/ubuntu/.hermes/hermes-agent/venv/bin/python3"
  1. 정리: python3 "$SKILL_DIR/scripts/strip-for-tts.py" <final.md> /tmp/<slug>-tts.txt
  2. 생성 (청크 → CF 25 MiB 미만의 2개 부분):
    python3 "$SKILL_DIR/scripts/tts-generate.py" /tmp/<slug>-tts.txt /tmp/<slug>-tts/ <slug>
    → <slug>-part1.mp3, <slug>-part2.mp3. 총합이 25 MiB 미만이면 병합:
    ffmpeg -y -i "concat:...-part1.mp3|...-part2.mp3" -c copy /tmp/<slug>-tts/<slug>.mp3
  3. 사이트 오디오 배치: public/audio/articles/<slug>/<slug>.mp3 (또는 프로젝트 규칙).
  4. 상단 근처에 링크: [收听音频版](/audio/articles/<slug>/<slug>.mp3).
  5. 크기, 길이, 링크 확인; 글쓰기 + 사이트 저장소 푸시(글쓰기 Action은 임의의 로컬 오디오가 아닌 Markdown을 동기화합니다).

오디오 우선 스텁 (본문 준비 안 됨): 머리말 + 자리 표시자 + 오디오 링크가 포함된 최소 final.md; MP3를 사이트 public/audio/articles/에 복사; 가벼운 동기화 확인만 — 전체 게시 감사는 아닙니다.

다중 부분 소스 나레이션: 경계 파일 tts-part-N.txt; text_type: plain; 세그먼트당 하나의 MP3 + 매니페스트; 모든 파일 ffprobe.

청킹 및 품질

  • 요청당 최대 ~2000자; \n\n에서 분할.
  • 연결: ffmpeg -f concat -safe 0 -i list.txt -c copy out.mp3.
  • CF Pages 25 MiB/파일 제한을 위해 2개 이상의 부분으로 그룹화.
  • 기본 Doubao 비트레이트(~160 kbps) 선호. 게시 최소: 96 kbps. 제한 초과 시에만 재인코딩: ffmpeg -i in.mp3 -codec:a libmp3lame -b:a 96k -ac 1 out.mp3. references/cf-pages-size-limit.md 참조.

팟캐스트 (AI 播客)

TTS와 별도 제품. 전체 프로토콜: references/podcast-api.md. 세션 트랩: references/podcast-session-learnings.md. 게시: references/lizliz.xyz-podcast-page.md. 공식 WS 프로토콜: 播客 API websocket-v3.

wss://openspeech.bytedance.com/api/v3/sami/podcasttts

새 콘솔 (새 클라이언트에 권장):

X-Api-Key: $DOUBAO_API_KEY
X-Api-Resource-Id: volc.service_type.10050
X-Api-App-Key: aGjiRDfUWi   # 고정 제품 키 (프로토콜 문서에서 여전히 필요)
X-Api-Request-Id: <uuid>

레거시 / 현재 podcast-generate.py 헤더:

X-Api-App-Id / X-Api-Access-Key / X-Api-Resource-Id: volc.service_type.10050
X-Api-App-Key: aGjiRDfUWi   # 고정

바이너리 프레임 message_type = 0b0001 (헤더 바이트1 0x14). TTS 양방향 0b0011을 사용하지 마세요 → "unsupported message type (3)".

action모드
0긴 텍스트 / URL 요약 → 듀얼 대화 (기본값)
3직접 nlp_texts 대화 합성
4prompt_text 웹 검색 요약

Liz 기본값 (2026-07): action=0, mp3/24000/speech_rate=0, 화자 dayi+mizai, random_speaker=true, 배경 음악 없음.

관련 스킬