CommunityCodierung & Entwicklunggithub.com

chinese-tts

Lässt Programme chinesischen Text (mit Englisch, Zahlen, Links, Code) für TTS korrekt vorlesen: Textnormalisierung und Sprachsynthese-Engineering. Inklusive 139 geprüfter Referenzfälle und Prüfskript.

Was ist chinese-tts?

Dieser Skill ist spezialisiert auf die Textnormalisierung (TN) für chinesische Text-to-Speech (TTS) Systeme und deren Engineering. Er behandelt die korrekte Umwandlung von Zahlen, Daten, Telefonnummern, Einheiten, Prozenten, Bereichen und Internet-Slang in die gesprochene Form (z.B. „2026年“ → „èr líng èr liù nián“ vs. „26年“ → „èr shí liù nián“). Besonderes Augenmerk liegt auf der Bewältigung von Streaming-Herausforderungen: Hier müssen unvollständige Token (z.B. „26“ in „26年“) zurückgehalten werden, bis der Kontext eindeutig ist. Der Skill bietet eine vollständige Pipeline (Filterung → TN → Satztrennung → Synthese), Referenzfälle zur Validierung (115+24 Fälle) und ein Prüfskript (`check-tn.mjs`). Für das Engineering behandelt er die Auswahl lokaler TTS-Engines (Kokoro, Matcha, CosyVoice, Qwen3-TTS, sherpa-onnx, vLLM, WSL2) unter Berücksichtigung von First-Byte-Latenz, Caching (6 ms vs. 2.6–3 s), korrektem Abbruch (spart 4.9 s), Fallback-Quellen und GPU-Speicher. Das Skill ist ideal für Entwickler von Sprachassistenten, Hörbüchern, KI-Charakterstimmen oder TTS-Vorverarbeitungspipelines, die mit chinesischem Text arbeiten.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RedCarpG/redcarpg-skills/tree/HEAD/skills/chinese-tts

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Chinesische Sprachsynthese: Textnormalisierung und Engineering

Dieser Skill stammt von einem KI-Schreibtischhaustier, das täglich spricht (siehe „Quelle und Wartung“ am Ende): Claude-Streaming-Antworten werden Satz für Satz an die lokale TTS-Engine übergeben. Die untenstehenden Regeln sind getestet, die Zahlen sind gemessen.

Ein-Satz-Prinzip: Die Aussprache wird in dieser Schicht konvertiert, die Engine kümmert sich nur um die Phonetik. Wird der konvertierte Text einer anderen Engine übergeben, ändert sich die Aussprache; bei Verwendung eines fertigen TN-Bibliothek verschlechtern sich einige Stellen. Fertige Bibliotheken (wetext, PaddleSpeech) werden zum Vergleich und zur Regelergänzung herangezogen.

Ablauf

Streaming-Text aus dem Modell
  → ① Filtern: Dekorationen, Emojis, Listensymbole entfernen; Codeblöcke, Tabellen, Links durch einen Satz ersetzen (beim Streaming müssen getrennte Token erkannt werden)
  → ② Konvertierung in Aussprache: Zahlen, Zeiten, Einheiten, Symbole, Aussprache-Ersetzungstabelle (beim Streaming an Token-Grenzen festhalten)
  → ③ Satztrennung: Erster Abschnitt bis zum ersten Komma; danach bei mehr als 40 Zeichen am Komma trennen
  → ④ Synthese: Nur etwa 20 Sekunden vorausberechnen; beim Unterbrechen die Inferenz wirklich stoppen

Die Reihenfolge darf nicht geändert werden: Erst Aussprache-Konvertierung, dann Satztrennung. Bei zuerst getrennten Sätzen traten im Test drei Fehler auf:

OriginalErgebnis nach SatztrennungProblem
下午14:30开会下午14: / 30开会Doppelpunkt als Komma interpretiert, Zeit getrennt
看这里:https://…/pull/7 就行https: / //…/pull/7 就行Link in zwei Hälften geteilt, Adresse buchstabiert
大概3~5天大概35天~ als Dekoration entfernt, gelesen als „fünfunddreißig Tage“

Halbbreiter Doppelpunkt : wird nur als Komma behandelt, wenn danach ein Leerzeichen kommt.

Streaming: Token-Grenzen beachten

Ein ganzer Satz kann korrekt konvertiert sein, aber beim Streaming nicht. Bei zeichenweisem Streaming werden „工作了26年“ und „80年代“ als „Er liu nian“ (二六年) bzw. „Ba ling nian dai“ (八零年代) gelesen, weil die Zeichen nach der Zahl noch nicht da sind; -10°C wird als Englisch gelesen.

  • Bei Zahlen auf 2 weitere Zeichen warten, bevor sie freigegeben werden; Einheiten auch mit Leerzeichen erkennen („跑了 5 “ zunächst zurückhalten, auf km warten).
  • Beim Übergang zum nächsten Abschnitt die letzten chinesischen Zeichen des vorherigen Abschnitts mitnehmen (um „了 26 年“ zu erkennen, muss „了“ zuvor gesehen werden).
  • Maximal 200 Zeichen zurückhalten, bei Codeblöcken/Tabellen maximal 4000 Zeichen; bei Erreichen des Limits freigeben.
  • Jeder Test wird sowohl „Zeichen für Zeichen“ als auch „als ganzer Satz“ durchgeführt; die Ergebnisse müssen identisch sein.

Schnellsuche-Regeln (Details in references/rules.md)

KategorieBeispielAussprache
Jahr2026年, 2026届, 26年见Ziffer für Ziffer: èr líng èr liù nián, èr líng èr liù jiè, èr liù nián jiàn
Anzahl Jahre工作了26年, 80年代, 26年前Nach Anzahl: èr shí liù nián, bā shí nián dài, èr shí liù nián qián
NummernTelefon, SMS-Code, 编号27149, 房间1201Ziffer für Ziffer, 1 als „yāo“; Bindestriche und Leerzeichen erzeugen Pause
Fünfstellige Zahlen95588 / Preis 12999Kein Maß, nicht auf 0 endend, nicht vorher Geld → Nummer; sonst nach Anzahl
Internet-Slang666, 2333, 520 allein / 666个赞, 花了888Ziffer für Ziffer / Nach Anzahl (nur eine feste Liste)
2 vor Einheit2个, 2L, 2℃liǎng ge, liǎng shēng; außer Temperatur: èr shè shì dù
Einheit60km/h, 3kWh, 5min, 10mgměi xiǎo shí liù shí gōng lǐ, sān dù diàn, wǔ fēn zhōng, shí háo kè
Nicht konvertierte Einheiten4g网络, 5A景区, 16GBOriginal an Engine übergeben
Bereich, Prozent3~5%, 3-5km, -1.5~2bǎi fēn zhī sān dào wǔ, sān dào wǔ gōng lǐ, fù yī diǎn wǔ dào èr
Uhrzeit14:30, 13:00, 9:05shí sì diǎn bàn, shí sān diǎn, jiǔ diǎn líng wǔ (24-Stunden-Format)
Datum, Bruch10/26 交 / 有7/12的观众shí yuè èr shí liù hào / shí èr fēn zhī qī (nur nach „有, 占, 约“ als Bruch)
Symbole#15, 2x, x3, 100wshí wǔ hào, liǎng bèi, chéng sān, yī bǎi wàn

Mit Referenzfällen prüfen

references/golden-cases.json enthält 115 ganze Fälle und 24 Streaming-Fälle, die alle vom Originalprojekt geprüft wurden. scripts/check-tn.mjs testet deine Implementierung damit:

node scripts/check-tn.mjs ./my-tn.mjs                  # Modul exportiert normalize(text) und (optional) createStream()
node scripts/check-tn.mjs ./my-tn.mjs --only 号码      # Nur eine Gruppe testen
  • Beim Vergleich werden Leerzeichen und übliche Satzzeichen ignoriert, nur die Aussprache wird verglichen. Fälle mit note sind „zur Referenz“ und zählen nicht als Fehler.
  • Beim Neuschreiben von TN als Abnahmekriterium verwenden; beim Ändern von Regeln einmal ausführen, um Regressionen zu vermeiden.
  • Umstrittene Aussprachen (z.B. „dieser Computer 12999“ wird als Nummer behandelt) wurden im Originalprojekt akzeptiert. Wenn dein Produkt andere Aussprachen möchte, ändere die Referenzfälle und begründe die Änderung.

Fehlersuche bei falscher Aussprache

Vier Ursachen: Der Text wurde vor der Aussprache-Konvertierung nicht als solcher erkannt; Mehrlautzeichen wurden vom Modell falsch erraten; die Referenzaufnahme ist fehlerhaft; zufällig (einfach nochmal generieren).

Denselben Satz mit der aktuellen Stimme und zwei anderen Stimmen vorlesen: Alle Stimmen machen denselben Fehler → Aussprache-Ersetzungstabelle ergänzen; nur eine Stimme klingt seltsam → Stimme wechseln. Jedes Mal Originaltext und konvertierte Aussprache in ein Log (jsonl) schreiben, um später nachzuschlagen.

Engineering (Details in references/engines.md)

  • First-Byte-Latenz: Der erste Abschnitt wird nur bis zum ersten Komma getrennt. Bei Matcha liegt die Latenz bei 0,65 Sekunden nach dem ersten Zeichen.
  • Effektivste Optimierung: Caching. Ein nie synthetisierter Satz benötigt bei CosyVoice 2,6–3 Sekunden für den ersten Block; ein Cache-Treffer dauert 6 ms. Sobald der Nutzer den Mund öffnet, wird ein Fülltext („嗯“, „我想想“) vorab synthetisiert.
  • Abbruch muss die Inferenz wirklich stoppen: Wird die vLLM-Verbindung getrennt, abort_request aufrufen; sonst wartet der nächste Satz 4,9 Sekunden (nach Implementierung 0,8–1,7 Sekunden).
  • Englisch wird still ignoriert: Manche Engines sprechen GitHub, PR, % nicht; vor Engine-Upgrade die englische Aussprache erneut validieren.
  • Fallback-Quelle: Wenn die Hauptquelle nicht bereit ist oder beim ersten Fehler ausfällt, auf Fallback umschalten; bei Fehlern mitten im Satz nicht wiederholen. Dass der HTTP-Service läuft, bedeutet nicht, dass das Modell geladen ist; bei 503-Fehlern wiederholen.

Quelle und Wartung

  • Quelle: Cirra (KI-Schreibtischhaustier, RedCarpG/cirra-deskpet) und sein Sprachdienst cirra-voice, 2026-10 bis 2026-11.
    • Code: sidecar/src/tts/speech/ (numbers.ts, units.ts, links.ts, filter.ts, overrides.ts, speech.test.ts), sidecar/src/tts/splitter.ts, sidecar/src/tts/pronunciations.ts.
    • Dokumentation: docs/speech.md, docs/speech-tn.md (119 Sätze mit drei Vergleichstabellen), docs/tts.md, docs/voices.md, docs/voice-chat.md, docs/voice-chat-2.md, docs/voice-install.md, docs/perf-checkup.md.
    • Erfahrungen: Private Repo lessons/chinese-tts.md.
  • Ursprung: RedCarpG/redcarpg-skills unter skills/chinese-tts/. Die Kopie in ~/.claude/skills/ ist eine installierte Instanz; nicht direkt bearbeiten. references/golden-cases.json wurde am 2026-11-10 aus Cirras speech.test.ts per Skript extrahiert; keine automatische Synchronisation.
  • Änderungen vornehmen:
    • Im redcarpg-skills-Repo ändern, per Pull Request; manifest.json Version erhöhen, node scripts/validate.mjs bestehen lassen, dann Tag chinese-tts-v<version> setzen und veröffentlichen; danach lokale Kopie neu installieren. Zuerst lessons/chinese-tts.md auf neue Einträge prüfen.
    • Wenn Cirras TN-Regeln sich ändern, die Referenzfälle neu extrahieren (Extraktionsmethode: Aus speech.test.ts die Gruppe readNumbers und die „Streaming“-Gruppe der Paare [Original, Aussprache] lesen) und mit Cirras sidecar/dist/tts/ einen Adapter bereitstellen, der check-tn.mjs ausführt; alle Tests sollten bestehen.
    • Die Engine-Zahlen (Latenz, Echtzeitfaktor, GPU-Speicher) wurden im Oktober 2026 auf einem Computer mit 8 GB GPU-Speicher und CPU ohne VNNI gemessen; bei anderer Hardware neu messen.
  • Änderungsprotokoll:
    • 2026-11-12 · 1.0.0, in redcarpg-skills öffentlich veröffentlicht. Lokale absolute Pfade entfernt, Quellprojekt als Link angegeben; Inhalt unverändert.
    • 2026-11-10 · Cirra · Erstveröffentlichung: Ablauf und Reihenfolge, Streaming-Grenzen, Regelschnellsuche und Details, Fehlersuche bei falscher Aussprache, Engine-Engineering; 139 Referenzfälle und check-tn.mjs (mit Cirras Implementierung getestet, alle bestanden); zwei Test-Prompts in evals/.

Individual skills in this repo

This repo contains 5 individual skills — each has its own dedicated page.

frontend-verification

改完网页/前端界面(CSS、布局、组件、动画、响应式、深色模式、打印)之后怎样验证并拿出证据:先用内置浏览器预览,覆盖不到时用无头 Chrome 截图或读 DOM(预览面板被隐藏、批量截多个视口、要先进入某个状态、要拿 DOM 结果),附可直接运行的 shot.sh / shot.mjs 脚本。还收录无头 Chrome 的坑(requestAnimationFrame 动画停在第一帧、375 宽被撑成 500、深色模式跟随系统)、字体不显示或像宋体的排查、整页截图里滚动动画区块空白、vitest 排除 .claude worktree,以及桌面/手机/英文/繁體/深浅色/打印的核对清单。只要改了界面、要截图、要查响应式或深色模式、动画不动,或者准备说“界面改好了”,就用这个 skill,哪怕用户只说“看看效果”。Use after any UI/CSS/layout/animation change to verify it, take screenshots at several viewports, check dark mode / mobile / print, or debug animations frozen in headless Chrome.

immersive-cultural-ui

做重氛围、带东方古典或神秘学气质的沉浸式网页:深色夜空、细金线、薄雾、宣纸纹理、竖排中文、书法批注、景深视差、开场时逐层亮起。适用于命理排盘(八字、紫微、占星、塔罗)、黄历与二十四节气、星图、典籍诗词、博物馆展品、节庆和有仪式感的产品页。只要用户想要「有氛围、沉浸、古风、国风、东方、神秘、仪式感」的页面,或者要竖排、书法字体、星空、水墨、宣纸效果,即使没有点名风格,也用这个 skill。它提供一套带具体数值的风格配方(天书),装饰、动效、竖排和字体的做法,可复用代码和交付前检查清单。和 web-design-engineer 配合:那边管通用流程,这里管这一种风格。Also use for English requests for immersive, mystical, Chinese-classical, almanac, astrology, tarot or museum-exhibit pages.

RedCarpG/animation-capture

把会动的东西按固定时间一帧一帧录下来,做成左右对比的 GIF 或逐帧对照图,给人验收、对比改动前后、放进说明或 PR:网页的 CSS 过渡和动画、element.animate()、requestAnimationFrame 写的 JS 动画、canvas 游戏、three.js / VRM 角色、PixiJS / Live2D 角色都适用。附脚本:record.mjs(无头 Chrome + 假时钟,页面不用改,渲染多慢时间轴都准,两次录的逐帧一样)、make_gif.py(几个变体并排、标签、共用调色板)、clock-shim.js。还讲先逐帧记数值再录 GIF、开关前后怎么做变体、怎么取景,以及实测过的坑(Chrome 虚拟时间不可靠、等加载时别推时钟、Vite 首次打开会刷新页面、Live2D 运行库要先加载、无头 Chrome 用完要关、别人模型的许可)。只要用户想「录个 GIF」「做个动图给我看」「对比一下改之前和改之后的动画」「把动作录下来」「验收一下动画效果」,或者要给动画、动效、角色动作拿出能看的证据,就用这个 skill,即使没提 GIF。Also use for English requests to record an animation as frames or a GIF, make a before/after comparison of motion, or capture deterministic frames from a web page, canvas, three.js, VRM or Live2D scene.

RedCarpG/live2d-vrm-animation

在网页或桌面应用里让 Live2D(Cubism,PixiJS)和 VRM(three.js + @pixiv/three-vrm)角色动起来:加载顺序、程序姿势和动作片段互相覆盖、在物理之前叠加、VTube Studio 模型补齐(没有 Idle、没眨眼、头角度是物理输出、8K 贴图、包围盒被特效带偏)、动作通道和定住、表情存取和道具冲突、three.js AnimationMixer 的坑(不写没变的值、LoopOnce 提前关掉)、程序「带动层」让手 K 和 AI 动作不僵、动捕片段只取上半身、弹簧骨骼延迟和跟节拍、裙子穿模、让 AI 生成表情和动作的数据格式与校验规则,以及逐帧记录的验证方法。只要用户在做虚拟形象、桌宠、VTuber 工具、数字人,提到 Live2D、Cubism、model3.json、motion3、exp3、physics3、VTube Studio、VRM、VRMA、three-vrm、Mixamo、动捕、SpringBone,或者抱怨「动作一顿一顿的」「动作僵」「手放下又抬起来闪一下」「头不跟着动」「定不住」「表情看不出来」「做动作脸上没表情」「手指僵、直板手」「托腮够不到下巴」「眼睛呆、一直盯着」「腿站不稳、脚滑」,就用这个 skill。Also use for English requests about animating Live2D or VRM avatars, procedural idle motion, physics, expressions, or AI-generated character motions.

vrm-model-conversion

把带骨架的 3D 人物模型(FBX、PMX/MMD、XPS、glTF/GLB、.blend;来自 Mixamo、MMD、Unity/VRChat、Daz Genesis、Auto-Rig Pro、Rigify、3ds Max Biped、游戏提取)在 Blender 后台转成 VRM 1.0,给 three-vrm 网页、桌宠、VTuber 软件、VRChat 外的应用用。管:解压和挑哪份源文件、各格式怎么导入、骨头名自动对应到 VRM 标准骨骼、A-pose 转 T-pose、表情(已有形态键直接绑;只有脸部骨头的烘成形态键)、头发和衣服的弹簧骨骼(没有物理骨的就加骨链、按位置重新分权重)、碰撞体、MToon 材质和发片透明、贴图缩小、VRM meta 和许可,以及一份检查清单。附可复用的 Blender 脚本 vrm_kit.py(参数化,不写死文件名)、模板 build_template.py、不用 Blender 的检查脚本 inspect_vrm.py。只要用户想「把这个模型转成 VRM」「这个 FBX/PMX 能不能给 three-vrm 用」「给模型加表情、加头发物理、加弹簧骨」「VRM 的表情不动、头发不飘、裙子穿模、碰撞体没用」「下载了个模型想当桌宠/虚拟形象」,就用这个 skill,即使没说 VRM。Also use for English requests to convert FBX/PMX/glTF/blend avatars to VRM, set up VRM expressions, spring bones or colliders, or debug a VRM export from Blender.

Verwandte Skills