AI Slop Code RIsk Monitor

KittenML/KittenTTS

Open-source State-of-the-art TTS model which runs on a CPU 😻

27.2 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for KittenML/KittenTTS, a Python project with 15,793 GitHub stars. SynthScan examined 12,021 lines of code across 47 source files, recording 189 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 27.2 (Elevated pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

27.2
Adjusted Signal
27.2
Raw Pattern Score
100%
Time Factor
2026-10-06
Last Push
15.8K
Stars
Python
Language
12.0K
Lines of Code
47
Files
189
Pattern Hits
2026-10-12
Scan Date
0.13
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 32.2/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 87 finding(s).

Hallucinated Dependency & Supply Chain Risk 6.5/100 · LOW

Are imports declared and package/API names verified? 17 finding(s).

Agent Over-Engineering Ratio 67.1/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 140 finding(s).

PR Review Velocity Impact 78.3/100 · CRITICAL

Which changes need focused human review? 189 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 6MEDIUM 74LOW 109

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 189 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Decorative Section Separators64 hits · 194 pts
SeverityFileLineSnippetContext
MEDIUM⚡kittenml/preprocess.py1264# ─────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1266# ─────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1272 # ── Numbers ────────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1282 # ── Scientific notation ─────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1286 # ── Scale suffixes ─────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1290 # ── Currency ───────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1294 # ── Percentages ────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1297 # ── Ordinals ───────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1302 # ── Fractions ──────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1307 # ── Time ───────────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1312 # ── Decades ────────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1318 # ── Ranges ─────────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1322 # ── Model / version names ───────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1328 # ── Units ──────────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1335 # ── HTML / URLs / emails ───────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1339 # ── Contractions ───────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1342 # ── Edge / tricky cases ─────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/preprocess.py1350 # ── Mixed / real-world ──────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py12# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py14# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py144# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py146# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py247# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py249# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py1011# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py1013# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py1136# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/preprocess.py1138# ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/student_flow.py62# ── quantised layers, from bitnet.py ────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/student_flow.py332# ── student flow architecture, from chatterbox_codec.py ─────────────────────────COMMENT
MEDIUMkittenml/kittentts2/student_flow.py1928# ── construction and the single-step sampler, from s3gen_flow_distill.py ────────COMMENT
MEDIUMkittenml/kittentts2/model.py163 # ── loading ───────────────────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/model.py274 # ── reference artifacts ───────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/model.py324 # ── generation ────────────────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/model.py437 # ── public API ────────────────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/text.py30# ── expression markup ─────────────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/text.py85# ── written -> spoken ─────────────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/text.py206# ── the written -> spoken backend ─────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/text.py270# ── chunking ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/text.py366# ── joining ───────────────────────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/kittentts2/s3gen.py72# ── from utils.py ──────────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/kittentts2/s3gen.py81# ── from s3gen/const.py ────────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/kittentts2/s3gen.py89# ── from s3gen/configs.py ──────────────────────────────────────────────COMMENT
MEDIUM⚡kittenml/kittentts2/s3gen.py280# ── from s3gen/utils/mel.py ────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py102# ── from s3gen/utils/mask.py ───────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py364# ── from s3gen/utils/intmeanflow.py ────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py401# ── from s3tokenizer/s3tokenizer.py ────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py564# ── from s3gen/transformer/embedding.py ────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py679# ── from s3gen/transformer/subsampling.py ──────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py756# ── from s3gen/transformer/attention.py ────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py1082# ── from s3gen/transformer/convolution.py ──────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py1225# ── from s3gen/transformer/positionwise_feed_forward.py ────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py1281# ── from s3gen/transformer/encoder_layer.py ────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py1440# ── from s3gen/transformer/upsample_encoder.py ─────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py1742# ── from s3gen/matcha/transformer.py ───────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py3321# ── from s3gen/xvector.py ──────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py3728# ── from s3gen/flow.py ─────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py3901# ── from s3gen/s3gen.py ────────────────────────────────────────────────COMMENT
MEDIUMkittenml/kittentts2/s3gen.py2044# ── from s3gen/matcha/decoder.py ───────────────────────────────────────STRING
MEDIUMkittenml/kittentts2/s3gen.py2189# ── from s3gen/decoder.py ──────────────────────────────────────────────STRING
4 more matches not shown…
Hyper-Verbose Identifiers31 hits · 32 pts
SeverityFileLineSnippetContext
LOWtests/test_vllm.py18def test_default_backend_keeps_native_loading(tmp_path):CODE
LOWtests/test_vllm.py30def test_selected_packed_weights_are_exact_and_full_ignores_packed_files(tmp_path):CODE
LOWtests/test_vllm.py50def test_native_full_loader_preserves_explicit_checkpoint_directory(tmp_path):CODE
LOWtests/test_vllm.py63def test_shared_speaker_head_matches_native_prefill_and_leaves_decode_unchanged():CODE
LOWtests/test_vllm.py117def test_optional_backend_errors_before_model_download():CODE
LOW⚡tests/test_vllm.py130def test_vllm_options_require_backend():CODE
LOW⚡tests/test_vllm.py136def test_explicit_default_options_do_not_break_legacy_models():CODE
LOW⚡tests/test_vllm.py145def test_environment_rejects_unsupported_devices_before_engine_start():CODE
LOWtests/test_vllm.py167def test_engine_environment_preserves_user_choice_and_restores_after_failure(CODE
LOWtests/test_vllm.py183def test_engine_receives_quiet_logging_config_without_changing_native_options(monkeypatch, tmp_path):CODE
LOWtests/test_vllm.py212def test_vllm_loader_filters_speaker_weights_and_rejects_missing_parameters():CODE
LOWtests/test_vllm.py238def test_sampling_matches_native_when_requests_reorder_and_slots_are_reused(window):CODE
LOWtests/test_vllm.py274def test_sampler_is_neutral_and_speaker_replaces_only_first_embedding():CODE
LOWtests/test_text_normalization.py8 def test_issue_examples_normalize_for_tts(self):CODE
LOWtests/test_text_normalization.py21 def test_normalizes_common_document_forms(self):CODE
LOW⚡tests/test_text_normalization.py34 def test_url_and_email_are_spoken_not_removed(self):CODE
LOW⚡tests/test_text_normalization.py40 def test_span_result_maps_replacements(self):CODE
LOW⚡tests/test_text_normalization.py50 def test_chunking_does_not_split_common_abbreviations(self):CODE
LOW⚡tests/test_text_normalization.py60 def test_unsupported_locale_fails_explicitly(self):CODE
LOWkittenml/preprocess.py479def normalize_leading_decimals(text: str) -> str:CODE
LOWkittenml/preprocess.py492def expand_scientific_notation(text: str) -> str:CODE
LOWkittenml/preprocess.py763def _replace_read_aloud_range(match: re.Match) -> str:CODE
LOWkittenml/preprocess.py771def _replace_read_aloud_number(match: re.Match) -> str:CODE
LOWkittenml/kittentts_legacy/model.py108def download_from_huggingface(repo_id="KittenML/kitten-tts-nano-0.1", cache_dir=None, backend=None):CODE
LOWkittenml/kittentts2/student_flow.py758def get_intmeanflow_time_mixer(dims: int) -> nn.Linear:CODE
LOWkittenml/kittentts2/tokens.py50 def uses_reference_role_tokens(self) -> bool:CODE
LOWkittenml/kittentts2/speaker_embedding.py163def load_speaker_embedding_model(weights_path, device="cpu"):CODE
LOWkittenml/kittentts2/text.py157def _reformat_nontag_brackets(text):CODE
LOWkittenml/kittentts2/text.py183def _capitalize_and_terminate(text):CODE
LOW⚡kittenml/kittentts2/s3gen.py292def dynamic_range_compression_torch(x, C=1, clip_val=1e-5):CODE
LOWkittenml/kittentts2/s3gen.py367def get_intmeanflow_time_mixer(dims):CODE
Docstring Block Structure5 hits · 25 pts
SeverityFileLineSnippetContext
HIGHkittenml/kittentts2/s3gen.py105 def subsequent_mask( size: int, device: torch.device = torch.device("cpu"), ) -> torch.Tensor: """CSTRING
HIGHkittenml/kittentts2/s3gen.py145Create mask for subsequent steps (size, size) with chunk size, this is for streaming encoder Args: sSTRING
HIGHkittenml/kittentts2/s3gen.py251Make mask tensor containing indices of padded part. See description of make_non_pad_mask. Args: lengthSTRING
HIGHkittenml/kittentts2/s3gen.py2406Forward pass of the UNet1DConditional model. Args: x: (B, 80, T) mask (_type_) STRING
HIGHkittenml/kittentts2/s3gen.py3325Perform padding for the list of tensors. Args: xs (List): List of Tensors [(T_1, `*`), (T_2, `*`), ..., (T_STRING
AI Structural Patterns24 hits · 18 pts
SeverityFileLineSnippetContext
LOWkittenml/preprocess.py1156CODE
LOWkittenml/get_model.py65CODE
LOWkittenml/kittentts2/student_flow.py696CODE
LOWkittenml/kittentts2/student_flow.py1992CODE
LOWkittenml/kittentts2/student_flow.py217CODE
LOWkittenml/kittentts2/student_flow.py1033CODE
LOWkittenml/kittentts2/student_flow.py1214CODE
LOWkittenml/kittentts2/student_flow.py1394CODE
LOWkittenml/kittentts2/student_flow.py1556CODE
LOWkittenml/kittentts2/student_flow.py1833CODE
LOWkittenml/kittentts2/model.py451CODE
LOWkittenml/kittentts2/model.py492CODE
LOWkittenml/kittentts2/s3gen.py171CODE
LOWkittenml/kittentts2/s3gen.py297CODE
LOWkittenml/kittentts2/s3gen.py312CODE
LOWkittenml/kittentts2/s3gen.py1522CODE
LOWkittenml/kittentts2/s3gen.py1884CODE
LOWkittenml/kittentts2/s3gen.py2092CODE
LOWkittenml/kittentts2/s3gen.py2262CODE
LOWkittenml/kittentts2/s3gen.py3135CODE
LOWkittenml/kittentts2/s3gen.py3398CODE
LOWkittenml/kittentts2/s3gen.py3433CODE
LOWkittenml/kittentts2/s3gen.py3638CODE
LOWkittenml/kittentts2/s3gen.py3744CODE
Unused Imports16 hits · 16 pts
SeverityFileLineSnippetContext
LOWkittenml/__init__.py1CODE
LOWkittenml/__init__.py1CODE
LOWkittenml/__init__.py1CODE
LOWkittenml/__init__.py1CODE
LOWkittenml/get_model.py11CODE
LOWkittenml/kittentts_legacy/__init__.py7CODE
LOWkittenml/kittentts_legacy/__init__.py7CODE
LOWkittenml/kittentts_legacy/__init__.py7CODE
LOWkittenml/kittentts2/__init__.py7CODE
LOWkittenml/kittentts2/__init__.py8CODE
LOWkittenml/kittentts2/__init__.py8CODE
LOWkittenml/kittentts2/__init__.py8CODE
LOWkittenml/kittentts2/__init__.py8CODE
LOWkittenml/kittentts2/__init__.py10CODE
LOWkittenml/kittentts2/student_flow.py35CODE
LOWkittenml/kittentts2/student_flow.py40CODE
Deep Nesting13 hits · 10 pts
SeverityFileLineSnippetContext
LOWkittenml/preprocess.py689CODE
LOWkittenml/preprocess.py813CODE
LOWkittenml/kittentts_legacy/onnx_model.py44CODE
LOWkittenml/kittentts2/tl2_emb4.py141CODE
LOWkittenml/kittentts2/student_flow.py273CODE
LOWkittenml/kittentts2/student_flow.py699CODE
LOWkittenml/kittentts2/student_flow.py1185CODE
LOWkittenml/kittentts2/student_flow.py1658CODE
LOWkittenml/kittentts2/text.py319CODE
LOWkittenml/kittentts2/s3gen.py173CODE
LOWkittenml/kittentts2/s3gen.py3435CODE
LOWkittenml/kittentts2/s3gen.py1823CODE
LOWkittenml/kittentts2/s3gen.py2391CODE
Dead Code9 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMkittenml/kittentts2/s3gen.py2653CODE
MEDIUMkittenml/kittentts2/s3gen.py2654CODE
MEDIUMkittenml/kittentts2/s3gen.py2656CODE
MEDIUMkittenml/kittentts2/s3gen.py2659CODE
MEDIUMkittenml/kittentts2/s3gen.py2660CODE
MEDIUMkittenml/kittentts2/s3gen.py2661CODE
MEDIUMkittenml/kittentts2/s3gen.py2663CODE
MEDIUMkittenml/kittentts2/s3gen.py2664CODE
MEDIUMkittenml/kittentts2/s3gen.py2666CODE
Over-Commented Block12 hits · 7 pts
SeverityFileLineSnippetContext
LOWkittenml/kittentts2/model.py41# Knobs behind the `advanced=` argument. Everything here has a working default andCOMMENT
LOWkittenml/kittentts2/text.py121COMMENT
LOWkittenml/kittentts2/s3gen.py561 return log_specCOMMENT
LOWkittenml/kittentts2/s3gen.py681COMMENT
LOWkittenml/kittentts2/s3gen.py761# 2024 Alibaba Inc (Xiang Lyu)COMMENT
LOWkittenml/kittentts2/s3gen.py921 # when export onnx model, for 1st chunk, we feedCOMMENT
LOWkittenml/kittentts2/s3gen.py1021 torch.Tensor: Cache tensor (1, head, cache_t + time1, d_k * 2)COMMENT
LOWkittenml/kittentts2/s3gen.py1081COMMENT
LOWkittenml/kittentts2/s3gen.py1221COMMENT
LOWkittenml/kittentts2/s3gen.py1281# ── from s3gen/transformer/encoder_layer.py ────────────────────────────COMMENT
LOWkittenml/kittentts2/s3gen.py1441COMMENT
LOWkittenml/kittentts2/s3gen.py2701 # Shapes:COMMENT
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWkittenml/__init__.py12__all__ = [CODE
LOWkittenml/kittentts_legacy/__init__.py9__all__ = [CODE
LOWkittenml/kittentts2/__init__.py12__all__ = [CODE
LOWkittenml/kittentts2/student_flow.py65__all__ = [CODE
LOWkittenml/kittentts2/student_flow.py335logger = logging.getLogger(__name__)CODE
LOW⚡kittenml/kittentts2/s3gen.py285logger = logging.getLogger(__name__)CODE
Empty Error Handlers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHkittenml/kittentts_legacy/onnx_model.py38except KeyError:CODE
Excessive Try-Catch Wrapping5 hits · 4 pts
SeverityFileLineSnippetContext
LOWkittenml/preprocess.py473 except Exception:CODE
LOWkittenml/__init__.py7except Exception: # running from a source tree without an installCODE
LOWkittenml/kittentts2/model.py227 except Exception:CODE
LOWkittenml/kittentts2/text.py261 except Exception as exc: # a normalizer problem must not cost a generationCODE
LOWkittenml/kittentts2/speaker.py123 except Exception: # formats libsndfile cannot openCODE
Modern AI Meta-Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMkittenml/kittentts2/s3gen.py4206 # hallucination prevention, drop special tokensCOMMENT
AI Slop Vocabulary1 hit · 1 pts
SeverityFileLineSnippetContext
LOWkittenml/kittentts2/s3gen.py1201 # It's better we just return None if no cache is required,COMMENT
Fake / Example Data1 hit · 0 pts
SeverityFileLineSnippetContext
LOWkittenml/preprocess.py614 "555-1234" → "five five five one two three four"STRING