CommunityProgramación y desarrollogithub.com

chinese-tts

Hace que el programa lea texto en chino (con inglés, números, enlaces, código) mediante normalización de texto (TN) y síntesis de voz: primero convertir a pronunciación, luego dividir en oraciones; cómo mantener los límites de números en transmisión continua; cómo leer años/teléfonos/códigos de verificación/unidades/temperatura/porcentajes/intervalos/fracciones/lenguaje de Internet; tabla de reemplazo de pronunciación; cómo depurar errores de pronunciación; selección de motores TTS locales (Kokoro, Matcha, CosyVoice, Qwen3-TTS, sherpa-onnx, vLLM, WSL2), latencia de la primera frase, cancelación, caché, fuentes de respaldo, VRAM; entrada de voz y interrupción. Incluye 139 casos de prueba verificados de «original → pronunciación» y un script de verificación.

¿Qué es chinese-tts?

Este skill aborda la compleja tarea de la normalización de texto en chino para síntesis de voz (TTS), especialmente en entornos de transmisión continua (streaming). Su enfoque principal es que la conversión a pronunciación debe realizarse antes de la segmentación de oraciones, ya que segmentar primero provoca errores: por ejemplo, romper URLs, dividir números de teléfono o malinterpretar rangos. El skill proporciona reglas detalladas para manejar años (como «2026年» → «èr líng èr liù nián»), cantidades, números de teléfono, unidades, porcentajes, fechas, fracciones y lenguaje de Internet (como «666» o «2333»). Además, incluye una tabla de reemplazo de pronunciación para resolver casos ambiguos y un método de depuración para identificar si un error se debe a la normalización, al modelo TTS o a la grabación de referencia. El skill es compatible con una amplia gama de motores TTS locales, incluyendo Kokoro, Matcha, CosyVoice, Qwen3-TTS, sherpa-onnx y vLLM. Aborda desafíos de ingeniería como la latencia de la primera frase (cortando la primera oración en la primera coma), el almacenamiento en caché para reducir la latencia de 2.6 segundos a 6 milisegundos, la cancelación real de la inferencia (evitando esperas de hasta 4.9 segundos) y el uso de fuentes de respaldo. Incluye 139 casos de prueba verificados (115 para texto completo y 24 para streaming) que garantizan que la implementación funcione correctamente tanto con entrada completa como carácter por carácter. Un script de verificación (`check-tn.mjs`) permite ejecutar las pruebas contra cualquier implementación de normalización de texto.

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

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Síntesis de voz en chino: normalización de texto e ingeniería

Este skill proviene de una mascota de escritorio con IA que habla constantemente (ver «Origen y mantenimiento» al final): respuestas en streaming de Claude que se entregan frase por frase al TTS local. Todas las reglas tienen pruebas y los números están medidos.

Regla de oro: la pronunciación se convierte en esta capa; el motor solo se encarga de la fonación. Si la pronunciación se deja al motor, al cambiar de motor cambia la pronunciación; incluso si se usa una biblioteca TN ya hecha, hay algunos casos que empeoran. Las bibliotecas existentes (wetext, PaddleSpeech) se usan como referencia y para complementar reglas.

Flujo de trabajo

Texto en streaming del modelo
  → ① Filtrado: eliminar decoraciones, emojis, símbolos de lista; bloques de código, tablas y enlaces se convierten en una frase (en streaming, debe reconocerlos incluso si están divididos)
  → ② Conversión a pronunciación: números, tiempos, unidades, símbolos, tabla de reemplazo de pronunciación (en streaming, mantener los límites)
  → ③ Segmentación de oraciones: el primer segmento se corta hasta la primera coma; después, si supera los 40 caracteres, se corta en una coma
  → ④ Síntesis: solo se adelanta unos 20 segundos a lo que se ha pronunciado; al interrumpir, se detiene realmente la inferencia

El orden no se puede cambiar: primero convertir a pronunciación, luego segmentar. Segmentar primero y limpiar después produce tres errores probados:

OriginalResultado de segmentación primeroProblema
下午14:30开会下午14: / 30开会Los dos puntos se toman como coma, la hora se divide
看这里:https://…/pull/7 就行https: / //…/pull/7 就行El enlace se parte en dos, la dirección se lee carácter por carácter
大概3~5天大概35天~ se elimina como decoración, se lee «treinta y cinco días»

El : de medio ancho solo se trata como coma si va seguido de un espacio en blanco.

En streaming, mantener los límites

Lo que se convierte correctamente en una oración completa puede no ser correcto en streaming. Con entrada carácter por carácter, «工作了26年» y «80年代» se leen como «èr liù nián» y «bā líng nián dài», porque los caracteres siguientes al número aún no han llegado; el segmento -10°C se lee en inglés como está.

  • Esperar 2 caracteres más después de un número antes de soltarlo; las unidades separadas por un espacio también deben reconocerse (por ejemplo, «跑了 5 » se retiene hasta que llegue km).
  • Al pasar al siguiente segmento, incluir los últimos caracteres del segmento anterior (para reconocer «了 26 年» hay que ver el «了» anterior).
  • Retener hasta un máximo de 200 caracteres; para bloques de código y tablas, hasta 4000 caracteres; al llegar al límite, soltar.
  • Cada prueba debe ejecutarse tanto con entrada carácter por carácter como con el bloque completo, y los resultados deben ser idénticos.

Referencia rápida de reglas (ver detalles en references/rules.md)

CategoríaEjemploPronunciación
Año2026年, 2026届, 26年见Dígito a dígito: èr líng èr liù nián, èr líng èr liù jiè, èr liù nián jiàn
Cantidad de años工作了26年, 80年代, 26年前Como cantidad: èr shí liù nián, bā shí nián dài, èr shí liù nián qián
Número de teléfono / códigoTeléfono, código de verificación, 编号27149, 房间1201Dígito a dígito, el 1 se lee «yāo», pausa en guiones y espacios
Número de cinco dígitos95588 / 价格 12999Sin clasificador, no termina en 0, no es precedido por dinero → número; de lo contrario, como cantidad
Lenguaje de Internet666, 2333, 520 solos / 666个赞, 花了888Dígito a dígito / como cantidad (solo se reconoce una lista fija)
2 antes de unidad2个, 2L, 2℃Liǎng ge, liǎng shēng; excepto temperatura: èr shèshìdù
Unidades60km/h, 3kWh, 5min, 10mgLiùshí gōnglǐ měi xiǎoshí, sān dù diàn, wǔ fēnzhōng, shí háokè
Unidades que no se convierten4g网络, 5A景区, 16GBSe dejan como están para el motor
Rango, porcentaje3~5%, 3-5km, -1.5~2Bǎi fēn zhī sān dào wǔ, sān dào wǔ gōnglǐ, fù yī diǎn wǔ dào èr
Hora14:30, 13:00, 9:05Shísì diǎn bàn, shísān diǎn, jiǔ diǎn líng wǔ (formato 24 horas)
Fecha, fracción10/26 交 / 有7/12的观众Shí yuè èrshíliù hào / shí'èr fēn zhī qī (si precede «有, 占, 约» se trata como fracción)
Símbolos#15, 2x, x3, 100wShíwǔ hào, liǎng bèi, chéng sān, yī bǎi wàn

Usar los casos de prueba para verificar

references/golden-cases.json contiene 115 casos de bloque completo y 24 casos de streaming, todos verificados por el proyecto original. scripts/check-tn.mjs los usa para probar tu implementación:

node scripts/check-tn.mjs ./my-tn.mjs                  # Exporta el módulo normalize(text) y (opcionalmente) createStream()
node scripts/check-tn.mjs ./my-tn.mjs --only 号码      # Solo ver un grupo
  • La comparación ignora espacios en blanco y signos de puntuación comunes, solo compara la pronunciación. Los casos con note son «de referencia», solo se informan sin contar como fallo.
  • Al escribir un nuevo TN, usarlo como línea de aceptación; al cambiar reglas, ejecutarlo para evitar arreglar algo y romper otra cosa.
  • Las pronunciaciones controvertidas (por ejemplo, «这台电脑 12999» se trata como número) el proyecto original las acepta. Si tu producto quiere otra pronunciación, cambia el caso de prueba y escribe el motivo al lado.

Cómo depurar errores de pronunciación

Se dividen en cuatro categorías: no se escribió la pronunciación antes de leer; los homófonos los adivina el modelo; la grabación de referencia tiene problemas; aleatorio (con volver a muestrear basta).

Usa la misma voz y dos voces diferentes para leer la misma oración: si todas las voces se equivocan en el mismo carácter, añade una regla en la tabla de reemplazo de pronunciación; si solo una voz suena extraña, cambia de voz. Registra siempre el texto original y la pronunciación convertida en un log (jsonl) para poder consultarlo después.

Ingeniería (ver detalles en references/engines.md)

  • Latencia de la primera frase: El primer segmento se corta hasta la primera coma. Con Matcha, 0.65 segundos después de que llegue el primer carácter se emite el primer audio.
  • La mejora más efectiva es el caché: Frases no sintetizadas: CosyVoice primer bloque tarda 2.6–3 segundos; caché acertada: 6 milisegundos. Pre-sintetizar frases de relleno («嗯», «我想想») cuando el usuario empieza a hablar.
  • Cancelar debe detener realmente la inferencia: Si se corta la conexión vLLM, se ejecuta abort_request; de lo contrario, la siguiente frase espera 4.9 segundos (tras hacerlo, 0.8–1.7 segundos).
  • El inglés se omite silenciosamente: Algunos motores no leen GitHub, PR, %; volver a verificar el inglés antes de actualizar dependencias.
  • Fuente de respaldo: Si la fuente principal no está lista o falla al empezar, se cambia a la de respaldo; si falla a mitad de la frase, no se relee. Que el servicio HTTP esté arriba no significa que el modelo esté cargado; ante un 503, reintentar.

Origen y mantenimiento

  • Origen: Cirra (mascota de escritorio con IA, RedCarpG/cirra-deskpet) y su servicio de voz cirra-voice, octubre-noviembre de 2026.
    • Código: 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.
    • Documentación: docs/speech.md, docs/speech-tn.md (119 oraciones con triple contraste), docs/tts.md, docs/voices.md, docs/voice-chat.md, docs/voice-chat-2.md, docs/voice-install.md, docs/perf-checkup.md.
    • Experiencia: lessons/chinese-tts.md en un repositorio privado.
  • Fuente: skills/chinese-tts/ en RedCarpG/redcarpg-skills. Lo que está en ~/.claude/skills/ es una copia instalada, no modificar directamente. references/golden-cases.json se extrajo el 2026-11-10 de speech.test.ts de Cirra con un script; no se sincronizan automáticamente.
  • Cómo modificar:
    • Modificar en redcarpg-skills, mediante PR; aumentar la versión en manifest.json, pasar node scripts/validate.mjs y publicar (tag chinese-tts-v<versión>), luego reinstalar la copia local. Primero revisar si lessons/chinese-tts.md tiene nuevas entradas que incorporar.
    • Cuando cambien las reglas TN de Cirra, volver a extraer los casos de prueba (método: leer los pares [original, pronunciación] del grupo readNumbers y el grupo «流式» en speech.test.ts), y usar un módulo adaptador con el sidecar/dist/tts/ compilado de Cirra para ejecutar check-tn.mjs; deberían pasar todos.
    • Las cifras de los motores (latencia, tasa en tiempo real, VRAM) se midieron en octubre de 2026 en un ordenador con 8 GB de VRAM y CPU sin VNNI; si se cambia el hardware, hay que volver a medirlas.
  • Registro de cambios:
    • 2026-11-12 · 1.0.0, trasladado a redcarpg-skills y publicado públicamente. Se eliminaron rutas absolutas locales, las fuentes del proyecto se escribieron como enlaces; el contenido no cambió.
    • 2026-11-10 · Cirra · Primera versión: flujo y orden, límites en streaming, referencia rápida de reglas y detalles, depuración de errores, ingeniería de motores; 139 casos de prueba y check-tn.mjs (ejecutado con la implementación de Cirra, todos aprobados); dos prompts de prueba en 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 relacionados