Vietnamese TTS with instant voice cloning • On-device • Real-time CPU inference • 48kHz audio quality • Chuyển văn bản thành giọng nói tiếng Việt • Text to speech tiếng Việt • TTS tiếng Việt
This report summarizes scanner evidence for pnnbao97/VieNeu-TTS, a Python project with 2,823 GitHub stars. SynthScan examined 22,619 lines of code across 114 source files, recording 519 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 39.1 (High 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? 199 finding(s).
Are imports declared and package/API names verified? 78 finding(s).
Are wrappers, guards, and repeated structures necessary? 398 finding(s).
Which changes need focused human review? 519 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 519 distinct pattern matches across 12 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 |
|---|---|---|---|---|
| MEDIUM | docker/docker-compose.build.yml | 2 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.build.yml | 4 | # ======================================================== | COMMENT |
| MEDIUM⚡ | docker/docker-compose.yml | 22 | # ======================================================== | COMMENT |
| MEDIUM⚡ | docker/docker-compose.yml | 25 | # ======================================================== | COMMENT |
| MEDIUM⚡ | docker/docker-compose.yml | 35 | # ======================================================== | COMMENT |
| MEDIUM⚡ | docker/docker-compose.yml | 38 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.yml | 56 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.yml | 61 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.yml | 135 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.yml | 137 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.prod.yml | 2 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.prod.yml | 4 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.prod.yml | 25 | # ======================================================== | COMMENT |
| MEDIUM | docker/docker-compose.prod.yml | 28 | # ======================================================== | COMMENT |
| MEDIUM | tests/test_utils.py | 328 | # ─── v3 join: silence_ps = TỔNG khoảng nghỉ, không phụ thuộc đuôi model ─────── | COMMENT |
| MEDIUM | tests/test_utils.py | 390 | # ─── Trần ký tự tương đối: phần dư ngắn gộp về chunk trước ──────────────────── | COMMENT |
| MEDIUM | tests/test_utils.py | 418 | # ── issue #198: encoder pad frame ───────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/fused/cases.py | 127 | # ── continuous batching (stream.py) ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/fused/cases.py | 251 | # ── issue #198: reference encoder must not append the audible pad frame ────── | COMMENT |
| MEDIUM | tests/fused/serve_guards.py | 30 | # ── stream scheduler ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/fused/serve_guards.py | 217 | # ── batch engine ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 12 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 14 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 23 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 25 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 40 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 42 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 52 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 54 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 73 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 75 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 86 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 88 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 105 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 107 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 127 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main_remote.py | 129 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 176 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main_remote.py | 178 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 16 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 18 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 27 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 29 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 39 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 41 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 57 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 59 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 69 | # --------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | examples/main.py | 71 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main.py | 87 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | examples/main.py | 89 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | apps/openai_speech.py | 96 | # ── engine + admission ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/openai_speech.py | 200 | # ── auth / errors in OpenAI's shape ─────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/openai_speech.py | 237 | # ── audio helpers ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/openai_speech.py | 273 | # ── /v1/audio/speech ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/openai_speech.py | 378 | # ── discovery ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/vieneu_utils/core_utils.py | 9 | # ─── Regex ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/vieneu_utils/core_utils.py | 28 | # ─── Tách câu nhận biết ngoặc/trích dẫn ────────────────────────────────────── | COMMENT |
| MEDIUM | src/vieneu_utils/core_utils.py | 56 | # ─── Data class ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/vieneu_utils/core_utils.py | 63 | # ─── Audio utils ───────────────────────────────────────────────────────────── | COMMENT |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_utils.py | 19 | def test_split_text_into_chunks(): | CODE |
| LOW⚡ | tests/test_utils.py | 26 | def test_split_text_paragraphs(): | CODE |
| LOW⚡ | tests/test_utils.py | 35 | def test_split_into_sentences_basic(): | CODE |
| LOW⚡ | tests/test_utils.py | 40 | def test_split_into_sentences_keeps_quoted_question_together(): | CODE |
| LOW⚡ | tests/test_utils.py | 45 | def test_split_into_sentences_brackets(): | CODE |
| LOW⚡ | tests/test_utils.py | 50 | def test_split_into_sentences_unbalanced_quote_falls_back(): | CODE |
| LOW⚡ | tests/test_utils.py | 56 | def test_split_into_sentences_apostrophe_is_not_a_quote(): | CODE |
| LOW⚡ | tests/test_utils.py | 61 | def test_split_into_sentences_decimal_not_split(): | CODE |
| LOW⚡ | tests/test_utils.py | 67 | def test_split_into_sentences_repeated_punct(): | CODE |
| LOW⚡ | tests/test_utils.py | 74 | def test_pack_sentences_respects_max_chars(): | CODE |
| LOW⚡ | tests/test_utils.py | 80 | def test_pack_sentences_splits_oversized_sentence_at_commas(): | CODE |
| LOW⚡ | tests/test_utils.py | 88 | def test_forced_word_cut_prefers_connector(): | CODE |
| LOW⚡ | tests/test_utils.py | 94 | def test_forced_word_cut_does_not_split_inside_connector_pair(): | CODE |
| LOW⚡ | tests/test_utils.py | 100 | def test_forced_word_cut_no_dangling_connector_before_pair(): | CODE |
| LOW⚡ | tests/test_utils.py | 106 | def test_forced_word_cut_never_splits_pair_even_without_natural_cut(): | CODE |
| LOW⚡ | tests/test_utils.py | 117 | def test_forced_word_cut_connector_too_early_is_ignored(): | CODE |
| LOW⚡ | tests/test_utils.py | 124 | def test_forced_word_cut_is_balanced_not_greedy(): | CODE |
| LOW⚡ | tests/test_utils.py | 133 | def test_forced_word_cut_never_splits_a_number(): | CODE |
| LOW⚡ | tests/test_utils.py | 146 | def test_forced_word_cut_no_connector_falls_back(): | CODE |
| LOW⚡ | tests/test_utils.py | 154 | def test_forced_word_cut_keeps_en_token_intact(): | CODE |
| LOW⚡ | tests/test_utils.py | 160 | def test_chunking_cuts_at_sentence_boundary_not_mid_quote(): | CODE |
| LOW⚡ | tests/test_utils.py | 195 | def test_linear_overlap_add_empty(): | CODE |
| LOW⚡ | tests/test_utils.py | 198 | def test_join_audio_chunks_simple(): | CODE |
| LOW⚡ | tests/test_utils.py | 205 | def test_join_audio_chunks_silence(): | CODE |
| LOW⚡ | tests/test_utils.py | 213 | def test_join_audio_chunks_crossfade(): | CODE |
| LOW⚡ | tests/test_utils.py | 247 | def test_merge_short_chunks_tiny_line_merges_into_next(): | CODE |
| LOW⚡ | tests/test_utils.py | 254 | def test_merge_short_chunks_prefers_non_para_boundary(): | CODE |
| LOW⚡ | tests/test_utils.py | 263 | def test_merge_short_chunks_tie_prefers_right(): | CODE |
| LOW⚡ | tests/test_utils.py | 271 | def test_merge_short_chunks_cascades_until_big_enough(): | CODE |
| LOW⚡ | tests/test_utils.py | 279 | def test_merge_short_chunks_leaves_long_chunks_alone(): | CODE |
| LOW⚡ | tests/test_utils.py | 285 | def test_merge_short_chunks_single_chunk_untouched(): | CODE |
| LOW⚡ | tests/test_utils.py | 290 | def test_merge_short_chunks_emotion_token_does_not_count_as_text(): | CODE |
| LOW⚡ | tests/test_utils.py | 297 | def test_max_expected_frames_monotonic_and_bounded(): | CODE |
| LOW⚡ | tests/test_utils.py | 307 | def test_max_expected_frames_single_word_hard_cap(): | CODE |
| LOW⚡ | tests/test_utils.py | 446 | def test_check_sampling_rejects_values_that_poison_the_gpu(bad): | CODE |
| LOW⚡ | tests/test_utils.py | 453 | def test_check_sampling_normalizes_types(): | CODE |
| LOW⚡ | tests/test_utils.py | 457 | def test_trust_remote_code_is_opt_in(monkeypatch): | CODE |
| LOW | tests/test_utils.py | 225 | def test_join_audio_chunks_empty(): | CODE |
| LOW | tests/test_utils.py | 228 | def test_join_audio_chunks_single(): | CODE |
| LOW | tests/test_utils.py | 323 | def test_max_expected_frames_ignores_markup(): | CODE |
| LOW | tests/test_utils.py | 349 | def test_edge_silence_and_trim_and_fade(): | CODE |
| LOW | tests/test_utils.py | 362 | def test_join_audio_chunks_silence_ps_is_min_pause(tail_s, lead_s): | CODE |
| LOW | tests/test_utils.py | 375 | def test_join_audio_chunks_silence_ps_gap_table(): | CODE |
| LOW | tests/test_utils.py | 379 | def test_pause_pad_samples_streaming(): | CODE |
| LOW | tests/test_utils.py | 392 | def test_soft_cap_short_tail_merges_into_previous_chunk(): | CODE |
| LOW | tests/test_utils.py | 406 | def test_soft_cap_long_tail_still_cut(): | CODE |
| LOW | tests/test_utils.py | 420 | def test_pad_to_codec_frame_rounds_up_to_whole_frames(): | CODE |
| LOW | tests/test_engine_remote.py | 21 | def test_remote_format_prompt(remote_tts): | CODE |
| LOW | tests/test_engine_remote.py | 34 | def test_remote_infer_single_chunk(mock_post, remote_tts): | CODE |
| LOW | tests/test_engine_remote.py | 46 | async def test_remote_infer_async_chunk(remote_tts): | CODE |
| LOW | tests/test_speaker_fbank.py | 22 | def test_fbank_shape_and_mean_norm(self): | CODE |
| LOW | tests/test_speaker_fbank.py | 40 | def test_cloning_front_end_is_torch_free(self): | CODE |
| LOW | tests/test_factory.py | 55 | def test_factory_invalid_mode(): | CODE |
| LOW | tests/test_v3turbo_clone_preclean.py | 10 | def test_preclean_reference_audio_trims_silence_and_returns_path(self): | CODE |
| LOW | tests/test_openai_speech.py | 59 | def test_valid_request_streams_wav(client, eng): | CODE |
| LOW | tests/test_openai_speech.py | 69 | def test_unread_response_still_frees_its_slot(eng): | CODE |
| LOW⚡ | tests/test_openai_speech.py | 90 | def test_out_of_range_sampling_is_rejected_up_front(client, eng, field, value): | CODE |
| LOW⚡ | tests/test_openai_speech.py | 97 | def test_nan_temperature_is_rejected(client, eng): | CODE |
| LOW⚡ | tests/test_openai_speech.py | 106 | def test_builtin_voice_cannot_be_replaced(client, eng, name): | CODE |
| LOW⚡ | tests/test_openai_speech.py | 112 | def test_new_voice_is_enrolled(client, eng): | CODE |
| 66 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_v3turbo_clone_preclean.py | 33 | except Exception: | CODE |
| HIGH | apps/ui_utils.py | 132 | except Exception: | CODE |
| HIGH | apps/gradio_xpu.py | 53 | except ImportError: | CODE |
| HIGH | apps/gradio_main.py | 75 | except ImportError: | CODE |
| HIGH | apps/gradio_main.py | 206 | except ImportError: | CODE |
| HIGH | src/vieneu_utils/url_extract.py | 45 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | src/vieneu/standard.py | 90 | except ImportError: | CODE |
| HIGH | src/vieneu/standard.py | 192 | except ImportError: | CODE |
| HIGH | src/vieneu/core_xpu.py | 137 | except Exception: | CODE |
| HIGH | src/vieneu/v3nano.py | 363 | except Exception: | CODE |
| HIGH | src/vieneu/v3turbo.py | 345 | except OSError: | CODE |
| HIGH | src/vieneu/v3turbo.py | 120 | except Exception: | CODE |
| HIGH | src/vieneu/v3turbo.py | 357 | except Exception: | CODE |
| HIGH | src/vieneu/v3turbo.py | 415 | except Exception: | CODE |
| HIGH | src/vieneu/base.py | 411 | except ImportError: | CODE |
| HIGH | src/vieneu/base.py | 485 | except Exception: | CODE |
| HIGH | src/vieneu/base.py | 230 | except Exception: | CODE |
| HIGH | src/vieneu/base.py | 385 | except Exception: | CODE |
| HIGH | src/vieneu/_v3_turbo_engine/onnx_denoiser.py | 79 | except Exception: | CODE |
| HIGH | src/vieneu/_v3_turbo_engine/onnx_runtime_lite.py | 92 | except Exception: | CODE |
| HIGH | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 78 | except Exception: | CODE |
| HIGH | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 420 | except Exception: | CODE |
| HIGH | src/vieneu/v3_turbo_serve/stream.py | 520 | except Exception: # noqa: BLE001 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_v3turbo_clone_preclean.py | 33 | except Exception: | CODE |
| LOW | tests/fused/cases.py | 279 | except Exception as e: # noqa: BLE001 — no model cache / no onnxruntime here | CODE |
| LOW | finetune/vieneu_lora/lora.py | 131 | except Exception as e: # optional extras; cloning may just lack them | CODE |
| LOW | examples/openai_speech_client.py | 142 | except Exception as e: # noqa: BLE001 — một client lỗi không được làm hỏng cả bench | CODE |
| MEDIUM | examples/openai_speech_client.py | 139 | def one(i): | CODE |
| LOW⚡ | examples/main_remote.py | 36 | except Exception as e: | CODE |
| LOW⚡ | examples/main_remote.py | 173 | except Exception as e: | CODE |
| LOW | apps/web_stream.py | 82 | except Exception as e: # noqa: BLE001 | CODE |
| MEDIUM | apps/web_stream.py | 71 | def voices(): | CODE |
| LOW | apps/user_voices.py | 98 | except Exception: | CODE |
| LOW | apps/openai_speech.py | 433 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | apps/ui_utils.py | 132 | except Exception: | CODE |
| LOW | apps/srt_speech.py | 128 | except Exception as e: # noqa: BLE001 — fall back to WAV below | CODE |
| LOW | apps/srt_speech.py | 161 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | apps/srt_speech.py | 172 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | apps/srt_speech.py | 197 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | apps/gradio_xpu.py | 64 | except Exception as e: | CODE |
| LOW | apps/gradio_xpu.py | 214 | except Exception as e: | CODE |
| LOW | apps/gradio_xpu.py | 226 | except Exception: | CODE |
| LOW | apps/gradio_xpu.py | 274 | except Exception as e: | CODE |
| LOW | apps/gradio_xpu.py | 337 | except Exception as e: | CODE |
| LOW | apps/gradio_xpu.py | 431 | except Exception as e: | CODE |
| LOW | apps/gradio_xpu.py | 471 | except Exception as e: | CODE |
| LOW | apps/gradio_xpu.py | 538 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 7 | except Exception: | CODE |
| LOW | apps/gradio_main.py | 64 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 91 | except Exception: | CODE |
| LOW | apps/gradio_main.py | 490 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 509 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 537 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 699 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 743 | except Exception as _e: # noqa: BLE001 | CODE |
| LOW | apps/gradio_main.py | 750 | except Exception: | CODE |
| LOW | apps/gradio_main.py | 822 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 955 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1049 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1216 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1328 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1431 | except Exception: | CODE |
| LOW | apps/gradio_main.py | 1457 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1655 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1673 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1702 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1719 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 1809 | except Exception as e: | CODE |
| LOW | apps/gradio_main.py | 2482 | except Exception: | CODE |
| LOW | apps/gradio_main.py | 2507 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | apps/gradio_main.py | 2525 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | apps/gradio_main.py | 2575 | except Exception: | CODE |
| LOW | src/vieneu_utils/url_extract.py | 21 | except Exception: | CODE |
| LOW | src/vieneu_utils/url_extract.py | 27 | except Exception as e: | CODE |
| LOW | src/vieneu/remote.py | 85 | except Exception as e: | CODE |
| LOW | src/vieneu/remote.py | 163 | except Exception as e: | CODE |
| LOW | src/vieneu/remote.py | 254 | except Exception as e: | CODE |
| LOW | src/vieneu/standard.py | 69 | except Exception as e: | CODE |
| LOW | src/vieneu/standard.py | 92 | except Exception as e: | CODE |
| LOW | src/vieneu/standard.py | 144 | except Exception as e: | CODE |
| LOW | src/vieneu/standard.py | 175 | except Exception as e: | CODE |
| LOW | src/vieneu/standard.py | 196 | except Exception as e: | CODE |
| LOW | src/vieneu/serve.py | 23 | except Exception: | CODE |
| 42 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_engine_remote.py | 3 | CODE | |
| LOW | tests/test_factory.py | 1 | CODE | |
| LOW | tests/test_v3turbo_clone_preclean.py | 1 | CODE | |
| LOW | tests/test_engine_standard.py | 7 | CODE | |
| LOW | tests/fused/cases.py | 8 | CODE | |
| LOW | finetune/prepare_dataset.py | 21 | CODE | |
| LOW | finetune/make_voice.py | 16 | CODE | |
| LOW | finetune/merge_lora.py | 10 | CODE | |
| LOW | finetune/train_lora.py | 18 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 10 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 10 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 10 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 11 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 11 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 12 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 12 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 12 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 12 | CODE | |
| LOW | finetune/vieneu_lora/__init__.py | 12 | CODE | |
| LOW | finetune/vieneu_lora/model.py | 15 | CODE | |
| LOW | finetune/vieneu_lora/utils.py | 2 | CODE | |
| LOW | finetune/vieneu_lora/lora.py | 9 | CODE | |
| LOW | finetune/vieneu_lora/lora.py | 13 | CODE | |
| LOW | finetune/vieneu_lora/data.py | 30 | CODE | |
| LOW | apps/user_voices.py | 14 | CODE | |
| LOW | apps/openai_speech.py | 55 | CODE | |
| LOW | apps/openai_speech.py | 70 | CODE | |
| LOW | apps/srt_speech.py | 15 | CODE | |
| LOW | apps/gradio_xpu.py | 22 | CODE | |
| LOW | apps/gradio_xpu.py | 25 | CODE | |
| LOW | apps/gradio_xpu.py | 29 | CODE | |
| LOW | apps/gradio_xpu.py | 29 | CODE | |
| LOW | apps/gradio_main.py | 22 | CODE | |
| LOW | apps/gradio_main.py | 24 | CODE | |
| LOW | apps/gradio_main.py | 27 | CODE | |
| LOW | apps/gradio_main.py | 41 | CODE | |
| LOW | apps/gradio_main.py | 41 | CODE | |
| LOW | src/vieneu/remote.py | 10 | CODE | |
| LOW | src/vieneu/standard.py | 9 | CODE | |
| LOW | src/vieneu/__init__.py | 1 | CODE | |
| LOW | src/vieneu/serve.py | 2 | CODE | |
| LOW | src/vieneu/turbo.py | 4 | CODE | |
| LOW | src/vieneu/turbo.py | 11 | CODE | |
| LOW | src/vieneu/fast.py | 9 | CODE | |
| LOW | src/vieneu/core_xpu.py | 2 | CODE | |
| LOW | src/vieneu/core_xpu.py | 5 | CODE | |
| LOW | src/vieneu/utils.py | 86 | CODE | |
| LOW | src/vieneu/v3nano.py | 25 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/hub_load_v3_turbo.py | 1 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/onnx_denoiser.py | 22 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/onnx_runtime_lite.py | 24 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/modeling_v3_turbo.py | 22 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/rep_history.py | 13 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/configuration_v3_turbo.py | 2 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/prompt_v3_turbo.py | 1 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 21 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 32 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 32 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/speaker/onnx_extractor.py | 15 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/speaker/fbank.py | 1 | CODE | |
| 18 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/vieneu/remote.py | 52 | CODE | |
| LOW | src/vieneu/remote.py | 100 | CODE | |
| LOW | src/vieneu/remote.py | 180 | CODE | |
| LOW | src/vieneu/remote.py | 209 | CODE | |
| LOW | src/vieneu/remote.py | 258 | CODE | |
| LOW | src/vieneu/standard.py | 200 | CODE | |
| LOW | src/vieneu/standard.py | 237 | CODE | |
| LOW | src/vieneu/standard.py | 295 | CODE | |
| LOW | src/vieneu/turbo.py | 118 | CODE | |
| LOW | src/vieneu/turbo.py | 190 | CODE | |
| LOW | src/vieneu/turbo.py | 277 | CODE | |
| LOW | src/vieneu/turbo.py | 316 | CODE | |
| LOW | src/vieneu/fast.py | 20 | CODE | |
| LOW | src/vieneu/fast.py | 127 | CODE | |
| LOW | src/vieneu/fast.py | 155 | CODE | |
| LOW | src/vieneu/fast.py | 187 | CODE | |
| LOW | src/vieneu/core_xpu.py | 140 | CODE | |
| LOW | src/vieneu/v3nano.py | 432 | CODE | |
| LOW | src/vieneu/v3nano.py | 458 | CODE | |
| LOW | src/vieneu/v3turbo.py | 134 | CODE | |
| LOW | src/vieneu/v3turbo.py | 588 | CODE | |
| LOW | src/vieneu/v3turbo.py | 638 | CODE | |
| LOW | src/vieneu/v3turbo.py | 758 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/onnx_runtime_lite.py | 381 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/onnx_runtime_lite.py | 487 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/configuration_v3_turbo.py | 17 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 161 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 202 | CODE | |
| LOW | src/vieneu/v3_turbo_serve/engine.py | 111 | CODE | |
| LOW | src/vieneu/v3_turbo_serve/engine.py | 220 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_v3turbo_clone_preclean.py | 10 | CODE | |
| LOW | finetune/vieneu_lora/lora.py | 96 | CODE | |
| LOW | examples/openai_speech_client.py | 73 | CODE | |
| LOW | apps/ui_utils.py | 63 | CODE | |
| LOW | apps/ui_utils.py | 64 | CODE | |
| LOW | apps/gradio_xpu.py | 122 | CODE | |
| LOW | apps/gradio_xpu.py | 291 | CODE | |
| LOW | apps/gradio_xpu.py | 489 | CODE | |
| LOW | apps/gradio_main.py | 304 | CODE | |
| LOW | apps/gradio_main.py | 880 | CODE | |
| LOW | apps/gradio_main.py | 1404 | CODE | |
| LOW | apps/gradio_main.py | 1544 | CODE | |
| LOW | apps/gradio_main.py | 1255 | CODE | |
| LOW | src/vieneu_utils/core_utils.py | 230 | CODE | |
| LOW | src/vieneu_utils/core_utils.py | 291 | CODE | |
| LOW | src/vieneu_utils/core_utils.py | 484 | CODE | |
| LOW | src/vieneu_utils/core_utils.py | 606 | CODE | |
| LOW | src/vieneu_utils/core_utils.py | 818 | CODE | |
| LOW | src/vieneu_utils/core_utils.py | 857 | CODE | |
| LOW | src/vieneu/remote.py | 109 | CODE | |
| LOW | src/vieneu/standard.py | 72 | CODE | |
| LOW | src/vieneu/serve.py | 26 | CODE | |
| LOW | src/vieneu/v3turbo.py | 638 | CODE | |
| LOW | src/vieneu/base.py | 326 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/onnx_runtime_lite.py | 487 | CODE | |
| LOW | src/vieneu/_v3_turbo_engine/inference_v3_turbo.py | 261 | CODE | |
| LOW | src/vieneu/v3_turbo_serve/stream.py | 325 | CODE | |
| LOW | src/vieneu/v3_turbo_serve/engine.py | 111 | CODE | |
| LOW | src/vieneu/v3_turbo_serve/engine.py | 220 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/vieneu/utils.py | 133 | # Default to CPU for now as requested for 'lightweight' | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README_PYPI.md | 81 | # | COMMENT |
| LOW | README.md | 201 | # import time | COMMENT |
| LOW | README.vi.md | 201 | # tắt). Một infer() cho text dài cũng tự batch các chunk. Cần realtime thì dùng | COMMENT |
| LOW | examples/main_v3turbo.py | 21 | # audio = vieneu.infer("Nghe hay quá đi [cười]. Để mình nói tiếp [hắng giọng].", voice="Ngọc Linh") | COMMENT |
| LOW | src/vieneu_utils/core_utils.py | 61 | is_sentence_end: bool # True = kết thúc câu thật | False = cắt nhân tạo | COMMENT |
| LOW | src/vieneu_utils/core_utils.py | 81 | EDGE_THRESH_DB = -45.0 # ngưỡng "có tiếng" trên envelope mean|x| cửa sổ 10 ms | COMMENT |
| LOW | src/vieneu_utils/phonemize_text.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | finetune/vieneu_lora/__init__.py | 14 | __all__ = [ | CODE |
| LOW | src/vieneu/__init__.py | 3 | __all__ = ["Vieneu"] | CODE |
| LOW | src/vieneu/_v3_turbo_engine/__init__.py | 8 | __all__ = [ | CODE |
| LOW | src/vieneu/_v3_turbo_engine/speaker/__init__.py | 15 | __all__ = [ | CODE |
| LOW | src/vieneu/v3_turbo_serve/__init__.py | 10 | __all__ = ["generate_frame_batched", "BatchedBackbone", "V3TurboBatchEngine", "V3TurboStreamScheduler"] | CODE |
| LOW | src/vieneu/v3_turbo_serve/stream.py | 65 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/gradio_main.py | 1597 | # Use lowercase key for robust matching | COMMENT |
| MEDIUM | src/vieneu/standard.py | 255 | # If model is Torch, we can leverage true batch generation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/gradio_main.py | 349 | # Check if it is a LoRA to merge | COMMENT |
| LOW | apps/gradio_main.py | 438 | # Check if already merged (and voices.json exists) | COMMENT |
| LOW | apps/gradio_main.py | 687 | # Check if backbone matches expected type for merge | COMMENT |
| LOW | src/vieneu/serve.py | 109 | # Check if lmdeploy is installed | COMMENT |