FunASR-powered video transcription, subtitle generation, and LLM-assisted clipping tool with a local Gradio UI.
This report presents the forensic synthetic code analysis of modelscope/FunClip, a Python project with 6,094 GitHub stars. SynthScan v2.0 examined 4,481 lines of code across 40 source files, recording 67 pattern matches distributed across 4 syntactic categories. The overall adjusted score of 16.3 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 67 distinct pattern matches across 4 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 | funclip/videoclipper.py | 92 | def _normalize_recognition_result(result): | CODE |
| LOW | funclip/llm/twelvelabs_api.py | 40 | def _normalize_pegasus_timestamps(text): | CODE |
| LOW | tests/test_funasr_requirement.py | 7 | def test_funasr_minimum_version_matches_current_model_paths(): | CODE |
| LOW | tests/test_funasr_requirement.py | 16 | def test_readmes_explain_upgrade_for_existing_installs(): | CODE |
| LOW | tests/test_funasr_requirement.py | 27 | def test_readmes_route_edge_asr_users_to_gguf_runtime(): | CODE |
| LOW | tests/test_funasr_requirement.py | 39 | def test_english_readme_avoids_visible_typo_regressions(): | CODE |
| LOW | tests/test_github_templates.py | 7 | def test_issue_templates_collect_funclip_repro_details(): | CODE |
| LOW | tests/test_github_templates.py | 33 | def test_pull_request_template_keeps_validation_visible(): | CODE |
| LOW | tests/test_github_templates.py | 48 | def test_contributing_guide_documents_local_validation_path(): | CODE |
| LOW | tests/test_minimax_api.py | 22 | def test_minimax_prefix_uses_global_base_url(self): | CODE |
| LOW | tests/test_minimax_api.py | 42 | def test_minimax_api_key_falls_back_to_env(self): | CODE |
| LOW | tests/test_minimax_api.py | 57 | def test_minimax_api_base_env_overrides_region(self): | CODE |
| LOW | tests/test_minimax_api.py | 70 | def test_empty_minimax_model_raises(self): | CODE |
| LOW | tests/test_minimax_api.py | 74 | def test_missing_minimax_key_does_not_fall_back_to_openai_key(self): | CODE |
| LOW | tests/test_release_contract.py | 32 | def _create_fixture_repository(repository): | CODE |
| LOW | tests/test_release_contract.py | 53 | def test_release_version_and_public_download_routes_are_in_sync(): | CODE |
| LOW | tests/test_release_contract.py | 67 | def test_release_notes_define_installation_and_asset_boundaries(): | CODE |
| LOW | tests/test_release_contract.py | 79 | def test_tag_workflow_builds_and_publishes_all_release_assets(): | CODE |
| LOW | tests/test_release_contract.py | 111 | def test_release_builder_creates_reproducible_scoped_archives(tmp_path): | CODE |
| LOW | tests/test_release_contract.py | 171 | def test_release_builder_rejects_non_commit_refs(tmp_path): | CODE |
| LOW | tests/test_release_contract.py | 202 | def test_release_builder_supports_cross_filesystem_outputs(tmp_path): | CODE |
| LOW | tests/test_openai_api.py | 18 | def test_atlascloud_prefix_uses_atlas_base_url(self): | CODE |
| LOW | tests/test_openai_api.py | 38 | def test_atlascloud_api_key_falls_back_to_env(self): | CODE |
| LOW | tests/test_openai_api.py | 53 | def test_empty_atlascloud_model_raises(self): | CODE |
| LOW | tests/test_minimax_launch_integration.py | 16 | def test_openai_compatible_route_preserves_prompt_roles(self): | CODE |
| LOW | tests/test_minimax_launch_integration.py | 43 | def test_dropdown_only_lists_documented_minimax_models(self): | CODE |
| LOW | tests/test_litellm_api.py | 45 | def test_no_prefix_passes_through(self): | CODE |
| LOW⚡ | tests/test_litellm_api.py | 66 | def test_api_key_omitted_when_empty(self): | CODE |
| LOW⚡ | tests/test_litellm_api.py | 73 | def test_system_content_included(self): | CODE |
| LOW⚡ | tests/test_litellm_api.py | 83 | def test_system_content_skipped_when_empty(self): | CODE |
| LOW⚡ | tests/test_litellm_api.py | 92 | def test_empty_choices_returns_empty(self): | CODE |
| LOW⚡ | tests/test_litellm_api.py | 99 | def test_null_content_returns_empty(self): | CODE |
| LOW | tests/test_litellm_api.py | 130 | def test_empty_model_after_strip_raises(self): | CODE |
| LOW | tests/test_community_links.py | 17 | def test_community_section_has_stable_discussions_fallback( | CODE |
| LOW | tests/test_canonical_qwenaudio_links.py | 35 | def test_legacy_owner_matcher_covers_repository_api_and_charts(): | CODE |
| LOW | tests/test_canonical_qwenaudio_links.py | 63 | def test_tracked_files_use_qwenaudio_for_canonical_github_repositories(): | CODE |
| LOW | tests/test_duplicate_text_matching.py | 41 | def test_audio_clip_keeps_all_repeated_matches_without_offsets(self, _generate_srt): | CODE |
| LOW | tests/test_duplicate_text_matching.py | 61 | def test_video_clip_keeps_all_repeated_matches_without_offsets(self, _generate_srt): | CODE |
| LOW | tests/test_duplicate_text_matching.py | 90 | def test_audio_clip_formats_offset_warning_for_repeated_matches( | CODE |
| LOW | tests/test_duplicate_text_matching.py | 107 | def test_audio_clip_accepts_explicit_timestamps_without_text_matching( | CODE |
| LOW | tests/test_duplicate_text_matching.py | 129 | def test_video_clip_includes_offset_warning_for_repeated_matches( | CODE |
| LOW⚡ | tests/test_twelvelabs_pegasus.py | 21 | def test_http_url_becomes_url_context_without_upload(self): | CODE |
| LOW⚡ | tests/test_twelvelabs_pegasus.py | 27 | def test_missing_local_file_raises(self): | CODE |
| LOW⚡ | tests/test_twelvelabs_pegasus.py | 31 | def test_default_prompt_requests_parseable_segment_format(self): | CODE |
| LOW | tests/test_twelvelabs_pegasus.py | 45 | def test_decimal_and_integer_ranges_feed_existing_parser(self): | CODE |
| LOW | tests/test_twelvelabs_pegasus.py | 62 | def test_existing_srt_range_is_unchanged(self): | CODE |
| LOW | tests/test_twelvelabs_pegasus.py | 70 | def test_invalid_ranges_do_not_create_clips(self): | CODE |
| LOW | tests/test_twelvelabs_pegasus.py | 91 | def test_analyze_public_url_returns_text(self): | CODE |
| LOW | tests/test_recognition_result_compat.py | 28 | def test_fun_asr_nano_result_without_sentence_info_or_raw_text_still_builds_state(self): | CODE |
| LOW | tests/test_recognition_result_compat.py | 47 | def test_none_sentence_timestamp_falls_back_to_top_level_timestamp(self): | CODE |
| LOW | tests/test_recognition_result_compat.py | 64 | def test_sensevoice_rich_tags_are_removed_from_text_and_srt(self): | CODE |
| LOW | tests/test_recognition_result_compat.py | 84 | def test_long_token_level_sentence_is_split_into_subtitle_chunks(self): | CODE |
| LOW | tests/test_model_selection.py | 18 | def test_fun_asr_nano_is_selected_independently_of_language(self): | CODE |
| LOW | tests/test_model_selection.py | 36 | def test_sensevoice_is_selected_independently_of_language(self): | CODE |
| LOW | tests/test_model_selection.py | 51 | def test_paraformer_keeps_language_specific_model_mapping(self): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | funclip/videoclipper.py | 164 | CODE | |
| LOW | funclip/videoclipper.py | 269 | CODE | |
| LOW | funclip/llm/openai_api.py | 16 | CODE | |
| LOW | funclip/utils/subtitle_utils.py | 69 | CODE | |
| LOW | funclip/utils/argparse_tools.py | 30 | CODE | |
| LOW | funclip/utils/trans_utils.py | 88 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | funclip/videoclipper.py | 15 | CODE | |
| LOW | funclip/launch.py | 6 | CODE | |
| LOW | funclip/llm/g4f_openai_api.py | 4 | CODE | |
| LOW | funclip/test/imagemagick_test.py | 1 | CODE | |
| LOW | funclip/test/imagemagick_test.py | 3 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | funclip/launch.py | 82 | # Create a temporary file | COMMENT |