[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XDRAS9R9JVC1K0XTTEB51W":3,"skill-same:01M6XDRAS9R9JVC1K0XTTEB51W":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":13,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6XDRAS9R9JVC1K0XTTEB51W","Multimodal Fusion for Speaker Diarization",null,"Combine visual features (face detection, lip movement analysis) with audio features to improve speaker diarization accuracy in video files. Use OpenCV for face detection and lip movement tracking, then fuse visual cues with audio-based speaker embeddings. Essential when processing video files with multiple visible speakers or when audio-only diarization needs visual validation.","Waaaalnut\u002Fskillsbench","Waaaalnut","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103995656?v=4","01M6XCS9K1V51EY3JMB7DGMX24","01M6XCS9Q4WPW88W62C55G1H44",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks-no-skills\u002Fspeaker-diarization-subtitles\u002Fenvironment\u002Fskills\u002Fmultimodal-fusion\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[23,5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"multimodal","for","fusion","Audio","improve","use","only","files","visual","essential","Video","visual validation","processing","with","combine","analysis","accuracy","when","opencv","2026-11-10 10:12:30",false,"---\nname: Multimodal Fusion for Speaker Diarization\ndescription: Combine visual features (face detection, lip movement analysis) with audio features to improve speaker diarization accuracy in video files. Use OpenCV for face detection and lip movement tracking, then fuse visual cues with audio-based speaker embeddings. Essential when processing video files with multiple visible speakers or when audio-only diarization needs visual validation.\n---\n\n# Multimodal Fusion for Speaker Diarization\n\n## Overview\n\nWhen working with video files, you can significantly improve speaker diarization by combining audio features with visual features like face detection and lip movement analysis.\n\n## When to Use\n\n- Processing video files (not just audio)\n- Multiple speakers visible on screen\n- Need to disambiguate speakers with similar voices\n- Improve accuracy by leveraging visual cues\n\n## Visual Feature Extraction\n\n### Face Detection\n\n```python\nimport cv2\nimport numpy as np\n\n# Initialize face detector\nface_cascade = cv2.CascadeClassifier(\n    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'\n)\n\n# Process video frames\ncap = cv2.VideoCapture(video_path)\nfps = cap.get(cv2.CAP_PROP_FPS)\nfaces_by_time = {}\n\nframe_count = 0\nframe_skip = max(1, int(fps \u002F 2))  # Process every other frame\n\nwhile cap.isOpened():\n    ret, frame = cap.read()\n    if not ret:\n        break\n\n    if frame_count % frame_skip == 0:\n        timestamp = frame_count \u002F fps\n        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n        faces = face_cascade.detectMultiScale(gray, 1.1, 4)\n        faces_by_time[timestamp] = len(faces)\n\n    frame_count += 1\n\ncap.release()\n```\n\n### Lip Movement Detection\n\n```python\nlip_movement_by_time = {}\nprev_mouth_roi = None\n\nwhile cap.isOpened():\n    ret, frame = cap.read()\n    if not ret:\n        break\n\n    if frame_count % frame_skip == 0:\n        timestamp = frame_count \u002F fps\n        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n        faces = face_cascade.detectMultiScale(gray, 1.1, 4)\n\n        lip_moving = False\n        for (x, y, w, h) in faces:\n            # Extract mouth region (lower 40% of face)\n            mouth_roi_y = y + int(h * 0.6)\n            mouth_roi_h = int(h * 0.4)\n            mouth_region = gray[mouth_roi_y:mouth_roi_y + mouth_roi_h, x:x + w]\n\n            if mouth_region.size > 0:\n                if prev_mouth_roi is not None and prev_mouth_roi.shape == mouth_region.shape:\n                    # Calculate movement score\n                    diff = cv2.absdiff(mouth_region, prev_mouth_roi)\n                    movement_score = np.mean(diff)\n                    if movement_score > 10:  # Threshold for movement\n                        lip_moving = True\n                prev_mouth_roi = mouth_region.copy()\n                break\n\n        lip_movement_by_time[timestamp] = lip_moving\n\n    frame_count += 1\n```\n\n## Temporal Alignment\n\nVisual features need to be aligned with audio timestamps:\n\n```python\ndef get_faces_at_time(timestamp, tolerance=0.5):\n    \"\"\"Get number of faces at a given timestamp\"\"\"\n    if not faces_by_time:\n        return 0\n    closest = min(faces_by_time.keys(),\n                  key=lambda t: abs(t - timestamp),\n                  default=None)\n    if closest and abs(closest - timestamp) \u003C tolerance:\n        return faces_by_time[closest]\n    return 0\n\ndef get_lip_movement_at_time(timestamp, tolerance=0.5):\n    \"\"\"Check if lips are moving at a given timestamp\"\"\"\n    if not lip_movement_by_time:\n        return False\n    closest = min(lip_movement_by_time.keys(),\n                  key=lambda t: abs(t - timestamp),\n                  default=None)\n    if closest and abs(closest - timestamp) \u003C tolerance:\n        return lip_movement_by_time[closest]\n    return False\n```\n\n## Fusion Strategies\n\n### 1. Visual-Aided Speaker Assignment\n\nUse visual features to help assign speakers to audio segments:\n\n```python\n# For each diarization turn\nfor turn in diarization_turns:\n    turn_center = (turn['start'] + turn['end']) \u002F 2\n    faces_at_turn = get_faces_at_time(turn_center)\n    lip_moving = get_lip_movement_at_time(turn_center)\n\n    # Use visual cues to refine speaker assignment\n    if lip_moving and faces_at_turn > 0:\n        # High confidence: speaker is visible and speaking\n        turn['confidence'] = 'high'\n    elif faces_at_turn > 0:\n        # Medium confidence: speaker visible but no clear lip movement\n        turn['confidence'] = 'medium'\n    else:\n        # Low confidence: no visual confirmation\n        turn['confidence'] = 'low'\n```\n\n### 2. Face Count Validation\n\nUse face count to validate speaker count:\n\n```python\n# Count unique faces over video duration\nunique_faces = set()\nfor timestamp in faces_by_time.keys():\n    if faces_by_time[timestamp] > 0:\n        # In a real implementation, you'd track individual faces\n        unique_faces.add(timestamp)\n\n# Validate predicted speaker count\nif len(unique_faces) > 0:\n    visual_speaker_count = max(faces_by_time.values())\n    if abs(visual_speaker_count - predicted_speaker_count) > 1:\n        # Warning: mismatch between audio and visual speaker counts\n        print(f\"Warning: Audio predicts {predicted_speaker_count} speakers, \"\n              f\"but video shows up to {visual_speaker_count} faces\")\n```\n\n### 3. Lip Movement Filtering\n\nFilter out segments where no one appears to be speaking:\n\n```python\n# Filter diarization turns based on lip movement\nfiltered_turns = []\nfor turn in diarization_turns:\n    turn_start = turn['start']\n    turn_end = turn['end']\n\n    # Check if lips are moving during this turn\n    has_lip_movement = any(\n        get_lip_movement_at_time(t)\n        for t in np.arange(turn_start, turn_end, 0.1)\n    )\n\n    if has_lip_movement:\n        filtered_turns.append(turn)\n    else:\n        # Low confidence: no visual confirmation of speech\n        turn['confidence'] = 'low'\n        filtered_turns.append(turn)\n```\n\n## Best Practices\n\n1. **Process frames efficiently**: Don't process every frame; use frame_skip\n2. **Handle missing visual data**: Always have fallback to audio-only\n3. **Temporal alignment**: Ensure visual and audio timestamps are synchronized\n4. **Confidence scoring**: Use visual features to assign confidence scores\n5. **Error handling**: Video processing can fail; handle exceptions gracefully\n\n## Integration Example\n\n```python\n# Complete pipeline\ndef multimodal_diarization(video_path, audio_path):\n    # 1. Extract visual features\n    faces_by_time, lip_movement_by_time = extract_visual_features(video_path)\n\n    # 2. Run audio-based diarization\n    audio_turns = run_audio_diarization(audio_path)\n\n    # 3. Fuse visual and audio features\n    for turn in audio_turns:\n        turn_center = (turn['start'] + turn['end']) \u002F 2\n        turn['faces_detected'] = get_faces_at_time(turn_center)\n        turn['lip_movement'] = get_lip_movement_at_time(turn_center)\n        turn['on_screen'] = turn['faces_detected'] > 0\n\n    return audio_turns\n```\n\n## Limitations\n\n- Visual features require video files (not just audio)\n- Face detection may fail in poor lighting or angles\n- Lip movement detection is approximate\n- Processing video is computationally expensive\n\n## When to Skip Visual Features\n\n- Audio-only files\n- Poor video quality\n- No faces visible\n- Processing time constraints\n","# Multimodal Fusion for Speaker Diarization\n\n## Overview\n\nWhen working with video files, you can significantly improve speaker diarization by combining audio features with visual features like face detection and lip movement analysis.\n\n## When to Use\n\n- Processing video files (not just audio)\n- Multiple speakers visible on screen\n- Need to disambiguate speakers with similar voices\n- Improve accuracy by leveraging visual cues\n\n## Visual Feature Extraction\n\n### Face Detection\n\n```python\nimport cv2\nimport numpy as np\n\n# Initialize face detector\nface_cascade = cv2.CascadeClassifier(\n    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'\n)\n\n# Process video frames\ncap = cv2.VideoCapture(video_path)\nfps = cap.get(cv2.CAP_PROP_FPS)\nfaces_by_time = {}\n\nframe_count = 0\nframe_skip = max(1, int(fps \u002F 2))  # Process every other frame\n\nwhile cap.isOpened():\n    ret, frame = cap.read()\n    if not ret:\n        break\n\n    if frame_count % frame_skip == 0:\n        timestamp = frame_count \u002F fps\n        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n        faces = face_cascade.detectMultiScale(gray, 1.1, 4)\n        faces_by_time[timestamp] = len(faces)\n\n    frame_count += 1\n\ncap.release()\n```\n\n### Lip Movement Detection\n\n```python\nlip_movement_by_time = {}\nprev_mouth_roi = None\n\nwhile cap.isOpened():\n    ret, frame = cap.read()\n    if not ret:\n        break\n\n    if frame_count % frame_skip == 0:\n        timestamp = frame_count \u002F fps\n        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n        faces = face_cascade.detectMultiScale(gray, 1.1, 4)\n\n        lip_moving = False\n        for (x, y, w, h) in faces:\n            # Extract mouth region (lower 40% of face)\n            mouth_roi_y = y + int(h * 0.6)\n            mouth_roi_h = int(h * 0.4)\n            mouth_region = gray[mouth_roi_y:mouth_roi_y + mouth_roi_h, x:x + w]\n\n            if mouth_region.size > 0:\n                if prev_mouth_roi is not None and prev_mouth_roi.shape == mouth_region.shape:\n                    # Calculate movement score\n                    diff = cv2.absdiff(mouth_region, prev_mouth_roi)\n                    movement_score = np.mean(diff)\n                    if movement_score > 10:  # Threshold for movement\n                        lip_moving = True\n                prev_mouth_roi = mouth_region.copy()\n                break\n\n        lip_movement_by_time[timestamp] = lip_moving\n\n    frame_count += 1\n```\n\n## Temporal Alignment\n\nVisual features need to be aligned with audio timestamps:\n\n```python\ndef get_faces_at_time(timestamp, tolerance=0.5):\n    \"\"\"Get number of faces at a given timestamp\"\"\"\n    if not faces_by_time:\n        return 0\n    closest = min(faces_by_time.keys(),\n                  key=lambda t: abs(t - timestamp),\n                  default=None)\n    if closest and abs(closest - timestamp) \u003C tolerance:\n        return faces_by_time[closest]\n    return 0\n\ndef get_lip_movement_at_time(timestamp, tolerance=0.5):\n    \"\"\"Check if lips are moving at a given timestamp\"\"\"\n    if not lip_movement_by_time:\n        return False\n    closest = min(lip_movement_by_time.keys(),\n                  key=lambda t: abs(t - timestamp),\n                  default=None)\n    if closest and abs(closest - timestamp) \u003C tolerance:\n        return lip_movement_by_time[closest]\n    return False\n```\n\n## Fusion Strategies\n\n### 1. Visual-Aided Speaker Assignment\n\nUse visual features to help assign speakers to audio segments:\n\n```python\n# For each diarization turn\nfor turn in diarization_turns:\n    turn_center = (turn['start'] + turn['end']) \u002F 2\n    faces_at_turn = get_faces_at_time(turn_center)\n    lip_moving = get_lip_movement_at_time(turn_center)\n\n    # Use visual cues to refine speaker assignment\n    if lip_moving and faces_at_turn > 0:\n        # High confidence: speaker is visible and speaking\n        turn['confidence'] = 'high'\n    elif faces_at_turn > 0:\n        # Medium confidence: speaker visible but no clear lip movement\n        turn['confidence'] = 'medium'\n    else:\n        # Low confidence: no visual confirmation\n        turn['confidence'] = 'low'\n```\n\n### 2. Face Count Validation\n\nUse face count to validate speaker count:\n\n```python\n# Count unique faces over video duration\nunique_faces = set()\nfor timestamp in faces_by_time.keys():\n    if faces_by_time[timestamp] > 0:\n        # In a real implementation, you'd track individual faces\n        unique_faces.add(timestamp)\n\n# Validate predicted speaker count\nif len(unique_faces) > 0:\n    visual_speaker_count = max(faces_by_time.values())\n    if abs(visual_speaker_count - predicted_speaker_count) > 1:\n        # Warning: mismatch between audio and visual speaker counts\n        print(f\"Warning: Audio predicts {predicted_speaker_count} speakers, \"\n              f\"but video shows up to {visual_speaker_count} faces\")\n```\n\n### 3. Lip Movement Filtering\n\nFilter out segments where no one appears to be speaking:\n\n```python\n# Filter diarization turns based on lip movement\nfiltered_turns = []\nfor turn in diarization_turns:\n    turn_start = turn['start']\n    turn_end = turn['end']\n\n    # Check if lips are moving during this turn\n    has_lip_movement = any(\n        get_lip_movement_at_time(t)\n        for t in np.arange(turn_start, turn_end, 0.1)\n    )\n\n    if has_lip_movement:\n        filtered_turns.append(turn)\n    else:\n        # Low confidence: no visual confirmation of speech\n        turn['confidence'] = 'low'\n        filtered_turns.append(turn)\n```\n\n## Best Practices\n\n1. **Process frames efficiently**: Don't process every frame; use frame_skip\n2. **Handle missing visual data**: Always have fallback to audio-only\n3. **Temporal alignment**: Ensure visual and audio timestamps are synchronized\n4. **Confidence scoring**: Use visual features to assign confidence scores\n5. **Error handling**: Video processing can fail; handle exceptions gracefully\n\n## Integration Example\n\n```python\n# Complete pipeline\ndef multimodal_diarization(video_path, audio_path):\n    # 1. Extract visual features\n    faces_by_time, lip_movement_by_time = extract_visual_features(video_path)\n\n    # 2. Run audio-based diarization\n    audio_turns = run_audio_diarization(audio_path)\n\n    # 3. Fuse visual and audio features\n    for turn in audio_turns:\n        turn_center = (turn['start'] + turn['end']) \u002F 2\n        turn['faces_detected'] = get_faces_at_time(turn_center)\n        turn['lip_movement'] = get_lip_movement_at_time(turn_center)\n        turn['on_screen'] = turn['faces_detected'] > 0\n\n    return audio_turns\n```\n\n## Limitations\n\n- Visual features require video files (not just audio)\n- Face detection may fail in poor lighting or angles\n- Lip movement detection is approximate\n- Processing video is computationally expensive\n\n## When to Skip Visual Features\n\n- Audio-only files\n- Poor video quality\n- No faces visible\n- Processing time constraints\n",{"name":5,"description":7},"main","7eeb258ada72b7f58119b0e7a2c00ea89d9beedd","tasks-no-skills\u002Fspeaker-diarization-subtitles\u002Fenvironment\u002Fskills\u002Fmultimodal-fusion","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench","https:\u002F\u002Fgithub.com\u002FWaaaalnut","student of Zhejiang University","2026-04-21 23:16:23",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add Waaaalnut\u002Fskillsbench --skill \"Multimodal Fusion for Speaker Diarization\"",{"tool":60,"command":61},"bunx","bunx skills add Waaaalnut\u002Fskillsbench --skill \"Multimodal Fusion for Speaker Diarization\"",{"tool":63,"command":64},"pnpm","pnpm dlx skills add Waaaalnut\u002Fskillsbench --skill \"Multimodal Fusion for Speaker Diarization\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks-no-skills\u002Fspeaker-diarization-subtitles\u002Fenvironment\u002Fskills\u002Fmultimodal-fusion\u002FSKILL.md",true,[],[69,83,97,119,139,155],{"skillNo":70,"name":71,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":79,"publishedAt":42},"01M6XEWMJ6VY3ZC53MPDCPG3GH","data-reconciliation","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fxlsx-recover-data\u002Fenvironment\u002Fskills\u002Fdata-reconciliation\u002FSKILL.md",[74],{"categoryNo":75,"categoryName":76,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[80,81,82],"data reconciliation","reconciliation","data",{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":42},"01M6XEW8MNPMF1KRXV6ATGFRQF","speech-to-text","Transcribe video to timestamped text using Whisper tiny model (pre-installed).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-tutorial-indexer\u002Fenvironment\u002Fskills\u002Fspeech-to-text\u002FSKILL.md",[],[90,91,92,93,94,95,33,96],"speech","text","speech to text","transcribe video","whisper","model","transcribe",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":104,"publishedAt":42},"01M6XEW3FQZP0T1RKQQJFXVY9T","video-processor","Process videos by removing segments and concatenating remaining parts. Use when you need to remove detected pauses\u002Fopenings from videos, create highlight reels, or batch process segment removals using ffmpeg filter_complex.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fvideo-processor\u002FSKILL.md",[103],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[33,105,106,107,108,109,40,110,111,112,113,114,115,116,117,28,118],"processor","video processor","batch","create","reels","parts","segments","process","videos","you","segment","filter","ffmpeg","remove",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":126,"publishedAt":42},"01M6XEVXJ5KZ0NTY3XZKRY4AS1","silence-detector","Detect initial silence segments in audio\u002Fvideo using energy-based analysis. Use when you need to find low-energy periods at the start of recordings (title slides, setup time, pre-roll silence).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsilence-detector\u002FSKILL.md",[125],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[127,128,129,130,40,114,131,132,133,134,135,111,136,26,33,38,137,138,28],"detector","silence detector","title","slides","time","energy","at","recordings","detect","find","start","setup",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":42},"01M6XEVT3NGRN1FT7JPMAPXS6M","segment-combiner","Combine multiple segment detection results into a unified list. Use when you need to merge segments from different detectors, prepare removal lists for video processing, or consolidate detection outputs.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsegment-combiner\u002FSKILL.md",[],[115,146,33,147,148,149,150,24,40,151,37,111,114,35,152,28,153,154],"segment combiner","detection","prepare","merge","video processing","outputs","consolidate","results","list",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":164,"publishedAt":42},"01M6XEVMPVASGS2KX86QK4FMT7","report-generator","Generate compression reports for video processing. Use when you need to create structured JSON reports with duration statistics, compression ratios, and segment details after video processing.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Freport-generator\u002FSKILL.md",[161],{"categoryNo":162,"categoryName":163,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000034","行政与办公人员",[165,166,167,115,40,24,114,36,35,168,169,170,28,150,171,33,172,173,108],"generator","report generator","report","statistics","structured","reports","json","compression","generate"]