Dockerized FastAPI wrapper for Kokoro-82M text-to-speech model w/multiplatform CPU, AMD, NVIDIA GPU PyTorch support; voice-mixing, auto-stitching, captioned timestamps
This report presents the forensic synthetic code analysis of remsky/Kokoro-FastAPI, a Python project with 5,283 GitHub stars. SynthScan v2.0 examined 27,157 lines of code across 199 source files, recording 487 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 24.8 places this repository in the Moderate 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).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
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.
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.
The scanner identified 487 distinct pattern matches across 11 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 557 | print(f"Error: {response.text}") | CODE |
| LOW | README.md | 574 | except Exception as e: | CODE |
| MEDIUM | README.md | 575 | print(f"Error: {e}") | CODE |
| LOW | ui/lib/files.py | 64 | except Exception as e: | CODE |
| MEDIUM | ui/lib/files.py | 65 | print(f"Error saving file: {e}") | CODE |
| LOW | ui/lib/files.py | 77 | except Exception as e: | CODE |
| MEDIUM | ui/lib/files.py | 78 | print(f"Error deleting input files: {e}") | CODE |
| LOW | ui/lib/files.py | 90 | except Exception as e: | CODE |
| MEDIUM | ui/lib/files.py | 91 | print(f"Error deleting output files: {e}") | CODE |
| LOW | ui/lib/files.py | 122 | except Exception as e: | CODE |
| MEDIUM | ui/lib/files.py | 123 | print(f"Error saving uploaded file: {e}") | CODE |
| LOW | ui/lib/interface.py | 79 | except Exception as e: | CODE |
| MEDIUM | ui/lib/interface.py | 80 | print(f"Error in status update: {str(e)}") | CODE |
| MEDIUM | ui/lib/interface.py | 47 | def update_status(): | CODE |
| LOW | ui/lib/handlers.py | 37 | except Exception as e: | CODE |
| MEDIUM | ui/lib/handlers.py | 38 | print(f"Error in refresh status: {str(e)}") | CODE |
| LOW | ui/lib/handlers.py | 55 | except Exception as e: | CODE |
| MEDIUM | ui/lib/handlers.py | 56 | print(f"Error reading file: {e}") | CODE |
| LOW | ui/lib/handlers.py | 93 | except Exception as e: | CODE |
| MEDIUM | ui/lib/handlers.py | 94 | print(f"Error handling file: {e}") | CODE |
| MEDIUM | ui/lib/handlers.py | 12 | def refresh_status(): | CODE |
| LOW | ui/lib/api.py | 34 | except Exception as e: | CODE |
| LOW | ui/lib/api.py | 79 | except Exception as 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/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 | …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 |
| 97 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 549 | def generate_audio_from_phonemes(phonemes: str, voice: str = "af_bella"): | CODE |
| LOW | ui/depr_tests/test_components.py | 9 | def test_create_model_column_structure(): | CODE |
| LOW | ui/depr_tests/test_components.py | 29 | def test_model_column_default_values(): | CODE |
| LOW | ui/depr_tests/test_components.py | 57 | def test_model_column_no_voices(): | CODE |
| LOW | ui/depr_tests/test_components.py | 65 | def test_create_output_column_structure(): | CODE |
| LOW | ui/depr_tests/test_components.py | 91 | def test_output_column_configuration(): | CODE |
| LOW | ui/depr_tests/test_input.py | 7 | def test_create_input_column_structure(): | CODE |
| LOW⚡ | ui/depr_tests/test_input.py | 39 | def test_text_input_configuration(): | CODE |
| LOW⚡ | ui/depr_tests/test_input.py | 49 | def test_file_upload_configuration(): | CODE |
| LOW⚡ | ui/depr_tests/test_input.py | 58 | def test_button_configurations(): | CODE |
| LOW | ui/depr_tests/test_files.py | 25 | def test_list_input_files_empty(mock_dirs): | CODE |
| LOW | ui/depr_tests/test_files.py | 46 | def test_list_output_files_empty(mock_dirs): | CODE |
| LOW⚡ | ui/depr_tests/test_files.py | 66 | def test_read_text_file_empty_filename(mock_dirs): | CODE |
| LOW⚡ | ui/depr_tests/test_files.py | 71 | def test_read_text_file_nonexistent(mock_dirs): | CODE |
| LOW⚡ | ui/depr_tests/test_files.py | 76 | def test_read_text_file_success(mock_dirs): | CODE |
| LOW | ui/depr_tests/test_files.py | 91 | def test_save_text_auto_filename(mock_dirs): | CODE |
| LOW | ui/depr_tests/test_files.py | 106 | def test_save_text_custom_filename(mock_dirs): | CODE |
| LOW | ui/depr_tests/test_files.py | 115 | def test_save_text_duplicate_filename(mock_dirs): | CODE |
| LOW | ui/depr_tests/test_files.py | 131 | def test_delete_all_input_files(mock_dirs): | CODE |
| LOW | ui/depr_tests/test_files.py | 146 | def test_delete_all_output_files(mock_dirs): | CODE |
| LOW⚡ | ui/depr_tests/test_files.py | 161 | def test_process_uploaded_file_empty_path(mock_dirs): | CODE |
| LOW⚡ | ui/depr_tests/test_files.py | 166 | def test_process_uploaded_file_invalid_extension(mock_dirs, tmp_path): | CODE |
| LOW⚡ | ui/depr_tests/test_files.py | 173 | def test_process_uploaded_file_success(mock_dirs, tmp_path): | CODE |
| LOW | ui/depr_tests/test_files.py | 185 | def test_process_uploaded_file_duplicate(mock_dirs, tmp_path): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 27 | def test_check_api_status_success(mock_response): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 36 | def test_check_api_status_no_voices(mock_response): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 44 | def test_check_api_status_timeout(): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 52 | def test_check_api_status_connection_error(): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 60 | def test_text_to_speech_success(mock_response, tmp_path): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 75 | def test_text_to_speech_empty_text(): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 81 | def test_text_to_speech_timeout(): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 88 | def test_text_to_speech_request_error(): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 95 | def test_get_status_html_available(): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 102 | def test_get_status_html_unavailable(): | CODE |
| LOW⚡ | ui/depr_tests/test_api.py | 109 | def test_text_to_speech_api_params(mock_response, tmp_path): | CODE |
| LOW | ui/depr_tests/test_api.py | 146 | def test_text_to_speech_output_filename(mock_response, tmp_path): | CODE |
| LOW | ui/depr_tests/test_interface.py | 32 | def test_create_interface_structure(): | CODE |
| LOW | ui/depr_tests/test_interface.py | 43 | def test_interface_html_links(): | CODE |
| LOW | ui/depr_tests/test_interface.py | 62 | def test_update_status_available(mock_timer): | CODE |
| LOW | ui/depr_tests/test_interface.py | 83 | def test_update_status_unavailable(mock_timer): | CODE |
| LOW | ui/depr_tests/test_interface.py | 129 | def test_interface_components_presence(): | 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 | …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_openai_endpoints.py | 58 | def test_load_openai_mappings(mock_json_file): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 68 | def test_load_openai_mappings_file_not_found(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 117 | async def test_get_tts_service_initialization(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 139 | async def test_stream_audio_chunks_client_disconnect(): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 173 | def test_openai_voice_mapping(mock_tts_service, mock_openai_mappings): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 192 | def test_openai_voice_mapping_streaming( | CODE |
| LOW | api/tests/test_openai_endpoints.py | 215 | def test_invalid_openai_model(mock_tts_service, mock_openai_mappings): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 259 | def test_openai_speech_endpoint( | CODE |
| LOW | api/tests/test_openai_endpoints.py | 288 | def test_openai_speech_streaming(mock_tts_service, test_voice, mock_audio_bytes): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 311 | def test_openai_speech_pcm_streaming(mock_tts_service, test_voice, mock_audio_bytes): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 332 | def test_openai_speech_invalid_voice(mock_tts_service): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 355 | def test_openai_speech_empty_text(mock_tts_service, test_voice): | CODE |
| LOW | api/tests/test_openai_endpoints.py | 381 | def test_openai_speech_invalid_format(mock_tts_service, test_voice): | CODE |
| 63 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/depr_tests/test_components.py | 2 | CODE | |
| LOW | ui/depr_tests/conftest.py | 5 | CODE | |
| LOW | ui/depr_tests/test_input.py | 2 | CODE | |
| LOW | ui/depr_tests/test_files.py | 1 | CODE | |
| LOW | ui/depr_tests/test_interface.py | 1 | CODE | |
| LOW | ui/depr_tests/test_interface.py | 1 | CODE | |
| LOW | ui/lib/files.py | 1 | CODE | |
| LOW | ui/lib/files.py | 3 | CODE | |
| LOW | ui/lib/components/__init__.py | 1 | CODE | |
| LOW | ui/lib/components/__init__.py | 2 | CODE | |
| LOW | ui/lib/components/__init__.py | 3 | CODE | |
| LOW | ui/lib/components/model.py | 5 | CODE | |
| 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 | scripts/update_version.py | 12 | CODE | |
| LOW | scripts/fix_misaki.py | 5 | CODE | |
| LOW | api/tests/test_openai_endpoints.py | 3 | CODE | |
| LOW | api/tests/test_openai_endpoints.py | 4 | CODE | |
| LOW | api/tests/test_openai_endpoints.py | 11 | CODE | |
| LOW | api/tests/test_normalizer.py | 3 | CODE | |
| LOW | api/tests/conftest.py | 2 | CODE | |
| LOW | api/tests/conftest.py | 3 | CODE | |
| LOW | api/tests/conftest.py | 13 | CODE | |
| LOW | api/tests/test_tts_service.py | 1 | CODE | |
| LOW | api/tests/test_tts_service.py | 5 | CODE | |
| LOW | api/tests/test_development.py | 5 | CODE | |
| LOW | api/tests/test_development.py | 6 | CODE | |
| LOW | api/tests/test_kokoro_v1.py | 5 | CODE | |
| LOW | api/tests/test_audio_service.py | 9 | CODE | |
| LOW | api/tests/integration/conftest.py | 16 | CODE | |
| LOW | api/tests/integration/test_voices_endpoint.py | 8 | CODE | |
| LOW | api/tests/integration/test_tts_roundtrip.py | 14 | CODE | |
| LOW | api/src/main.py | 8 | CODE | |
| LOW | api/src/routers/openai_compatible.py | 8 | CODE | |
| LOW | api/src/routers/openai_compatible.py | 9 | CODE | |
| LOW | api/src/routers/openai_compatible.py | 14 | CODE | |
| LOW | api/src/routers/development.py | 2 | CODE | |
| LOW | api/src/routers/development.py | 3 | CODE | |
| LOW | api/src/routers/development.py | 4 | CODE | |
| LOW | api/src/routers/development.py | 5 | CODE | |
| LOW | api/src/routers/development.py | 6 | CODE | |
| LOW | api/src/routers/development.py | 6 | CODE | |
| LOW | api/src/routers/development.py | 6 | CODE | |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | api/src/routers/openai_compatible.py | 616 | Combine multiple voices into a new voice and return the .pt file. Args: request: Either a string with voice | STRING |
| HIGH | api/src/core/paths.py | 22 | 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 | 82 | 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 | 110 | Get path to voice file. Args: voice_name: Name of voice file (without .pt extension) Returns: | STRING |
| HIGH | api/src/core/paths.py | 168 | 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 | 210 | Load JSON file asynchronously. Args: path: Path to JSON file Returns: Parsed JSON data Ra | STRING |
| HIGH | api/src/core/paths.py | 230 | Load model weights asynchronously. Args: path: Path to model file (.pth or .onnx) device: Device to | STRING |
| HIGH | api/src/core/paths.py | 251 | Read text file asynchronously. Args: path: Path to file Returns: File contents as string | STRING |
| HIGH | api/src/core/paths.py | 270 | Read file as bytes asynchronously. Args: path: Path to file Returns: File contents as bytes | STRING |
| HIGH | api/src/core/paths.py | 289 | Get path to web static file. Args: filename: Name of file in web directory Returns: Absolute p | STRING |
| HIGH | api/src/core/paths.py | 379 | Get path to temporary audio file. Args: filename: Name of temp file Returns: Absolute path to | STRING |
| HIGH | api/src/inference/voice_manager.py | 26 | Get path to voice file. Args: voice_name: Name of voice Returns: Path to voice | STRING |
| HIGH | api/src/inference/voice_manager.py | 42 | Load voice tensor. Args: voice_name: Name of voice to load device: Optional override fo | STRING |
| HIGH | api/src/inference/voice_manager.py | 66 | Combine multiple voices. Args: voices: List of voice names to combine device: Optional | STRING |
| HIGH | api/src/inference/model_manager.py | 48 | Initialize and warm up model. Args: voice_manager: Voice manager instance for warmup Retur | STRING |
| HIGH | api/src/inference/kokoro_v1.py | 175 | Generate audio from phoneme tokens. Args: tokens: Input phoneme tokens to synthesize vo | STRING |
| HIGH | api/src/inference/kokoro_v1.py | 274 | Generate audio using model. Args: text: Input text to synthesize voice: Either a voice | STRING |
| HIGH | api/src/inference/base.py | 61 | Generate audio from text. Args: text: Input text to synthesize voice: Either a voice pa | STRING |
| HIGH | api/src/services/tts_service.py | 181 | Get voice path, handling combined voices. Args: voice: Voice name or combined voice names (e.g., 'a | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/lib/interface.py | 15 | # Check if local saving is disabled | COMMENT |
| LOW | ui/lib/handlers.py | 68 | # Read the file content | COMMENT |
| 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 | 103 | # Check if quotes were consistent (both present or both absent) | COMMENT |
| LOW | scripts/update_version.py | 110 | ): # Check if already correct *and* quoted | CODE |
| LOW | scripts/fix_misaki.py | 30 | # Check if the problematic line exists | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 159 | # Check if client is still connected | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 209 | # Check if streaming is requested (default for OpenAI client) | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 560 | # Check if requested model exists | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 630 | # Check if local voice saving is allowed | COMMENT |
| LOW | api/src/routers/openai_compatible.py | 644 | # Check if it's an OpenAI voice name | COMMENT |
| LOW | api/src/routers/development.py | 186 | # Check if streaming is requested (default for OpenAI client) | COMMENT |
| LOW | api/src/routers/web_player.py | 46 | # Read file content | COMMENT |
| LOW⚡ | api/src/services/tts_service.py | 173 | # Check if the path is None and raise a ValueError if it is not | COMMENT |
| LOW | api/src/services/text_processing/text_processor.py | 308 | # Check if the next part is a pause duration string | COMMENT |
| LOW | api/src/services/text_processing/text_processor.py | 311 | # Check if it looks like a valid number string captured by the regex group | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/lib/components/input.py | 8 | CODE | |
| 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 | 56 | CODE | |
| LOW | scripts/update_version.py | 158 | CODE | |
| LOW | api/src/routers/openai_compatible.py | 175 | CODE | |
| LOW | api/src/routers/development.py | 79 | CODE | |
| LOW | api/src/routers/development.py | 162 | CODE | |
| LOW | api/src/core/paths.py | 50 | CODE | |
| LOW | api/src/core/paths.py | 353 | CODE | |
| LOW | api/src/inference/kokoro_v1.py | 20 | CODE | |
| LOW | api/src/inference/kokoro_v1.py | 266 | CODE | |
| LOW | api/src/services/tts_service.py | 48 | CODE | |
| LOW | api/src/services/tts_service.py | 180 | CODE | |
| LOW | api/src/services/tts_service.py | 259 | CODE | |
| LOW | api/src/services/tts_service.py | 466 | CODE | |
| LOW | api/src/services/temp_manager.py | 14 | CODE | |
| LOW | api/src/services/text_processing/text_processor.py | 136 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | api/tests/test_model_unload.py | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | api/tests/test_model_unload.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | api/tests/test_model_unload.py | 187 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | api/tests/test_model_unload.py | 189 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | start-cpu.sh | 21 | # Apply the misaki patch to fix possible EspeakWrapper issue in older versions | COMMENT |
| LOW | docker/docker-compose.test.yml | 1 | name: kokoro-fastapi-test | COMMENT |
| LOW | docker/gpu/docker-compose.yml | 41 | # - "7860:7860" | COMMENT |
| LOW | docker/cpu/docker-compose.yml | 21 | - API_LOG_LEVEL=DEBUG | COMMENT |
| LOW | docker/cpu/docker-compose.yml | 41 | # - API_HOST=kokoro-tts # Set TTS service URL | COMMENT |
| LOW | docker/rocm/docker-compose.yml | 21 | # `docker compose down`; `docker compose down -v` clears them. Inspect | COMMENT |
| LOW | docker/rocm/docker-compose.yml | 41 | # See: https://github.com/ROCm/MIOpen/blob/develop/docs/conceptual/tuningdb.rst | COMMENT |
| LOW | charts/kokoro-fastapi/examples/aks-tls-values.yaml | 1 | # Tested on | COMMENT |
| LOW | .github/workflows/release.yml | 181 | REPO="${{ env.REPO }}" | COMMENT |
| 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 | ui/lib/components/__init__.py | 5 | __all__ = ["create_input_column", "create_model_column", "create_output_column"] | CODE |
| LOW | api/src/core/__init__.py | 3 | __all__ = ["settings"] | CODE |
| LOW | api/src/structures/__init__.py | 10 | __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 | 14 | __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 |