OpenTalking: An industrial-grade open-source AI digital human framework that supports real-time conversation, private deployment, and pluggable models.
This report presents the forensic synthetic code analysis of datascale-ai/opentalking, a Python project with 2,291 GitHub stars. SynthScan v2.0 examined 387,057 lines of code across 813 source files, recording 2043 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 5.4 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
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 2043 distinct pattern matches across 13 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 |
|---|---|---|---|---|
| LOW | opentalking/export_store.py | 59 | def _metadata_path_for_export(root: Path | str, export_id: str) -> Path | None: | CODE |
| LOW | opentalking/scene_assets.py | 98 | def _seed_default_backgrounds(self) -> None: | CODE |
| LOW | opentalking/video_creation.py | 64 | def _export_with_download_url(item: dict[str, Any]) -> dict[str, Any]: | CODE |
| LOW | opentalking/video_creation.py | 73 | def _reference_duration_options(settings: object) -> set[int]: | CODE |
| LOW | opentalking/video_creation.py | 86 | def _validate_reference_duration(settings: object, duration_sec: int | None) -> int: | CODE |
| LOW | opentalking/video_creation.py | 95 | def _coerce_composition_float( | CODE |
| LOW | opentalking/video_creation.py | 140 | def _normalize_video_composition_config( | CODE |
| LOW | opentalking/video_creation.py | 190 | def _composition_background_color(value: object) -> tuple[int, int, int]: | CODE |
| LOW | opentalking/video_creation.py | 316 | def _build_reference_driver_pcm(total_samples: int, *, level: float = 480.0) -> np.ndarray: | CODE |
| LOW | opentalking/video_creation.py | 328 | def _reference_driver_audio_path(settings: object) -> Path: | CODE |
| LOW | opentalking/video_creation.py | 333 | def _fit_reference_driver_pcm(pcm: np.ndarray, total_samples: int) -> np.ndarray: | CODE |
| LOW | opentalking/video_creation.py | 355 | async def _load_reference_driver_pcm(settings: object, total_samples: int) -> np.ndarray | None: | CODE |
| LOW | opentalking/video_creation.py | 458 | def _fasterliveportrait_video_config( | CODE |
| LOW | opentalking/video_creation.py | 472 | def _fasterliveportrait_preroll_samples(settings: object, model: str, sample_rate: int) -> int: | CODE |
| LOW | opentalking/video_creation.py | 524 | def _resolve_avatar_relative_path(avatar_path: Path, raw: object) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 537 | def _avatar_manifest_metadata(avatar_path: Path) -> dict[str, Any]: | CODE |
| LOW | opentalking/video_creation.py | 542 | def _quicktalk_manifest_section(avatar_path: Path) -> dict[str, Any]: | CODE |
| LOW | opentalking/video_creation.py | 610 | def _quicktalk_cache_video_size(settings: object, avatar_path: Path) -> tuple[int, int] | None: | CODE |
| LOW | opentalking/video_creation.py | 651 | def _quicktalk_declared_video_source(avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 662 | def _quicktalk_prepared_template_video(settings: object, avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 694 | def _quicktalk_template_video(settings: object, avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 701 | def _quicktalk_template_frame_dir(avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 739 | def _quicktalk_init_session_kwargs(settings: object, avatar_path: Path) -> dict[str, object]: | CODE |
| LOW | opentalking/video_creation.py | 851 | def _quicktalk_multiface_worker_class(): | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 637 | def _avatar_manifest_metadata(self) -> dict[str, Any]: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 649 | def _quicktalk_manifest_metadata(self) -> dict[str, Any]: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 654 | def _resolve_avatar_relative_path(self, raw: str) -> Path | None: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1052 | async def _prepare_idle_cache_background(self, ref_image_path: Path) -> None: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1201 | def _build_fasterliveportrait_idle_frames(self, reference_frame: np.ndarray) -> list[np.ndarray]: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1415 | def _legacy_bool_setting_declared(*names: str) -> bool: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1426 | def _tts_opener_enabled_for_model(self) -> bool: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 60 | def _agent_memory_enabled_for_runtime( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 169 | async def _synthesize_tts_opener_pcm( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 468 | def _fasterliveportrait_video_config( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 541 | async def update_fasterliveportrait_runtime_config( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 559 | def _fasterliveportrait_ref_image_payload( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 602 | def _quicktalk_cache_video_size(self) -> tuple[int, int] | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 666 | def _quicktalk_manifest_section(self) -> dict[str, Any]: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 723 | def _quicktalk_template_video(self) -> Path | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 742 | def _quicktalk_template_frame_dir(self) -> Path | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 890 | async def _on_connection_state_change() -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 970 | async def _await_dynamic_idle_prepare_done(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 984 | async def _prepare_dynamic_idle_cache(self, ref_image_path: Path) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1233 | def _load_idle_frames_from_disk(self, cache_path: Path, cache_key: str) -> list[np.ndarray]: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1257 | def _save_idle_frames_to_disk( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1437 | def _tts_opener_preload_enabled_for_model(self) -> bool: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1448 | def _tts_opener_preload_voice(self) -> str | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1539 | async def _queue_initial_video_frame(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1563 | async def _queue_fasterliveportrait_rest_frame(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1587 | def _ensure_media_clock_started(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1628 | def _playback_backpressure_config(self) -> tuple[int, int, float]: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1642 | async def _wait_for_playback_capacity( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1693 | def create_speak_uploaded_pcm_task( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1706 | async def _run_speak_uploaded_pcm_task( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2808 | async def _generate_flashtalk_frames( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3005 | async def _append_recording_frames_if_enabled(self, frames: list[Any]) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3028 | def _trace_queued_video_frame(self, frame: Any) -> None: | CODE |
| LOW | opentalking/pipeline/speak/idle_frames.py | 96 | def build_idle_playback_indices(frame_count: int, mode: str) -> list[int]: | CODE |
| LOW | opentalking/pipeline/speak/tts_openers.py | 113 | def normalize_tts_lookup_text(text: str) -> str: | CODE |
| LOW | opentalking/pipeline/speak/tts_openers.py | 138 | def build_tts_opener_candidates(user_text: str) -> list[tuple[str, str]]: | CODE |
| 1094 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 1 | CODE | |
| LOW | opentalking/__init__.py | 3 | CODE | |
| LOW | opentalking/export_store.py | 1 | CODE | |
| LOW | opentalking/scene_assets.py | 1 | CODE | |
| LOW | opentalking/video_creation.py | 1 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 6 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 13 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 70 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 70 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 91 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 139 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 139 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 139 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 139 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 150 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 150 | CODE | |
| LOW | opentalking/pipeline/speak/env_helpers.py | 5 | CODE | |
| LOW | opentalking/pipeline/speak/audio2video_runner.py | 1 | CODE | |
| LOW | opentalking/pipeline/speak/audio_pipeline.py | 1 | CODE | |
| LOW | opentalking/pipeline/speak/idle_frames.py | 6 | CODE | |
| LOW | opentalking/pipeline/speak/tts_openers.py | 8 | CODE | |
| LOW | opentalking/pipeline/speak/audio_utils.py | 5 | CODE | |
| LOW | opentalking/pipeline/speak/render_pipeline.py | 1 | CODE | |
| LOW | opentalking/pipeline/speak/text_sanitize.py | 1 | CODE | |
| LOW | opentalking/pipeline/recording/recording.py | 1 | CODE | |
| LOW | opentalking/pipeline/recording/offline_export.py | 3 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1 | CODE | |
| LOW | opentalking/core/config.py | 1 | CODE | |
| LOW | opentalking/core/model_config.py | 1 | CODE | |
| LOW | opentalking/core/in_memory_redis.py | 7 | CODE | |
| LOW | opentalking/core/registry.py | 11 | CODE | |
| LOW | opentalking/core/__init__.py | 3 | CODE | |
| LOW | opentalking/core/__init__.py | 3 | CODE | |
| LOW | opentalking/core/__init__.py | 4 | CODE | |
| LOW | opentalking/core/__init__.py | 5 | CODE | |
| LOW | opentalking/core/__init__.py | 6 | CODE | |
| LOW | opentalking/core/__init__.py | 7 | CODE | |
| LOW | opentalking/core/__init__.py | 7 | CODE | |
| LOW | opentalking/core/__init__.py | 8 | CODE | |
| LOW | opentalking/core/__init__.py | 9 | CODE | |
| LOW | opentalking/core/__init__.py | 9 | CODE | |
| LOW | opentalking/core/__init__.py | 9 | CODE | |
| LOW | opentalking/core/__init__.py | 9 | CODE | |
| LOW | opentalking/core/__init__.py | 9 | CODE | |
| LOW | opentalking/core/__init__.py | 16 | CODE | |
| LOW | opentalking/core/__init__.py | 16 | CODE | |
| LOW | opentalking/core/bus.py | 1 | CODE | |
| LOW | opentalking/core/model_paths.py | 1 | CODE | |
| LOW | opentalking/core/queue_status.py | 1 | CODE | |
| LOW | opentalking/core/session_store.py | 1 | CODE | |
| LOW | opentalking/core/types/events.py | 1 | CODE | |
| LOW | opentalking/core/types/__init__.py | 3 | CODE | |
| LOW | opentalking/core/types/__init__.py | 3 | CODE | |
| LOW | opentalking/core/types/__init__.py | 3 | CODE | |
| LOW | opentalking/core/types/__init__.py | 3 | CODE | |
| LOW | opentalking/core/types/__init__.py | 3 | CODE | |
| LOW | opentalking/core/types/__init__.py | 10 | CODE | |
| LOW | opentalking/core/types/__init__.py | 10 | CODE | |
| LOW | opentalking/core/types/frames.py | 1 | CODE | |
| LOW | opentalking/core/interfaces/tts_adapter.py | 1 | CODE | |
| 327 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | opentalking/video_creation.py | 365 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 643 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1047 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1056 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1196 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1422 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 214 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 346 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 368 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 379 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 397 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 450 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 478 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 533 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 584 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 838 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 913 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 981 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1079 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1242 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1269 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1487 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1718 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1742 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1767 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2177 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2232 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2238 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2361 | except Exception as e: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2697 | except Exception as e: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2939 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3011 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3025 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3071 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3086 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/idle_frames.py | 140 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/render_pipeline.py | 43 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/recording/recording.py | 116 | except Exception: | CODE |
| LOW | opentalking/pipeline/session/runner.py | 364 | except Exception: | CODE |
| LOW | opentalking/pipeline/session/runner.py | 386 | except Exception: | CODE |
| LOW | opentalking/pipeline/session/runner.py | 507 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 607 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 623 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 676 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 723 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 988 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1008 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1109 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1542 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1550 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1619 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1666 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1883 | except Exception: | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1985 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 2034 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/providers/memory/factory.py | 132 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/providers/memory/runtime.py | 104 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/providers/memory/runtime.py | 234 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/providers/memory/runtime.py | 266 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/providers/memory/runtime.py | 283 | except Exception: # noqa: BLE001 | CODE |
| 239 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/unit/test_local_audio_frontend.py | 707 | assert workspace.count("setActiveIndexTTSPresetLabel(null)") >= 5 | CODE |
| HIGH | tests/unit/test_local_audio_frontend.py | 160 | assert "setOutputUrl(null)" in return_block | CODE |
| HIGH⚡ | tests/frontend/test_immersive_conversation_mode.py | 36 | assert "avatarMaskUrl?: string | null;" in source | CODE |
| HIGH⚡ | tests/frontend/test_immersive_conversation_mode.py | 149 | assert "avatarAdjust={immersiveActive ? immersiveAvatarAdjust : undefined}" in source | CODE |
| HIGH⚡ | tests/frontend/test_default_model_selection.py | 11 | default_idx = source.index("if (defaultModel && available.has(defaultModel)") | CODE |
| HIGH | tests/frontend/test_video_creation_duo_dialog.py | 21 | assert "duo_dialog: DuoDialogCapability | null;" in source | CODE |
| HIGH | tests/frontend/test_video_creation_reference_video.py | 30 | assert "if (!videoBackgroundId) return null;" not in source | CODE |
| HIGH⚡ | scripts/benchmark_opentalking_e2e.py | 835 | pid="$(cat "$pid_file" 2>/dev/null)" | CODE |
| HIGH⚡ | scripts/benchmark_opentalking_e2e.py | 837 | kill "$pid" >/dev/null 2>&1 || true | CODE |
| HIGH⚡ | scripts/benchmark_opentalking_e2e.py | 839 | kill -0 "$pid" >/dev/null 2>&1 || break | CODE |
| HIGH⚡ | scripts/benchmark_opentalking_e2e.py | 842 | kill -0 "$pid" >/dev/null 2>&1 && kill -9 "$pid" >/dev/null 2>&1 || true | CODE |
| HIGH⚡ | scripts/benchmark_opentalking_e2e.py | 842 | kill -0 "$pid" >/dev/null 2>&1 && kill -9 "$pid" >/dev/null 2>&1 || true | CODE |
| HIGH⚡ | scripts/benchmark_opentalking_e2e.py | 852 | kill "$pid" >/dev/null 2>&1 || true | CODE |
| HIGH⚡ | scripts/benchmark_opentalking_e2e.py | 857 | kill "$pid" >/dev/null 2>&1 || true | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | opentalking/__init__.py | 5 | __all__ = ["__version__"] | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1204 | def _set_idle_frames(self, frames: list[np.ndarray]) -> None: | CODE |
| LOW | opentalking/core/__init__.py | 18 | __all__ = [ | CODE |
| LOW | opentalking/core/types/__init__.py | 12 | __all__ = [ | CODE |
| LOW | opentalking/core/interfaces/__init__.py | 11 | __all__ = [ | CODE |
| LOW | opentalking/providers/llm/__init__.py | 5 | __all__ = ["ConversationHistory", "OpenAICompatibleLLMClient", "SentenceSplitter"] | CODE |
| LOW | opentalking/providers/llm/openai_compatible/__init__.py | 8 | __all__ = ["OpenAICompatibleLLMClient"] | CODE |
| LOW | opentalking/providers/memory/__init__.py | 6 | __all__ = ["MemoryItem", "MemoryLibrary", "build_memory_provider"] | CODE |
| LOW | opentalking/providers/synthesis/audio2video_client.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/providers/synthesis/__init__.py | 55 | __all__ = [ | CODE |
| LOW | opentalking/providers/synthesis/mock.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/providers/synthesis/video_clone/__init__.py | 5 | __all__ = ["MAGIC_FRAME", "MAGIC_VIDEO", "VideoCloneWSClient"] | CODE |
| LOW | opentalking/providers/synthesis/flashtalk/__init__.py | 5 | __all__ = ["FlashTalkWSClient"] | CODE |
| LOW | opentalking/providers/synthesis/flashhead/__init__.py | 6 | __all__ = ["FlashHeadHTTPClient", "FlashHeadWSClient"] | CODE |
| LOW | opentalking/providers/rtc/__init__.py | 3 | __all__ = ["WebRTCSession"] | CODE |
| LOW | opentalking/providers/tts/__init__.py | 14 | __all__ = ["build_tts_adapter", "create_tts_adapter", "EdgeTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/dashscope_qwen/__init__.py | 8 | __all__ = ["DashScopeQwenTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/omnirt_indextts/__init__.py | 3 | __all__ = ["OmniRTIndexTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/local_qwen3_tts/__init__.py | 5 | __all__ = ["LocalQwen3TTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/cosyvoice_ws/__init__.py | 8 | __all__ = ["DashScopeCosyVoiceWsAdapter"] | CODE |
| LOW | opentalking/providers/tts/mock/__init__.py | 6 | __all__ = ["MockTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/local_f5_tts/__init__.py | 5 | __all__ = ["LocalF5TTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/edge/__init__.py | 8 | __all__ = ["EdgeTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/elevenlabs/__init__.py | 8 | __all__ = ["ElevenLabsTTSAdapter", "list_elevenlabs_voices"] | CODE |
| LOW | opentalking/providers/tts/local_cosyvoice/__init__.py | 5 | __all__ = ["LocalCosyVoiceTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/openai_compatible/__init__.py | 5 | __all__ = ["OpenAICompatibleTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/local_indextts/__init__.py | 5 | __all__ = ["LocalIndexTTSAdapter"] | CODE |
| LOW | opentalking/providers/tts/dashscope_sambert/__init__.py | 8 | __all__ = ["DashScopeSambertTTSAdapter"] | CODE |
| LOW | opentalking/providers/stt/__init__.py | 5 | __all__ = ["transcribe_audio_file_path"] | CODE |
| LOW | opentalking/providers/stt/openai_compatible/__init__.py | 5 | __all__ = ["OpenAICompatibleSTTAdapter"] | CODE |
| LOW | opentalking/runtime/timing.py | 29 | def set_value(self, name: str, value: int | float) -> None: | CODE |
| LOW | opentalking/runtime/task_consumer.py | 161 | def _update_runner_agent_knowledge_bases(runner: Any, knowledge_base_ids: list[str]) -> None: | CODE |
| LOW | opentalking/agent/knowledge_store.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/agent/__init__.py | 7 | __all__ = [ | CODE |
| LOW | opentalking/models/__init__.py | 13 | __all__ = [ | CODE |
| LOW | opentalking/models/musetalk/face_utils.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/models/musetalk/adapter.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/models/musetalk/loader.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/models/musetalk/feature_extractor.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/models/musetalk/inference.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | opentalking/models/quicktalk/__init__.py | 5 | __all__ = ["QuickTalkAdapter"] | CODE |
| LOW | opentalking/models/wav2lip/adapter.py | 439 | def set_wav2lip_postprocess_mode(self, mode: str | None) -> None: | CODE |
| LOW | opentalking/voice/__init__.py | 5 | __all__ = ["VoiceEntry", "get_sqlite_path", "init_voice_store", "list_voices"] | CODE |
| LOW | opentalking/avatar/__init__.py | 5 | __all__ = [ | CODE |
| LOW | opentalking/avatar/matting/__init__.py | 33 | __all__ = [ | CODE |
| LOW | opentalking/persona/__init__.py | 18 | __all__ = [ | CODE |
| LOW | opentalking/events/__init__.py | 4 | __all__ = ["EventEmitter", "event_sse_payload"] | CODE |
| LOW | tests/unit/test_audio2video_client.py | 275 | def set_wav2lip_postprocess_mode(self, mode: str | None) -> None: | CODE |
| LOW | tests/unit/test_task_consumer.py | 602 | def set_wav2lip_postprocess_mode(self, mode: str | None) -> None: | CODE |
| LOW | apps/api/core/config.py | 3 | __all__ = ["Settings", "get_settings"] | CODE |
| LOW | apps/api/routes/sessions.py | 269 | def _update_runner_agent_knowledge_bases(runner: object, knowledge_base_ids: list[str]) -> None: | CODE |
| LOW | apps/api/routes/tts_preview.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | apps/api/routes/avatars.py | 329 | def _update_manifest_matting_status(manifest_path: Path, image: Image.Image) -> None: | CODE |
| LOW⚡ | apps/api/routes/avatars.py | 352 | def _update_manifest_dimensions(manifest_path: Path, image: Image.Image) -> None: | CODE |
| LOW | apps/api/services/session_service.py | 173 | async def update_session_state(r: redis.Redis, sid: str, state: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/en/examples/product-demo-live-sales.md | 32 | ### Step 1: Enter the "Real-Time Conversation" Workflow | COMMENT |
| LOW | docs/en/examples/product-demo-live-sales.md | 42 | ### Step 2: Select a Digital Human Avatar Suitable for the Business Scenario | COMMENT |
| LOW | docs/en/examples/product-demo-live-sales.md | 60 | ### Step 3: Fill In and Save the Role Persona | COMMENT |
| LOW | docs/en/examples/product-demo-live-sales.md | 119 | ### Step 4: Confirm Driving Model, Voice, and Digital Human Status, Then Start Dialogue | COMMENT |
| LOW | docs/en/examples/product-demo-live-sales.md | 131 | ### Step 5: Enter the First Product Introduction Question | COMMENT |
| LOW | docs/en/examples/product-demo-live-sales.md | 147 | ### Step 6: Follow Up on Core Selling Points | COMMENT |
| LOW | docs/en/examples/product-demo-live-sales.md | 163 | ### Step 7: Add User Concerns and Target Audience Testing | COMMENT |
| LOW | docs/en/examples/product-demo-live-sales.md | 183 | ### Step 8: Add Discount and Conversion Language to Form a Complete Sales Loop | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 32 | ### Step 1: Enter the Real-Time Conversation Workflow and View the Initial Avatar | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 44 | ### Step 2: Set Up the Financial News Anchor Persona | COMMENT |
| LOW⚡ | docs/en/examples/course-news-presenter.md | 62 | ### Step 3: Switch Digital Human Avatar to "News Anchor" | COMMENT |
| LOW⚡ | docs/en/examples/course-news-presenter.md | 72 | ### Step 4: Confirm WebRTC Interface Connection Successful | COMMENT |
| LOW⚡ | docs/en/examples/course-news-presenter.md | 82 | ### Step 5: Enter Chinese News Broadcasting Question | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 100 | ### Step 6: Switch to "International Sports News Anchor" Persona | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 118 | ### Step 7: Switch to English Sports News Broadcasting | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 130 | ### Step 8: Enter English News Broadcasting Question | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 148 | ### Step 9: Switch to "Japanese Cultural Tourism News Anchor" Persona | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 166 | ### Step 10: Enter Japanese News Broadcasting Question | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 184 | ### Step 11: Switch to "Cantonese Local Lifestyle News Anchor" Persona | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 202 | ### Step 12: Prepare to Switch Voice to Kiki | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 212 | ### Step 13: Enter Cantonese News Broadcasting Question | COMMENT |
| LOW | docs/en/examples/course-news-presenter.md | 230 | ### Step 14: Complete Cantonese News Broadcasting Output | COMMENT |
| LOW | docs/en/examples/companion.md | 32 | ### Step 1: Enter the "Real-Time Conversation" Workflow and View the Initial Avatar | COMMENT |
| LOW | docs/en/examples/companion.md | 44 | ### Step 2: Set Up the Persona | COMMENT |
| LOW | docs/en/examples/companion.md | 68 | ### Step 3: Select a Digital Human Avatar Suitable for Companion Scenarios | COMMENT |
| LOW | docs/en/examples/companion.md | 86 | ### Step 4: Confirm the Driving Model and Start the Conversation | COMMENT |
| LOW | docs/en/examples/companion.md | 96 | ### Step 5: Enter the First Daytime Fatigue Companion Question | COMMENT |
| LOW | docs/en/examples/companion.md | 114 | ### Step 6: Verify Emotional Comfort and Lightweight Advice | COMMENT |
| LOW | docs/en/examples/companion.md | 132 | ### Step 7: Add a Loneliness Companion Scenario | COMMENT |
| LOW | docs/en/examples/companion.md | 150 | ### Step 8: Enter a "Simple Action Right Now" Advice Question | COMMENT |
| LOW | docs/en/examples/companion.md | 168 | ### Step 9: Verify Multi-Turn Memory and Context Continuity | COMMENT |
| LOW | docs/en/examples/companion.md | 186 | ### Step 10: Daytime Companion Closing, Switch to a Softer Tone | COMMENT |
| LOW | docs/en/examples/companion.md | 204 | ### Step 11: Complete the Real-Time Companion Role Demo Summary | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | opentalking/video_creation.py | 662 | CODE | |
| LOW | opentalking/video_creation.py | 1232 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 468 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 817 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1786 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1873 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2135 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 890 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 960 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1128 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1459 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1739 | CODE | |
| LOW | opentalking/core/config.py | 16 | CODE | |
| LOW | opentalking/core/model_config.py | 277 | CODE | |
| LOW | opentalking/providers/memory/bm25.py | 36 | CODE | |
| LOW | opentalking/providers/memory/runtime.py | 466 | CODE | |
| LOW | opentalking/providers/synthesis/availability.py | 126 | CODE | |
| LOW | …entalking/providers/synthesis/flashhead/http_client.py | 274 | CODE | |
| LOW | opentalking/providers/tts/indextts_config.py | 68 | CODE | |
| LOW | opentalking/providers/tts/voice_assets.py | 137 | CODE | |
| LOW | opentalking/providers/tts/dashscope_qwen/adapter.py | 346 | CODE | |
| LOW | opentalking/providers/tts/edge/adapter.py | 135 | CODE | |
| LOW | opentalking/providers/tts/elevenlabs/adapter.py | 93 | CODE | |
| LOW | opentalking/providers/tts/local_cosyvoice/adapter.py | 489 | CODE | |
| LOW | opentalking/providers/tts/local_cosyvoice/adapter.py | 523 | CODE | |
| LOW | opentalking/providers/stt/dashscope/adapter.py | 41 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 198 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 361 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 508 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 402 | CODE | |
| LOW | opentalking/agent/knowledge_store.py | 370 | CODE | |
| LOW | opentalking/models/quicktalk/adapter.py | 204 | CODE | |
| LOW | opentalking/models/quicktalk/adapter.py | 520 | CODE | |
| LOW | opentalking/models/wav2lip/loader.py | 69 | CODE | |
| LOW | opentalking/models/wav2lip/feature_extractor.py | 72 | CODE | |
| LOW | opentalking/avatar/validator.py | 8 | CODE | |
| LOW | opentalking/avatar/wav2lip_preload.py | 125 | CODE | |
| LOW | opentalking/avatar/duo_dialog.py | 67 | CODE | |
| LOW | scripts/local_cosyvoice_service.py | 986 | CODE | |
| LOW | scripts/local_cosyvoice_service.py | 1077 | CODE | |
| LOW | scripts/local_cosyvoice_service.py | 545 | CODE | |
| LOW | scripts/local_cosyvoice_service.py | 771 | CODE | |
| LOW | scripts/local_cosyvoice_service.py | 838 | CODE | |
| LOW | scripts/local_cosyvoice_service.py | 994 | CODE | |
| LOW | scripts/prepare_musetalk_avatar_asset.py | 416 | CODE | |
| LOW | scripts/benchmark_opentalking_e2e.py | 125 | CODE | |
| LOW | scripts/benchmark_opentalking_e2e.py | 274 | CODE | |
| LOW | scripts/benchmark_opentalking_e2e.py | 317 | CODE | |
| LOW | scripts/benchmark_opentalking_e2e.py | 875 | CODE | |
| LOW | scripts/download_local_audio_models.py | 182 | CODE | |
| LOW | scripts/download_local_audio_models.py | 214 | CODE | |
| LOW | apps/homepage/server/traffic_dashboard.py | 87 | CODE | |
| LOW | apps/homepage/server/traffic_dashboard.py | 291 | CODE | |
| LOW | apps/api/routes/runtime_config.py | 331 | CODE | |
| LOW | apps/api/routes/runtime_config.py | 370 | CODE | |
| LOW | apps/api/routes/runtime_config.py | 513 | CODE | |
| LOW | apps/api/routes/sessions.py | 122 | CODE | |
| LOW | apps/api/routes/sessions.py | 536 | CODE | |
| LOW | apps/api/routes/sessions.py | 1155 | CODE | |
| LOW | apps/api/routes/sessions.py | 1210 | CODE | |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/zh/design/agent-memory-knowledge-rag.md | 276 | ## 七、RAG 抽象 | COMMENT |
| MEDIUM | docs/zh/design/agent-memory-knowledge-rag.md | 593 | ### Phase 2:单知识库 RAG | COMMENT |
| MEDIUM | docs/zh/design/agent-memory-knowledge-rag.md | 745 | ## RAG 技术选型与存储比较 | COMMENT |
| MEDIUM | docs/zh/design/agent-memory-knowledge-rag.md | 747 | ### LightRAG 与其他轻量 RAG 方案 | COMMENT |
| MEDIUM | docs/en/design/agent-memory-knowledge-rag.md | 1 | # Agent Memory and Knowledge RAG Design | COMMENT |
| MEDIUM | scripts/local_cosyvoice_service.py | 625 | # Keep the service zero-shot first so it does not require precomputed spk2info.pt. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 221 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 247 | CODE | |
| LOW | opentalking/providers/synthesis/mock_client.py | 54 | CODE | |
| LOW | opentalking/providers/synthesis/flashtalk/ws_client.py | 124 | CODE | |
| LOW | …alking/providers/synthesis/flashtalk/idle_generator.py | 201 | CODE | |
| LOW | …entalking/providers/synthesis/flashhead/http_client.py | 70 | CODE | |
| LOW | opentalking/providers/tts/omnirt_indextts/adapter.py | 84 | CODE | |
| LOW | opentalking/providers/tts/local_f5_tts/adapter.py | 116 | CODE | |
| LOW | opentalking/providers/tts/local_indextts/adapter.py | 139 | CODE | |
| LOW | opentalking/agent/knowledge_index.py | 148 | CODE | |
| LOW | opentalking/models/quicktalk/runtime.py | 179 | CODE | |
| LOW | opentalking/models/quicktalk/runtime.py | 673 | CODE | |
| LOW | opentalking/models/quicktalk/runtime_v2.py | 526 | CODE | |
| LOW | scripts/local_cosyvoice_service.py | 435 | CODE | |
| LOW | scripts/local_f5_tts_service.py | 118 | CODE | |
| LOW | scripts/smoke_wechat_memory_persona.py | 218 | CODE | |
| LOW | apps/api/routes/memory.py | 93 | CODE | |
| LOW | apps/api/routes/video_creation.py | 110 | CODE | |
| LOW | apps/api/services/session_service.py | 53 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | opentalking/providers/tts/factory.py | 1237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | opentalking/providers/tts/factory.py | 1239 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | opentalking/runtime/task_consumer.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | opentalking/runtime/task_consumer.py | 41 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.yml | 1 | # OpenTalking — single-host all-in-one stack. | COMMENT |
| LOW | opentalking/core/config.py | 621 | default_fps: int = 25 | COMMENT |
| LOW | …eployment/recipes/v100-fasterliveportrait-flashhead.md | 101 | # /opt/digital-human/ | COMMENT |
| LOW | scripts/run_omnirt.sh | 1 | #!/usr/bin/env bash | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.gpu.yml | 4 | # Usage: | COMMENT |
| LOW | scripts/run_omnirt.sh | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unit/test_edge_tts_adapter.py | 38 | CODE |