Dockerized OpenAI-compatible wrapper for Kokoro-82M text-to-speech w/multiplatform CPU, AMD, NVIDIA GPU PyTorch; multi-speaker, clone-tuning, caption timestamps, SSML, optional readalong web UI
This report summarizes scanner evidence for remsky/Kokoro-FastAPI, a Python project with 5,530 GitHub stars. SynthScan examined 37,856 lines of code across 246 source files, recording 623 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 23.4 (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.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 401 finding(s).
Are imports declared and package/API names verified? 48 finding(s).
Are wrappers, guards, and repeated structures necessary? 499 finding(s).
Which changes need focused human review? 623 finding(s).
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.
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.
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.
The scanner identified 623 distinct pattern matches across 17 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 577 | def generate_audio_from_phonemes(phonemes: str, voice: str = "af_bella"): | CODE |
| LOW | examples/captioned_speech_example.py | 11 | def generate_captioned_speech( | CODE |
| LOW | examples/phoneme_examples/generate_phonemes.py | 35 | def generate_audio_from_phonemes(phonemes: str, voice: str = "af_bella") -> Optional[bytes]: | CODE |
| LOW | examples/assorted_checks/test_dialogue/test_dialogue.py | 146 | def check_pause_between_turns() -> tuple[bool, str]: | CODE |
| LOW | examples/assorted_checks/test_dialogue/test_dialogue.py | 165 | def check_voice_actually_switches() -> tuple[bool, str]: | CODE |
| LOW | examples/assorted_checks/test_dialogue/test_dialogue.py | 188 | def check_unknown_voice_rejected() -> tuple[bool, str]: | CODE |
| LOW | examples/assorted_checks/test_dialogue/test_dialogue.py | 202 | def check_tags_ignored_unless_requested() -> tuple[bool, str]: | CODE |
| LOW | …cks/benchmarks/benchmark_first_token_stream_unified.py | 17 | def measure_first_token_requests( | CODE |
| LOW | …cks/benchmarks/benchmark_first_token_stream_unified.py | 98 | def measure_first_token_openai( | CODE |
| LOW | examples/assorted_checks/benchmarks/lib/stream_utils.py | 27 | def process_benchmark_results( | CODE |
| LOW | examples/assorted_checks/benchmarks/lib/shared_utils.py | 22 | def check_audio_file_is_silent(audio_path: str, threshold: float = 0.01) -> bool: | CODE |
| LOW⚡ | api/tests/test_ssml.py | 19 | def test_plain_text_passthrough(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 24 | def test_roots_merely_starting_with_speak_pass_through(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 30 | def test_namespaced_speak_root_still_translates(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 35 | def test_break_time_and_strength(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 42 | def test_phoneme_maps_to_custom_ipa(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 54 | def test_voice_gated_and_reverts(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 62 | def test_prosody_rate_gated_and_reverts(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 70 | def test_prosody_spanning_a_voice_reasserts_the_rate(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 80 | def test_prosody_rate_percent_and_number(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 89 | def test_prosody_rate_clamps_to_the_request_bounds(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 98 | def test_prosody_pitch_only_stays_noop(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 108 | def test_every_ignored_element_speaks_text_only(tag): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 118 | def test_adjacent_blocks_keep_a_separator(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 123 | def test_audio_desc_is_dropped_and_fallback_text_survives(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 128 | def test_unsupported_tags_are_noops(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 133 | def test_malformed_ssml_raises(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 147 | def test_prolog_before_the_root_still_translates(prolog): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 152 | def test_dtd_is_refused_rather_than_expanded(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 162 | def test_nesting_is_refused_past_the_configured_depth(): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 168 | def test_max_depth_is_configurable(monkeypatch): | CODE |
| LOW⚡ | api/tests/test_ssml.py | 176 | def test_depth_cap_fires_long_before_the_recursion_limit(): | CODE |
| LOW | api/tests/test_ssml.py | 196 | def test_provider_corpus_never_leaks_markup(doc): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 59 | def test_load_openai_mappings(mock_json_file): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 69 | def test_load_openai_mappings_file_not_found(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 118 | async def test_get_tts_service_initialization(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 142 | async def test_stream_audio_chunks_client_disconnect(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 179 | async def test_stream_audio_chunks_closes_source_on_disconnect(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 217 | async def test_abandoned_stream_closes_audio_writer(mock_tts_service): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 261 | def test_openai_voice_mapping(mock_tts_service, mock_openai_mappings): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 280 | def test_openai_voice_mapping_streaming( | CODE |
| LOW | api/tests/test_openai_endpoints.py | 303 | def test_invalid_openai_model(mock_tts_service, mock_openai_mappings): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 347 | def test_openai_speech_endpoint(mock_tts_service, test_voice, mock_audio_bytes): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 367 | def test_openai_speech_streaming(mock_tts_service, test_voice, mock_audio_bytes): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 436 | def test_openai_speech_streaming_null_normalization_options( | CODE |
| LOW | api/tests/test_openai_endpoints.py | 480 | def test_phonemize_returns_phonemes(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 490 | def test_openai_speech_pcm_streaming(mock_tts_service, test_voice, mock_audio_bytes): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 511 | def test_openai_speech_invalid_voice(mock_tts_service): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 534 | def test_openai_speech_empty_text(mock_tts_service, test_voice): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 556 | def test_openai_speech_invalid_format(mock_tts_service, test_voice): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 590 | def test_omitted_voice_uses_default_voice_setting(mock_tts_service): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 640 | def test_combine_voices_weighted(mock_settings, mock_tts_service, tmp_path): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 659 | def test_combine_voices_list_input(mock_settings, mock_tts_service, tmp_path): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 672 | def test_combine_voices_unknown_voice(mock_settings, mock_tts_service): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 684 | def test_combine_voices_disabled(mock_settings, mock_tts_service): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 742 | async def test_streaming_initialization_error(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 793 | def test_resolve_download_name(requested, expected): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 808 | def test_download_uses_temp_name_by_default(temp_download_file): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 817 | def test_download_honors_requested_name(temp_download_file): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 830 | def test_download_rejects_traversal_in_requested_name(temp_download_file): | CODE |
| 264 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 585 | print(f"Error: {response.text}") | CODE |
| LOW | README.md | 602 | except Exception as e: | CODE |
| MEDIUM | README.md | 603 | print(f"Error: {e}") | CODE |
| LOW | docker/scripts/download_model.py | 66 | except Exception: | CODE |
| LOW | docker/scripts/download_model.py | 124 | except Exception as e: | CODE |
| LOW | docker/scripts/download_model.py | 158 | except Exception: | CODE |
| LOW | docker/scripts/download_model.py | 179 | except Exception as e: | CODE |
| MEDIUM | docker/scripts/download_model.py | 150 | def get(): | CODE |
| LOW | docker/rocm/warmup_miopen.py | 65 | except Exception as e: | CODE |
| LOW⚡ | examples/simul_file_test.py | 33 | except Exception as e: | CODE |
| MEDIUM⚡ | examples/simul_file_test.py | 34 | print(f"Error processing file {file_id}: {e}") | CODE |
| LOW | examples/stream_tts_playback.py | 109 | except Exception as e: | CODE |
| MEDIUM | examples/stream_tts_playback.py | 110 | print(f"Error during streaming: {str(e)}") | CODE |
| MEDIUM | examples/captioned_speech_example.py | 33 | print(f"Error response: {response.text}") | CODE |
| MEDIUM⚡ | examples/captioned_speech_example.py | 46 | print("Error: Empty audio content") | CODE |
| MEDIUM⚡ | examples/captioned_speech_example.py | 51 | print(f"Error parsing timestamps: {e}") | CODE |
| MEDIUM⚡ | examples/captioned_speech_example.py | 54 | print(f"Error retrieving timestamps: {e}") | CODE |
| MEDIUM | examples/captioned_speech_example.py | 79 | print("Error: No audio data or timestamps generated") | CODE |
| MEDIUM | examples/captioned_speech_example.py | 100 | print(f"Error: {e}\n") | CODE |
| MEDIUM⚡ | examples/phoneme_examples/test_phoneme_generation.py | 41 | print(f"Error: API request failed with status code {response.status_code}") | CODE |
| LOW⚡ | examples/phoneme_examples/test_phoneme_generation.py | 44 | except Exception as e: | CODE |
| MEDIUM⚡ | examples/phoneme_examples/test_phoneme_generation.py | 45 | print(f"An error occurred: {str(e)}") | CODE |
| MEDIUM | examples/phoneme_examples/generate_phonemes.py | 49 | print(f"Error response: {response.text}") | CODE |
| MEDIUM | examples/phoneme_examples/generate_phonemes.py | 53 | print("Error: Empty response content") | CODE |
| MEDIUM | examples/phoneme_examples/generate_phonemes.py | 94 | print("Error: No audio data generated") | CODE |
| MEDIUM | examples/phoneme_examples/generate_phonemes.py | 110 | print(f"Error: {e}\n") | CODE |
| MEDIUM | examples/assorted_checks/validate_wavs.py | 11 | print(f"Error: {result['error']}") | CODE |
| LOW | examples/assorted_checks/validate_wav.py | 159 | except Exception as e: | CODE |
| MEDIUM | examples/assorted_checks/validate_wav.py | 262 | print(f"Error: {result['error']}") | CODE |
| MEDIUM | examples/assorted_checks/generate_readme_plots.py | 56 | print(f"Error: {result['error']}") | CODE |
| LOW | examples/assorted_checks/test_dialogue/test_dialogue.py | 236 | except Exception as exc: | CODE |
| LOW | …les/assorted_checks/test_formats/test_audio_formats.py | 94 | except Exception as e: | CODE |
| MEDIUM | …les/assorted_checks/test_formats/test_audio_formats.py | 95 | print(f"Error plotting waveform for {format_name}: {e}") | CODE |
| LOW | …les/assorted_checks/test_formats/test_audio_formats.py | 299 | except Exception as e: | CODE |
| MEDIUM | …les/assorted_checks/test_formats/test_audio_formats.py | 300 | print(f"Error writing {fmt} file: {e}") | CODE |
| LOW | …ecks/test_combinations/test_analyze_combined_voices.py | 58 | except Exception as e: | CODE |
| MEDIUM | …ecks/test_combinations/test_analyze_combined_voices.py | 59 | print(f"Error reading file: {str(e)}") | CODE |
| LOW⚡ | …ecks/test_combinations/test_analyze_combined_voices.py | 188 | except Exception as e: | CODE |
| MEDIUM⚡ | …ecks/test_combinations/test_analyze_combined_voices.py | 189 | print(f"Error generating audio for {voice}: {e}") | CODE |
| LOW⚡ | …ecks/test_combinations/test_analyze_combined_voices.py | 197 | except Exception as e: | CODE |
| MEDIUM⚡ | …ecks/test_combinations/test_analyze_combined_voices.py | 198 | print(f"Error analyzing {name}: {e}") | CODE |
| LOW | …sorted_checks/test_combinations/test_download_voice.py | 70 | except Exception as e: | CODE |
| MEDIUM | …sorted_checks/test_combinations/test_download_voice.py | 71 | print(f"Error downloading combination {combo}: {e}") | CODE |
| LOW | …cks/benchmarks/benchmark_first_token_stream_unified.py | 93 | except Exception as e: | CODE |
| LOW | …cks/benchmarks/benchmark_first_token_stream_unified.py | 165 | except Exception as e: | CODE |
| LOW | …es/assorted_checks/benchmarks/benchmark_first_token.py | 64 | except Exception as e: | CODE |
| MEDIUM | …es/assorted_checks/benchmarks/benchmark_first_token.py | 107 | print(f"Error: {result['error']}") | CODE |
| MEDIUM⚡ | …sorted_checks/benchmarks/lib/shared_benchmark_utils.py | 104 | print(f"Error making request for text: {text[:50]}... Error: {str(e)}") | CODE |
| LOW⚡ | …sorted_checks/benchmarks/lib/shared_benchmark_utils.py | 106 | except Exception as e: | CODE |
| MEDIUM⚡ | …sorted_checks/benchmarks/lib/shared_benchmark_utils.py | 107 | print(f"Error processing text: {text[:50]}... Error: {str(e)}") | CODE |
| MEDIUM | examples/assorted_checks/benchmarks/lib/stream_utils.py | 175 | print(f"Error: {result['error']}") | CODE |
| LOW | examples/assorted_checks/test_openai/test_openai_tts.py | 34 | except Exception as e: | CODE |
| MEDIUM | examples/assorted_checks/test_openai/test_openai_tts.py | 35 | print(f"Error: {str(e)}") | CODE |
| LOW | examples/assorted_checks/test_openai/test_openai_tts.py | 57 | except Exception as e: | CODE |
| MEDIUM | examples/assorted_checks/test_openai/test_openai_tts.py | 58 | print(f"Error: {str(e)}") | CODE |
| LOW | …s/assorted_checks/test_voices/trim_voice_dimensions.py | 60 | except Exception as e: | CODE |
| LOW | examples/assorted_checks/test_voices/test_all_voices.py | 37 | except Exception as e: | STRING |
| MEDIUM | examples/assorted_checks/test_voices/test_all_voices.py | 38 | print(f"Error with voice {voice}: {str(e)}") | STRING |
| LOW | examples/assorted_checks/test_voices/test_all_voices.py | 59 | except Exception as e: | STRING |
| MEDIUM | examples/assorted_checks/test_voices/test_all_voices.py | 60 | print(f"Error getting voices: {str(e)}") | STRING |
| 88 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | api/src/core/paths.py | 55 | Find file in search paths. Args: filename: Name of file to find search_paths: List of paths to sear | STRING |
| HIGH | api/src/core/paths.py | 115 | Get path to model file. Args: model_name: Name of model file Returns: Absolute path to model f | STRING |
| HIGH | api/src/core/paths.py | 137 | Get path to voice file. Args: voice_name: Name of voice file (without .pt extension) Returns: | STRING |
| HIGH | api/src/core/paths.py | 183 | Load voice tensor from file. Args: voice_path: Path to voice file device: Device to load tensor to | STRING |
| HIGH | api/src/core/paths.py | 225 | Load JSON file asynchronously. Args: path: Path to JSON file Returns: Parsed JSON data Ra | STRING |
| HIGH | api/src/core/paths.py | 245 | Load model weights asynchronously. Args: path: Path to model file (.pth) device: Device to load mod | STRING |
| HIGH | api/src/core/paths.py | 266 | Read text file asynchronously. Args: path: Path to file Returns: File contents as string | STRING |
| HIGH | api/src/core/paths.py | 285 | Read file as bytes asynchronously. Args: path: Path to file Returns: File contents as bytes | STRING |
| HIGH | api/src/core/paths.py | 304 | Get path to web static file. Args: filename: Name of file in web directory Returns: Absolute p | STRING |
| HIGH | api/src/core/paths.py | 374 | Get path to temporary audio file. Args: filename: Name of temp file Returns: Absolute path to | STRING |
| HIGH | api/src/inference/voice_manager.py | 35 | Get path to voice file. Args: voice_name: Name of voice Returns: Path to voice | STRING |
| HIGH | api/src/inference/voice_manager.py | 53 | Load voice tensor. Args: voice_name: Name of voice to load device: Optional override fo | STRING |
| HIGH | api/src/inference/model_manager.py | 53 | Initialize and warm up model. Args: voice_manager: Voice manager instance for warmup Retur | STRING |
| HIGH | api/src/inference/kokoro_v1.py | 217 | Generate audio from phoneme tokens. Args: tokens: Input phoneme tokens to synthesize vo | STRING |
| HIGH | api/src/inference/kokoro_v1.py | 316 | Generate audio using model. Args: text: Input text to synthesize voice: Either a voice | STRING |
| HIGH | api/src/inference/base.py | 46 | Generate audio from text. Args: text: Input text to synthesize voice: Either a voice pa | STRING |
| HIGH | api/src/services/tts_service.py | 184 | Get voice path, handling combined voices. Args: voice: Voice name or combined voice names (e.g., 'a | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docker/scripts/download_model.py | 158 | except Exception: | CODE |
| HIGH | …ted_checks/benchmarks/benchmark_first_token_lazy_ab.py | 79 | except requests.RequestException: | CODE |
| HIGH | examples/assorted_checks/benchmarks/lib/shared_utils.py | 18 | except ImportError: | CODE |
| HIGH | …s/assorted_checks/test_transcription/test_long_form.py | 221 | except Exception: | CODE |
| HIGH | api/src/routers/openai_compatible.py | 513 | except: | CODE |
| HIGH | api/src/routers/openai_compatible.py | 530 | except: | CODE |
| HIGH | api/src/routers/openai_compatible.py | 547 | except: | CODE |
| HIGH | api/src/routers/development.py | 428 | except: | CODE |
| HIGH | api/src/routers/development.py | 445 | except: | CODE |
| HIGH | api/src/routers/development.py | 462 | except: | CODE |
| HIGH | api/src/routers/tune.py | 52 | except Exception: | CODE |
| HIGH | api/src/routers/tune.py | 56 | except OSError: | CODE |
| HIGH | api/src/inference/model_manager.py | 221 | except asyncio.CancelledError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | api/tests/test_inno_tuner.py | 346 | svc.model_manager.get_backend.return_value.forget_voice.assert_called_once() | CODE |
| CRITICAL | api/tests/test_inno_tuner.py | 205 | svc.model_manager.get_backend.return_value.forget_voice.assert_called_once() | CODE |
| CRITICAL | api/tests/test_inno_tuner.py | 232 | svc.model_manager.get_backend.return_value.forget_voice.assert_called_once() | CODE |
| CRITICAL | api/tests/test_inno_tuner.py | 248 | svc.model_manager.get_backend.return_value.forget_voice.assert_called_once() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/rocm/warmup_miopen.py | 19 | CODE | |
| LOW | …ples/streaming_refactor/benchmark_unified_streaming.py | 7 | CODE | |
| LOW | examples/phoneme_examples/test_phoneme_generation.py | 3 | CODE | |
| LOW | examples/phoneme_examples/generate_phonemes.py | 2 | CODE | |
| LOW | examples/phoneme_examples/generate_phonemes.py | 2 | CODE | |
| LOW | examples/assorted_checks/validate_wav.py | 1 | CODE | |
| LOW | …ecks/test_combinations/test_analyze_combined_voices.py | 2 | CODE | |
| LOW | …sorted_checks/test_combinations/test_download_voice.py | 2 | CODE | |
| LOW | …amples/assorted_checks/benchmarks/benchmark_tts_rtf.py | 3 | CODE | |
| LOW | …amples/assorted_checks/benchmarks/benchmark_tts_rtf.py | 4 | CODE | |
| LOW | …amples/assorted_checks/benchmarks/benchmark_tts_rtf.py | 8 | CODE | |
| LOW | …es/assorted_checks/benchmarks/benchmark_first_token.py | 3 | CODE | |
| LOW | …es/assorted_checks/benchmarks/benchmark_first_token.py | 6 | CODE | |
| LOW | …mples/assorted_checks/benchmarks/depr_benchmark_tts.py | 2 | CODE | |
| LOW | examples/assorted_checks/benchmarks/lib/stream_utils.py | 4 | CODE | |
| LOW | examples/assorted_checks/benchmarks/lib/stream_utils.py | 5 | CODE | |
| LOW | …/test_transcription/test_transcription_multilingual.py | 26 | CODE | |
| LOW | …sorted_checks/test_transcription/test_transcription.py | 18 | CODE | |
| LOW | …s/assorted_checks/test_transcription/test_long_form.py | 25 | CODE | |
| LOW | api/tests/test_real_model.py | 10 | CODE | |
| LOW | api/tests/integration/conftest.py | 16 | CODE | |
| LOW | api/tests/integration/test_voices_endpoint.py | 8 | CODE | |
| LOW | api/tests/integration/test_rate_durations.py | 9 | CODE | |
| LOW | api/tests/integration/test_tts_roundtrip.py | 14 | CODE | |
| LOW | api/src/core/__init__.py | 1 | CODE | |
| LOW | api/src/structures/__init__.py | 1 | CODE | |
| LOW | api/src/structures/__init__.py | 1 | CODE | |
| LOW | api/src/structures/__init__.py | 1 | CODE | |
| LOW | api/src/structures/__init__.py | 1 | CODE | |
| LOW | api/src/structures/__init__.py | 1 | CODE | |
| LOW | api/src/structures/__init__.py | 1 | CODE | |
| LOW | api/src/structures/__init__.py | 1 | CODE | |
| LOW | api/src/inference/__init__.py | 3 | CODE | |
| LOW | api/src/inference/__init__.py | 4 | CODE | |
| LOW | api/src/inference/__init__.py | 5 | CODE | |
| LOW | api/src/inference/__init__.py | 5 | CODE | |
| LOW | api/src/services/__init__.py | 1 | CODE | |
| LOW | api/src/services/text_processing/__init__.py | 3 | CODE | |
| LOW | api/src/services/text_processing/__init__.py | 3 | CODE | |
| LOW | api/src/services/text_processing/__init__.py | 4 | CODE | |
| LOW | api/src/services/text_processing/__init__.py | 5 | CODE | |
| LOW | api/src/services/text_processing/__init__.py | 5 | CODE | |
| LOW | api/src/services/text_processing/__init__.py | 6 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/scripts/download_model.sh | 78 | # Check if files already exist and are valid | COMMENT |
| LOW | docker/scripts/download_model.py | 86 | # Check if files already exist and are valid | COMMENT |
| LOW | docker/rocm/kdb_install.sh | 27 | # Check if Torch installation path exists | COMMENT |
| LOW | docker/rocm/kdb_install.sh | 60 | # Check if files were downloaded. No KDB files in repo.radeon will result in error. | COMMENT |
| LOW | docker/rocm/kdb_install.sh | 88 | # Check if files were downloaded. No KDB files in repo.radeon will result in error. | COMMENT |
| LOW⚡ | examples/simul_file_test.py | 27 | # Open file in binary write mode | COMMENT |
| LOW | examples/simul_openai_streaming_audio.py | 55 | # Open file in binary write mode | COMMENT |
| LOW | …ples/streaming_refactor/benchmark_unified_streaming.py | 133 | # Print results for this test | COMMENT |
| LOW | examples/phoneme_examples/test_phoneme_generation.py | 25 | # Check if request was successful | COMMENT |
| LOW | examples/assorted_checks/test_normalizer.py | 302 | # Print results | COMMENT |
| LOW | …les/assorted_checks/test_formats/test_audio_formats.py | 281 | # Write the file and verify it was written correctly | COMMENT |
| LOW | scripts/update_version.py | 101 | # Check if quotes were consistent (both present or both absent) | COMMENT |
| LOW | scripts/update_version.py | 108 | ): # Check if already correct *and* quoted | CODE |
| LOW | scripts/fix_misaki.py | 29 | # Check if the problematic line exists | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 289 | # Check if client is still connected | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 359 | # Check if streaming is requested (default for OpenAI client) | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 706 | # Check if requested model exists | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 776 | # Check if local voice saving is allowed | COMMENT |
| LOW | api/src/routers/development.py | 255 | # Check if streaming is requested (default for OpenAI client) | COMMENT |
| LOW | api/src/routers/web_player.py | 49 | # Read file content | COMMENT |
| LOW⚡ | api/src/services/tts_service.py | 176 | # Check if the path is None and raise a ValueError if it is not | COMMENT |
| LOW | api/src/services/text_processing/text_processor.py | 333 | # Check if the next part is a pause duration string | COMMENT |
| LOW | api/src/services/text_processing/text_processor.py | 336 | # Check if it looks like a valid number string captured by the regex group | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/scripts/download_model.py | 70 | CODE | |
| LOW | examples/stream_tts_playback.py | 11 | CODE | |
| LOW | examples/phoneme_examples/test_phoneme_generation.py | 5 | CODE | |
| LOW | examples/phoneme_examples/generate_phonemes.py | 59 | CODE | |
| LOW | examples/assorted_checks/validate_wavs.py | 27 | CODE | |
| LOW | examples/assorted_checks/validate_wav.py | 10 | CODE | |
| LOW | …les/assorted_checks/test_formats/test_audio_formats.py | 52 | CODE | |
| LOW | …cks/benchmarks/benchmark_first_token_stream_unified.py | 17 | CODE | |
| LOW | …cks/benchmarks/benchmark_first_token_stream_unified.py | 98 | CODE | |
| LOW | …sorted_checks/benchmarks/lib/shared_benchmark_utils.py | 31 | CODE | |
| LOW | examples/assorted_checks/benchmarks/lib/stream_utils.py | 107 | CODE | |
| LOW | examples/assorted_checks/benchmarks/lib/shared_utils.py | 150 | CODE | |
| LOW | scripts/update_version.py | 54 | CODE | |
| LOW | scripts/update_version.py | 156 | CODE | |
| LOW | api/src/routers/openai_compatible.py | 305 | CODE | |
| LOW | api/src/routers/development.py | 93 | CODE | |
| LOW | api/src/routers/development.py | 211 | CODE | |
| LOW | api/src/core/paths.py | 83 | CODE | |
| LOW | api/src/core/paths.py | 348 | CODE | |
| LOW | api/src/inference/kokoro_v1.py | 23 | CODE | |
| LOW | api/src/inference/kokoro_v1.py | 308 | CODE | |
| LOW | api/src/services/tts_service.py | 51 | CODE | |
| LOW | api/src/services/tts_service.py | 183 | CODE | |
| LOW | api/src/services/tts_service.py | 316 | CODE | |
| LOW | api/src/services/tts_service.py | 545 | CODE | |
| LOW | api/src/services/temp_manager.py | 14 | CODE | |
| LOW | api/src/services/text_processing/text_processor.py | 273 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | api/tests/test_model_unload.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | api/tests/test_model_unload.py | 44 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | api/tests/test_model_unload.py | 329 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | api/tests/test_model_unload.py | 331 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | api/tests/test_real_model.py | 0 | streamed wavs carry a placeholder frame count, so size the data chunk instead. | STRING |
| HIGH | api/tests/integration/test_rate_durations.py | 0 | streamed wavs carry a placeholder frame count, so size the data chunk instead. | STRING |
| HIGH | api/tests/integration/test_tts_roundtrip.py | 0 | streamed wavs carry a placeholder frame count, so size the data chunk instead. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | examples/simul_speaker_test.py | 10 | # Create a shared PyAudio instance | COMMENT |
| MEDIUM | examples/simul_openai_streaming_audio.py | 11 | # Create a shared PyAudio instance | COMMENT |
| MEDIUM | examples/phoneme_examples/generate_phonemes.py | 21 | # Create the request payload | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/docker-compose.test.yml | 1 | name: kokoro-fastapi-test | COMMENT |
| LOW | docker/cpu/docker-compose.yml | 21 | # - ALLOW_DEV_UNLOAD=true | COMMENT |
| LOW | docker/rocm/docker-compose.yml | 41 | # Uncomment if matmuls are slow or unstable; falls back to hipBLAS. | COMMENT |
| LOW | charts/kokoro-fastapi/examples/aks-tls-values.yaml | 1 | # Tested on | COMMENT |
| LOW | .github/workflows/release.yml | 181 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | api/src/core/__init__.py | 3 | __all__ = ["settings"] | CODE |
| LOW | api/src/structures/__init__.py | 11 | __all__ = [ | CODE |
| LOW | api/src/inference/__init__.py | 7 | __all__ = [ | CODE |
| LOW | api/src/services/__init__.py | 3 | __all__ = ["TTSService"] | CODE |
| LOW | api/src/services/text_processing/__init__.py | 8 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/docker-compose.test.yml | 3 | # Test orchestration. Brings up the Kokoro server and the Whisper-equipped | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …ples/assorted_checks/test_dialogue/caption_dialogue.py | 8 | timestamps are identical, the voice field is null, and the tags get spoken. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | api/tests/test_openai_endpoints.py | 1187 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | api/src/services/tts_service.py | 316 | CODE |