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,913 GitHub stars. SynthScan v2.0 examined 404,849 lines of code across 882 source files, recording 2298 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 5.8 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).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
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 2298 distinct pattern matches across 14 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/export_store.py | 152 | def create_video_export_from_file( | CODE |
| LOW | opentalking/video_creation_jobs.py | 102 | def _subscriber_put_timeout_sec(self) -> float: | CODE |
| LOW | opentalking/scene_assets.py | 98 | def _seed_default_backgrounds(self) -> None: | CODE |
| LOW | opentalking/video_creation.py | 127 | def _export_with_download_url(item: dict[str, Any]) -> dict[str, Any]: | CODE |
| LOW | opentalking/video_creation.py | 136 | def _reference_duration_options(settings: object) -> set[int]: | CODE |
| LOW | opentalking/video_creation.py | 149 | def _validate_reference_duration(settings: object, duration_sec: int | None) -> int: | CODE |
| LOW | opentalking/video_creation.py | 158 | def _coerce_composition_float( | CODE |
| LOW | opentalking/video_creation.py | 203 | def _normalize_video_composition_config( | CODE |
| LOW | opentalking/video_creation.py | 253 | def _composition_background_color(value: object) -> tuple[int, int, int]: | CODE |
| LOW | opentalking/video_creation.py | 604 | def _build_reference_driver_pcm(total_samples: int, *, level: float = 480.0) -> np.ndarray: | CODE |
| LOW | opentalking/video_creation.py | 616 | def _reference_driver_audio_path(settings: object) -> Path: | CODE |
| LOW | opentalking/video_creation.py | 621 | def _fit_reference_driver_pcm(pcm: np.ndarray, total_samples: int) -> np.ndarray: | CODE |
| LOW | opentalking/video_creation.py | 643 | async def _load_reference_driver_pcm(settings: object, total_samples: int) -> np.ndarray | None: | CODE |
| LOW | opentalking/video_creation.py | 746 | def _fasterliveportrait_video_config( | CODE |
| LOW | opentalking/video_creation.py | 760 | def _fasterliveportrait_preroll_samples(settings: object, model: str, sample_rate: int) -> int: | CODE |
| LOW | opentalking/video_creation.py | 812 | def _resolve_avatar_relative_path(avatar_path: Path, raw: object) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 825 | def _avatar_manifest_metadata(avatar_path: Path) -> dict[str, Any]: | CODE |
| LOW | opentalking/video_creation.py | 830 | def _quicktalk_manifest_section(avatar_path: Path) -> dict[str, Any]: | CODE |
| LOW | opentalking/video_creation.py | 898 | def _quicktalk_cache_video_size(settings: object, avatar_path: Path) -> tuple[int, int] | None: | CODE |
| LOW | opentalking/video_creation.py | 939 | def _quicktalk_declared_video_source(avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 950 | def _quicktalk_prepared_template_video(settings: object, avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 982 | def _quicktalk_template_video(settings: object, avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 989 | def _quicktalk_template_frame_dir(avatar_path: Path) -> Path | None: | CODE |
| LOW | opentalking/video_creation.py | 1027 | def _quicktalk_init_session_kwargs(settings: object, avatar_path: Path) -> dict[str, object]: | CODE |
| LOW | opentalking/video_creation.py | 1208 | def _quicktalk_multiface_worker_class(): | CODE |
| LOW | opentalking/video_creation.py | 1246 | async def _probe_audio_duration_sec(settings: object, path: Path) -> float | None: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 724 | def _avatar_manifest_metadata(self) -> dict[str, Any]: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 736 | def _quicktalk_manifest_metadata(self) -> dict[str, Any]: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 741 | def _resolve_avatar_relative_path(self, raw: str) -> Path | None: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1191 | async def _prepare_idle_cache_background(self, ref_image_path: Path) -> None: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1433 | def _build_fasterliveportrait_idle_frames(self, reference_frame: np.ndarray) -> list[np.ndarray]: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1647 | def _legacy_bool_setting_declared(*names: str) -> bool: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1658 | def _tts_opener_enabled_for_model(self) -> bool: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 141 | def _agent_memory_enabled_for_runtime( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 250 | async def _synthesize_tts_opener_pcm( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 555 | def _fasterliveportrait_video_config( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 628 | async def update_fasterliveportrait_runtime_config( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 646 | def _fasterliveportrait_ref_image_payload( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 689 | def _quicktalk_cache_video_size(self) -> tuple[int, int] | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 753 | def _quicktalk_manifest_section(self) -> dict[str, Any]: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 810 | def _quicktalk_template_video(self) -> Path | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 829 | def _quicktalk_template_frame_dir(self) -> Path | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 994 | async def _on_connection_state_change() -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1109 | async def _await_dynamic_idle_prepare_done(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1123 | async def _prepare_dynamic_idle_cache(self, ref_image_path: Path) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1390 | def _open_quicktalk_reference_idle_video(self) -> _LoopingIdleVideo | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1405 | def _load_quicktalk_reference_idle_frames(self) -> list[np.ndarray] | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1465 | def _load_idle_frames_from_disk(self, cache_path: Path, cache_key: str) -> list[np.ndarray]: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1489 | def _save_idle_frames_to_disk( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1669 | def _tts_opener_preload_enabled_for_model(self) -> bool: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1680 | def _tts_opener_preload_voice(self) -> str | None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1771 | async def _queue_initial_video_frame(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1795 | async def _queue_fasterliveportrait_rest_frame(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1819 | def _ensure_media_clock_started(self) -> None: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1860 | def _playback_backpressure_config(self) -> tuple[int, int, float]: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1874 | async def _wait_for_playback_capacity( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1925 | def create_speak_uploaded_pcm_task( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1938 | async def _run_speak_uploaded_pcm_task( | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3065 | async def _generate_flashtalk_frames( | CODE |
| 1211 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/video_creation_jobs.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 | 151 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 151 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 172 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 220 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 220 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 220 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 220 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 231 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 231 | 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 | |
| 378 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | opentalking/export_store.py | 203 | except Exception: | CODE |
| LOW | opentalking/video_creation_jobs.py | 161 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | opentalking/video_creation.py | 653 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | opentalking/video_creation.py | 1673 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 1676 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 1702 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 1857 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 1860 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 1887 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 2002 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 2005 | except Exception: | CODE |
| LOW | opentalking/video_creation.py | 2031 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 730 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1186 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1195 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1429 | except Exception: | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1654 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 295 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 433 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 455 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 466 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 484 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 537 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 565 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 620 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 671 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 925 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1031 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1120 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1219 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1385 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1401 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1474 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1501 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1719 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1950 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1974 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 1999 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2417 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2472 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2478 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2601 | except Exception as e: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2942 | except Exception as e: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3200 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3272 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3286 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3332 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3347 | except Exception: | CODE |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 3385 | 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 | 369 | except Exception: | CODE |
| LOW | opentalking/pipeline/session/runner.py | 391 | except Exception: | CODE |
| LOW | opentalking/pipeline/session/runner.py | 512 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 629 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 645 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 698 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 745 | except Exception: # noqa: BLE001 | CODE |
| LOW | opentalking/pipeline/session/runner.py | 1031 | except Exception: # noqa: BLE001 | CODE |
| 295 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/unit/test_local_audio_frontend.py | 710 | 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_light2d_mock_ui.py | 23 | assert 'clientRenderer={!showStart && model === "mock"' in app | CODE |
| HIGH | tests/frontend/test_light2d_mock_ui.py | 87 | assert "setVideoBackgroundId(null)" in video_creation | 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/video_creation.py | 950 | CODE | |
| LOW | opentalking/video_creation.py | 1392 | CODE | |
| LOW | opentalking/video_creation.py | 1498 | CODE | |
| LOW | opentalking/video_creation.py | 1786 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 555 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 904 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2021 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2113 | CODE | |
| LOW | opentalking/pipeline/speak/synthesis_runner.py | 2375 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 933 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1003 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1171 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1502 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 1787 | 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/rtc/aiortc/adapter.py | 57 | 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 | 362 | CODE | |
| LOW | opentalking/providers/tts/edge/adapter.py | 139 | 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/server.py | 62 | CODE | |
| LOW | opentalking/runtime/server.py | 156 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 219 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 382 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 529 | CODE | |
| LOW | opentalking/runtime/task_consumer.py | 423 | CODE | |
| LOW | opentalking/agent/knowledge_store.py | 349 | CODE | |
| LOW | opentalking/agent/knowledge_store.py | 409 | 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/streaming/rtmps_jobs.py | 39 | CODE | |
| LOW | opentalking/streaming/chunks.py | 205 | CODE | |
| LOW | opentalking/streaming/outputs.py | 450 | CODE | |
| LOW | opentalking/streaming/outputs.py | 805 | CODE | |
| LOW | opentalking/streaming/destinations/rtmps.py | 218 | CODE | |
| LOW | opentalking/streaming/destinations/rtmps.py | 356 | CODE | |
| LOW | opentalking/streaming/destinations/rtmps_chunked.py | 205 | CODE | |
| LOW | opentalking/streaming/destinations/rtmps_chunked.py | 521 | 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 | |
| 26 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | opentalking/__init__.py | 5 | __all__ = ["__version__"] | CODE |
| LOW⚡ | opentalking/pipeline/speak/synthesis_runner.py | 1436 | def _set_idle_frames(self, frames: list[np.ndarray], *, playback_mode: str | None = None) -> 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 | 182 | 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/streaming/__init__.py | 13 | __all__ = [ | CODE |
| LOW | opentalking/streaming/destinations/__init__.py | 6 | __all__ = ["RTMPSPublisher", "RTMPSSettings", "WHIPPublisher", "WHIPSettings"] | 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 | 270 | 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 | 364 | def _update_manifest_matting_status(manifest_path: Path, image: Image.Image) -> None: | CODE |
| LOW⚡ | apps/api/routes/avatars.py | 387 | def _update_manifest_dimensions(manifest_path: Path, image: Image.Image) -> None: | CODE |
| LOW | apps/api/services/session_service.py | 174 | 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 |
|---|---|---|---|---|
| MEDIUM⚡ | opentalking/providers/tts/factory.py | 1239 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | opentalking/providers/tts/factory.py | 1241 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | opentalking/runtime/task_consumer.py | 56 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | opentalking/runtime/task_consumer.py | 62 | # --------------------------------------------------------------------------- | COMMENT |
| 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 | 302 | CODE | |
| LOW | opentalking/pipeline/session/runner.py | 249 | 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 | 120 | CODE | |
| LOW | apps/api/services/session_service.py | 54 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/docker-compose.streaming-test.yml | 3 | # Keep the harness on a fixed release. A deployment may replace this | COMMENT |
| MEDIUM | docker/docker-compose.streaming-test.yml | 9 | # Linux local harness only: host networking keeps the browser's loopback | COMMENT |
| MEDIUM | configs/streaming/mediamtx.yml | 1 | # Template for the local streaming harness. The harness renders the | COMMENT |
| MEDIUM | configs/streaming/mediamtx.yml | 22 | # The local Linux harness uses host networking so Chromium can reach the HLS | COMMENT |
| MEDIUM | scripts/streaming/prepare_mediamtx_harness.py | 65 | # The default harness is loopback-only. A remote browser needs the | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.yml | 1 | # OpenTalking — single-host all-in-one stack. | COMMENT |
| LOW | opentalking/core/config.py | 701 | omnirt_api_key: str = "" | COMMENT |
| LOW | opentalking/streaming/destinations/rtmps_chunked.py | 561 | del container | 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 | 43 | CODE |