Repository Analysis

fishaudio/fish-speech

SOTA Open Source TTS

6.9 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of fishaudio/fish-speech, a Python project with 31,260 GitHub stars. SynthScan v2.0 examined 24,862 lines of code across 155 source files, recording 138 pattern matches distributed across 12 syntactic categories. The overall adjusted score of 6.9 places this repository in the Low AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

6.9
Adjusted Score
6.9
Raw Score
100%
Time Factor
2026-06-09
Last Push
31.3K
Stars
Python
Language
24.9K
Lines of Code
155
Files
138
Pattern Hits
2026-07-14
Scan Date
0.02
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 3MEDIUM 9LOW 126

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 138 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Unused Imports52 hits · 52 pts
SeverityFileLineSnippetContext
LOWtools/api_server.py10CODE
LOWtools/api_client.py2CODE
LOWtools/vqgan/extract_vq.py8CODE
LOWtools/server/model_utils.py2CODE
LOWtools/server/model_utils.py6CODE
LOWtools/server/views.py4CODE
LOWtools/server/views.py27CODE
LOWtools/llama/merge_lora.py1CODE
LOWtools/llama/merge_lora.py6CODE
LOWtools/llama/merge_lora.py13CODE
LOWtools/llama/build_dataset.py5CODE
LOWfish_speech/conversation.py8CODE
LOWfish_speech/tokenizer.py1CODE
LOWfish_speech/tokenizer.py3CODE
LOWfish_speech/tokenizer.py10CODE
LOWfish_speech/train.py4CODE
LOWfish_speech/train.py13CODE
LOWfish_speech/callbacks/grad_norm.py3CODE
LOWfish_speech/callbacks/__init__.py1CODE
LOWfish_speech/callbacks/__init__.py2CODE
LOWfish_speech/datasets/concat_repeat.py2CODE
LOWfish_speech/datasets/semantic.py3CODE
LOWfish_speech/datasets/semantic.py9CODE
LOWfish_speech/datasets/semantic.py12CODE
LOWfish_speech/datasets/semantic.py13CODE
LOWfish_speech/datasets/semantic.py615CODE
LOWfish_speech/utils/__init__.py1CODE
LOWfish_speech/utils/__init__.py2CODE
LOWfish_speech/utils/__init__.py3CODE
LOWfish_speech/utils/__init__.py4CODE
LOWfish_speech/utils/__init__.py4CODE
LOWfish_speech/utils/__init__.py5CODE
LOWfish_speech/utils/__init__.py6CODE
LOWfish_speech/utils/__init__.py7CODE
LOWfish_speech/utils/__init__.py7CODE
LOWfish_speech/utils/__init__.py8CODE
LOWfish_speech/utils/__init__.py8CODE
LOWfish_speech/utils/__init__.py8CODE
LOWfish_speech/utils/__init__.py8CODE
LOWfish_speech/utils/spectrogram.py4CODE
LOWfish_speech/utils/schema.py2CODE
LOWfish_speech/utils/schema.py3CODE
LOWfish_speech/utils/schema.py4CODE
LOWfish_speech/utils/schema.py7CODE
LOWfish_speech/utils/schema.py12CODE
LOWfish_speech/utils/schema.py12CODE
LOWfish_speech/models/dac/modded_dac.py8CODE
LOWfish_speech/models/text2semantic/lit_module.py1CODE
LOWfish_speech/models/text2semantic/inference.py36CODE
LOWfish_speech/models/text2semantic/inference.py36CODE
LOWfish_speech/text/__init__.py1CODE
LOWfish_speech/i18n/__init__.py1CODE
Self-Referential Comments8 hits · 24 pts
SeverityFileLineSnippetContext
MEDIUMtools/run_webui.py76 # Create the inference engineCOMMENT
MEDIUMtools/vqgan/extract_vq.py23# This file is used to convert the audio files to text files using the Whisper model.COMMENT
MEDIUMtools/server/views.py235 # Create a temporary file for the audio dataCOMMENT
MEDIUMfish_speech/tokenizer.py81 # Create a lookup tensor to handle potential gaps in token IDs safelyCOMMENT
MEDIUMfish_speech/inference_engine/reference_loader.py36 # Define the torchaudio backendCOMMENT
MEDIUMfish_speech/inference_engine/__init__.py166 # Create a queue to get the responseCOMMENT
MEDIUMfish_speech/i18n/scan.py55# Define the standard file nameCOMMENT
MEDIUMfish_speech/i18n/scan.py78# Define the standard file nameCOMMENT
Excessive Try-Catch Wrapping21 hits · 22 pts
SeverityFileLineSnippetContext
LOWtools/api_server.py109 except Exception as exc:CODE
LOWtools/vqgan/create_train_split.py48 except Exception as e:CODE
LOWtools/vqgan/extract_vq.py101 except Exception as e:CODE
LOWtools/server/api_utils.py146 except Exception as e:CODE
LOWtools/server/views.py108 except Exception as e:CODE
LOWtools/server/views.py139 except Exception as e:CODE
LOWtools/server/views.py201 except Exception as e:CODE
LOWtools/server/views.py271 except Exception as e:CODE
LOWtools/server/views.py310 except Exception as e:CODE
LOWtools/server/views.py372 except Exception as e:CODE
LOWtools/server/views.py480 except Exception as e:CODE
LOWtools/llama/build_dataset.py40 except Exception as e:CODE
LOWtools/llama/build_dataset.py87 except Exception as e:CODE
LOWfish_speech/datasets/vqgan.py70 except Exception as e:CODE
MEDIUMfish_speech/datasets/vqgan.py67def __getitem__(self, idx):CODE
LOWfish_speech/utils/utils.py72 except Exception as ex:CODE
LOWfish_speech/utils/schema.py72 except Exception:CODE
LOWfish_speech/models/text2semantic/llama.py507 except Exception as e:CODE
LOWfish_speech/models/text2semantic/inference.py789 except Exception as e:CODE
LOWfish_speech/inference_engine/reference_loader.py246 except Exception as e:CODE
LOWfish_speech/inference_engine/reference_loader.py283 except Exception as e:CODE
Redundant / Tautological Comments10 hits · 14 pts
SeverityFileLineSnippetContext
LOWtools/run_webui.py48 # Check if MPS or CUDA is availableCOMMENT
LOWtools/vqgan/extract_vq.py37 import torchaudio.io._load_audio_fileobj # Check if ffmpeg backend is availableCODE
LOWtools/server/model_manager.py30 # Check if MPS or CUDA is availableCOMMENT
LOWtools/server/views.py158 # Check if the text is too longCOMMENT
LOWtools/server/views.py165 # Check if streaming is enabledCOMMENT
LOWfish_speech/utils/schema.py69 ): # Check if audio is a string (Base64)CODE
LOWfish_speech/inference_engine/reference_loader.py171 # Check if directory contains at least one audio file and corresponding .lab fileCOMMENT
LOWfish_speech/inference_engine/reference_loader.py178 # Check if corresponding .lab file exists for at least one audio fileCOMMENT
LOWfish_speech/inference_engine/reference_loader.py207 # Check if reference already existsCOMMENT
LOWfish_speech/inference_engine/reference_loader.py212 # Check if audio file existsCOMMENT
Deep Nesting14 hits · 14 pts
SeverityFileLineSnippetContext
LOWtools/vqgan/create_train_split.py20CODE
LOWtools/server/api_utils.py83CODE
LOWtools/webui/__init__.py9CODE
LOWtools/llama/quantize.py267CODE
LOWtools/llama/quantize.py310CODE
LOWfish_speech/content_sequence.py86CODE
LOWfish_speech/content_sequence.py326CODE
LOWfish_speech/datasets/semantic.py118CODE
LOWfish_speech/datasets/semantic.py341CODE
LOWfish_speech/utils/logger.py27CODE
LOWfish_speech/utils/braceexpand.py105CODE
LOWfish_speech/utils/braceexpand.py156CODE
LOWfish_speech/models/text2semantic/llama.py480CODE
LOWfish_speech/models/text2semantic/inference.py839CODE
Hyper-Verbose Identifiers13 hits · 13 pts
SeverityFileLineSnippetContext
LOWtools/server/model_utils.py55def cached_vqgan_batch_encode(model, audios: list[bytes]):CODE
LOWtools/server/api_utils.py79async def buffer_to_async_generator(buffer):CODE
LOWtools/llama/quantize.py22def dynamically_quantize_per_channel(x, quant_min, quant_max, target_dtype):CODE
LOWtools/llama/quantize.py101def group_quantize_tensor_from_qparams(w, scales, zeros, n_bit=4, groupsize=128):CODE
LOWtools/llama/quantize.py137def group_dequantize_tensor_from_qparams(CODE
LOWtools/llama/quantize.py168 def create_quantized_state_dict(self) -> "StateDict":CODE
LOWtools/llama/quantize.py195 def create_quantized_state_dict(self):CODE
LOWtools/llama/quantize.py310 def create_quantized_state_dict(self):CODE
LOWfish_speech/scheduler.py4def get_cosine_schedule_with_warmup_lr_lambda(CODE
LOWfish_speech/scheduler.py28def get_constant_schedule_with_warmup_lr_lambda(CODE
LOWfish_speech/models/dac/modded_dac.py225 def _compute_conformer_pos_scores(self, q: Tensor, seqlen: int) -> Tensor:CODE
LOWfish_speech/models/text2semantic/llama.py948 def eq_scaled_dot_product_attention(CODE
LOWfish_speech/models/text2semantic/inference.py43def multinomial_sample_one_no_sync(probs_sort):CODE
Cross-Language Confusion2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHtools/server/views.py70 {"error": "WebUI not built. Run: cd awesome_webui && npm run build"},CODE
HIGHtools/webui/__init__.py17 js="() => {const params = new URLSearchParams(window.location.search);if (!params.has('__theme')) {params.seCODE
AI Structural Patterns9 hits · 9 pts
SeverityFileLineSnippetContext
LOWfish_speech/datasets/semantic.py73CODE
LOWfish_speech/datasets/semantic.py283CODE
LOWfish_speech/datasets/semantic.py300CODE
LOWfish_speech/utils/spectrogram.py63CODE
LOWfish_speech/models/dac/modded_dac.py195CODE
LOWfish_speech/models/dac/modded_dac.py805CODE
LOWfish_speech/models/dac/rvq.py205CODE
LOWfish_speech/models/text2semantic/llama.py844CODE
LOWfish_speech/models/text2semantic/inference.py523CODE
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWfish_speech/tokenizer.py12logger = logging.getLogger(__name__)CODE
LOWfish_speech/callbacks/__init__.py4__all__ = ["GradNormMonitor", "GradAccumProgressBar"]CODE
LOWfish_speech/utils/__init__.py10__all__ = [CODE
LOWfish_speech/utils/braceexpand.py12__all__ = ["braceexpand", "alphabet", "UnbalancedBracesError"]CODE
LOWfish_speech/text/__init__.py3__all__ = ["clean_text"]CODE
LOWfish_speech/i18n/__init__.py3__all__ = ["i18n"]CODE
Magic Placeholder Names1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHtools/api_client.py133 default="YOUR_API_KEY",CODE
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtools/llama/build_dataset.py65def run_task(task):CODE
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOWfish_speech/configs/base.yaml81 # log_model: False # upload lightning ckptsCOMMENT