SKILL.md
Filler Word Processing
Annotation Format
Typical annotation JSON structure:
[
{"word": "um", "timestamp": 12.5},
{"word": "like", "timestamp": 25.3},
{"word": "you know", "timestamp": 45.8}
]
Converting Annotations to Cut Segments
Each filler word annotation marks when the word starts. To remove it, use word-specific durations since different fillers have different lengths:
import json
# Word-specific durations (in seconds)
WORD_DURATIONS = {
"uh": 0.3,
"um": 0.4,
"hum": 0.6,
"hmm": 0.6,
"mhm": 0.55,
"like": 0.3,
"yeah": 0.35,
"so": 0.25,
"well": 0.35,
"okay": 0.4,
"basically": 0.55,
"you know": 0.55,
"i mean": 0.5,
"kind of": 0.5,
"i guess": 0.5,
}
DEFAULT_DURATION = 0.4
def annotations_to_segments(annotations_file, buffer=0.05):
"""
Convert filler word annotations to (start, end) cut segments.
Args:
annotations_file: Path to JSON annotations
buffer: Small buffer before the word (seconds)
Returns:
List of (start, end) tuples representing segments to remove
"""
with open(annotations_file) as f:
annotations = json.load(f)
segments = []
for ann in annotations:
word = ann.get('word', '').lower().strip()
timestamp = ann['timestamp']
# Use word-specific duration, fall back to default
word_duration = WORD_DURATIONS.get(word, DEFAULT_DURATION)
# Cut starts slightly before the word
start = max(0, timestamp - buffer)
# Cut ends after word duration
end = timestamp + word_duration
segments.append((start, end))
return segments
Merging Overlapping Segments
When filler words are close together, merge their cut segments:
def merge_overlapping_segments(segments, min_gap=0.1):
"""
Merge segments that overlap or are very close together.
Args:
segments: List of (start, end) tuples
min_gap: Minimum gap to keep segments separate
Returns:
Merged list of segments
"""
if not segments:
return []
# Sort by start time
sorted_segs = sorted(segments)
merged = [sorted_segs[0]]
for start, end in sorted_segs[1:]:
prev_start, prev_end = merged[-1]
# If this segment overlaps or is very close to previous
if start <= prev_end + min_gap:
# Extend the previous segment
merged[-1] = (prev_start, max(prev_end, end))
else:
merged.append((start, end))
return merged
