chinese-tts

Fait parler le chinois (mélangé avec anglais, chiffres, liens, code) à un système TTS : normalisation textuelle (TN) avant synthèse vocale, gestion des coupures en streaming, choix du moteur TTS local, cache, latence, annulation et plus.

Qu'est-ce que chinese-tts ?

Ce skill résout tous les problèmes de text-to-speech (TTS) en chinois : lorsque l'IA lit des nombres, des dates, des liens, des codes, des unités ou des expressions internet, le skill assure une lecture correcte et naturelle. Il applique une normalisation textuelle (TN) avant la synthèse : les nombres sont convertis en prononciation (par ex. « 2026年 » → « èr líng èr liù nián », « 26年 » → « èr shí liù nián »), les unités, pourcentages, plages, fractions, et les termes spéciaux sont gérés. Pour le streaming, il maintient les frontières des tokens (par ex. « 工作了26年 » ne devient pas « èr liù nián ») en attendant jusqu'à deux caractères après le nombre. Le skill fournit 139 cas de test validés et un script de vérification. Il couvre également les aspects engineering : choix du moteur TTS local (Kokoro, Matcha, CosyVoice, Qwen3-TTS, sherpa-onnx, vLLM, WSL2), latence de la première phrase, annulation de la requête (pour ne pas ralentir la suivante), cache des phrases déjà synthétisées, moteur de secours, et gestion de la mémoire GPU. Il est conçu pour des assistants vocaux, des personnages IA qui parlent, des livres audio, des annonces, ou toute application où le TTS chinois doit être naturel et sans erreur de prononciation.

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Synthèse vocale chinoise : normalisation textuelle et ingénierie

Ce skill provient d'un animal de bureau IA qui parle tous les jours (voir « Source et maintenance » en bas) : Claude répond en streaming, phrase par phrase, lues par un TTS local. Les règles ci-dessous ont toutes été testées, les chiffres ont été mesurés.

Principe en une phrase : La prononciation est déterminée ici ; le moteur ne fait que prononcer. Si on laisse la prononciation au moteur, changer de moteur change la lecture ; si on utilise une bibliothèque TN toute faite, il y a quelques endroits où le résultat se dégrade. Les bibliothèques existantes (wetext, PaddleSpeech) servent de référence et pour compléter les règles.

Flux

Texte streaming du modèle
  → ① Filtrage : supprimer les décorations, emojis, puces de liste ; remplacer les blocs de code, tableaux et liens par une phrase (doit reconnaître les morceaux séparés en streaming)
  → ② Conversion en prononciation : nombres, heures, unités, symboles, table de remplacement (maintien des frontières en streaming)
  → ③ Découpage en phrases : la première partie coupée au premier point-virgule, puis couper à la virgule quand ça dépasse 40 caractères
  → ④ Synthèse : ne générer qu'environ 20 secondes d'avance ; lors d'une interruption, vraiment arrêter l'inférence

L'ordre ne peut pas être changé : d'abord la conversion, puis le découpage. Lorsqu'on découpe d'abord puis nettoie, trois erreurs ont été constatées :

OriginalRésultat après découpage d'abordProblème
下午14:30开会下午14: / 30开会Le deux-points est pris pour une virgule, l'heure est coupée
看这里:https://…/pull/7 就行https: / //…/pull/7 就行Le lien est coupé en deux, l'adresse est lue lettre par lettre
大概3~5天大概35天~ est supprimé comme décoration, lu « trente-cinq jours »

Le : demi-largeur n'est traité comme virgule que s'il est suivi d'un espace.

Maintien des frontières en streaming

Une phrase correctement convertie en bloc ne l'est pas forcément en streaming. En streaming caractère par caractère, « 工作了26年 » et « 80年代 » sont lus « èr liù nián » et « bā líng nián dài », parce que les caractères après le nombre ne sont pas encore arrivés ; -10°C est lu comme anglais.

  • Attendre encore 2 caractères après un nombre avant de le relâcher ; les unités séparées par un espace doivent être reconnues (par ex. « 跑了 5 » est retenu en attendant km).
  • En passant à la section suivante, inclure les derniers caractères de la section précédente (pour reconnaître « 了 26 年 », il faut voir le « 了 » précédent).
  • Maximum 200 caractères retenus, 4000 pour les blocs de code et tableaux ; relâcher si la limite est atteinte.
  • Chaque test doit être exécuté à la fois en « flux caractère par caractère » et en « phrase complète » : les résultats doivent être identiques.

Aide-mémoire des règles (voir references/rules.md pour les détails)

CatégorieExemplePrononciation
Année2026年, 2026届, 26年见Chiffre par chiffre : èr líng èr liù nián, èr líng èr liù jiè, èr liù nián jiàn
Durée工作了26年, 80年代, 26年前En nombre : èr shí liù nián, bā shí nián dài, èr shí liù nián qián
NuméroTéléphone, code de vérification, 编号27149, 房间1201Chiffre par chiffre, « 1 » prononcé « yāo », pause au trait d'union et à l'espace
Cinq chiffres95588 / 价钱 12999Pas d'unité, ne se termine pas par 0, pas précédé d'argent → numéro ; sinon en nombre
Argot internet666, 2333, 520 seuls / 666个赞, 花了888Chiffre par chiffre / en nombre (liste fixe)
2 devant unité2个, 2L, 2℃Deux (liǎng) sauf température : èr shè shì dù
Unité60km/h, 3kWh, 5min, 10mg60 kilomètres par heure, 3 kilowattheures, 5 minutes, 10 milligrammes
Unité non convertie4g网络, 5A景区, 16GBLaissé tel quel au moteur
Plage, pourcentage3~5%, 3-5km, -1.5~23 à 5 %, 3 à 5 km, moins 1,5 à 2
Heure14:30, 13:00, 9:0514 h 30, 13 h 00, 9 h 05 (format 24 h)
Date, fraction10/26 交 / 有7/12的观众26 octobre / 7 sur 12 (fraction seulement si précédé de « 有, 占, 约 »)
Symbole#15, 2x, x3, 100wNuméro 15, double, fois 3, 1 million

Vérification avec cas de test

references/golden-cases.json contient 115 cas de phrase complète et 24 cas de streaming, tous validés par le projet d'origine. scripts/check-tn.mjs les utilise pour tester votre implémentation :

node scripts/check-tn.mjs ./my-tn.mjs                  # Le module exporte normalize(texte) et (optionnel) createStream()
node scripts/check-tn.mjs ./my-tn.mjs --only 号码      # Tester seulement un groupe
  • La comparaison ignore les espaces et la ponctuation courante, ne compare que la prononciation. Les cas avec note sont des « références », signalés mais pas considérés comme des échecs.
  • Utilisez-le comme ligne de validation pour une nouvelle TN ; en modifiant des règles, exécutez-le pour éviter de casser un autre cas.
  • Les prononciations controversées (par ex. « 这台电脑 12999 » lue comme un numéro) sont acceptées par le projet d'origine. Si votre produit veut une autre prononciation, modifiez le cas de test et ajoutez une explication à côté.

Comment trouver une prononciation erronée

Quatre causes possibles : la conversion n'a pas été écrite en prononciation ; un homographe mal choisi par le modèle ; un enregistrement de référence défectueux ; aléatoire (relancer une fois).

Faites lire la même phrase avec la voix actuelle et deux autres voix : si chaque voix se trompe sur le même caractère, ajoutez la règle dans la table de remplacement ; si une seule voix est étrange, changez de voix. Enregistrez toujours l'original et la prononciation convertie dans un journal (jsonl) pour pouvoir revenir en arrière.

Ingénierie (voir references/engines.md)

  • Latence de la première phrase : La première partie est coupée après le premier point-virgule. Matcha produit la première piste audio 0,65 seconde après l'arrivée du premier caractère.
  • Le moyen le plus efficace d'accélérer est le cache : CosyVoice met 2,6 à 3 secondes pour un premier bloc non en cache, 6 millisecondes si en cache. Pré-synthétisez des mots de remplissage (« euh », « laisse-moi réfléchir ») dès que l'utilisateur commence à parler.
  • L'annulation doit vraiment arrêter l'inférence : Si la connexion vLLM est interrompue sans abort_request, la phrase suivante attend 4,9 secondes (avec, 0,8 à 1,7 seconde).
  • L'anglais peut être silencieusement ignoré : Certains moteurs ne prononcent pas GitHub, PR, % ; vérifiez à nouveau l'anglais après une mise à jour de dépendance.
  • Moteur de secours : Si le moteur principal n'est pas prêt ou échoue immédiatement, basculer sur le secours ; en cas d'erreur en cours de phrase, ne pas relire. Le fait que le service HTTP soit lancé ne signifie pas que le modèle est chargé ; en cas de 503, réessayer.

Source et maintenance

  • Source : Cirra (animal de bureau IA, RedCarpG/cirra-deskpet) et son service vocal cirra-voice, d'octobre 2026 à novembre 2026.
    • 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.
    • Documentation : docs/speech.md, docs/speech-tn.md (119 phrases de référence), docs/tts.md, docs/voices.md, docs/voice-chat.md, docs/voice-chat-2.md, docs/voice-install.md, docs/perf-checkup.md.
    • Expériences : lessons/chinese-tts.md dans un dépôt privé.
  • Origine : skills/chinese-tts/ dans RedCarpG/redcarpg-skills. Le dossier ~/.claude/skills/ contient une copie installée, ne pas modifier directement. references/golden-cases.json a été extrait le 10 novembre 2026 de speech.test.ts de Cirra via un script ; les deux ne sont pas synchronisés automatiquement.
  • Comment modifier :
    • Modifier dans redcarpg-skills, via une PR ; incrémenter la version dans manifest.json, exécuter node scripts/validate.mjs, publier une release (tag chinese-tts-v<version>), puis réinstaller la copie locale. Vérifier d'abord si lessons/chinese-tts.md contient de nouvelles entrées à intégrer.
    • Si les règles TN de Cirra changent, réextraire les cas (méthode : lire les [original, prononciation] dans le groupe readNumbers et le groupe « streaming » de speech.test.ts), puis utiliser un module d'adaptation avec sidecar/dist/tts/ compilé par Cirra et exécuter check-tn.mjs ; tout doit passer.
    • Les chiffres des moteurs (latence, temps réel, mémoire GPU) ont été mesurés en octobre 2026 sur une machine avec 8 Go de mémoire GPU et un processeur sans VNNI ; à remesurer avec un matériel différent.
  • Historique des mises à jour :
    • 12 novembre 2026 · 1.0.0, publication publique dans redcarpg-skills. Chemins absolus locaux modifiés, projet source écrit en lien ; contenu inchangé.
    • 10 novembre 2026 · Cirra · Première version : flux et ordre, frontières de streaming, aide-mémoire et règles détaillées, recherche d'erreurs de prononciation, ingénierie des moteurs ; 139 cas de test et check-tn.mjs (testé avec l'implémentation de Cirra, tout passé) ; deux prompts de test dans 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.

Skills associés