audiocut-keyword
npx skills add https://github.com/wlzh/skills --skill audiocut-keyword
Agent 安装分布
Skill 文档
é³é¢å ³é®åè¿æ»¤å·¥å ·
åºäº FunASR è¯é³è¯å«å FFmpeg åªè¾çé³é¢å ³é®åè¿æ»¤ Skill
åè½ç¹æ§
- 精确转å½: ä½¿ç¨ FunASR Paraformer è¿è¡ 30s åæ®µè½¬å½ï¼è·åå符级æ¶é´æ³
- å ³é®åè¯å«: æ ¹æ®é ç½®æä»¶èªå¨è¯å«é³é¢ä¸çå ³é®å
- æºè½åªè¾: ä½¿ç¨ FFmpeg 精确å é¤å ³é®åçæ®µå¹¶åææç»é³é¢
- å¯é ç½®: æ¯æèªå®ä¹å ³é®åå表åç¼å²æ¶é´
使ç¨åºæ¯
- YouTube 转æå®¢: å é¤è§é¢ä¸ç”å ³æ³¨”ã”è®¢é ”ã”ç¹èµ”çå¼å¯¼è¯
- 广åè¿æ»¤: èªå¨å é¤é³é¢ä¸ç广ååæ¨å¹¿å 容
- å å®¹æ¸ ç: æ¹éå¤çé³é¢ï¼å é¤ä¸éè¦çå ³é®åçæ®µ
å¿«éå¼å§
åºæ¬ç¨æ³
python3 ~/.claude/skills/audiocut-keyword/scripts/audiocut_keyword.py <é³é¢æä»¶>
æå®è¾åºæä»¶
python3 ~/.claude/skills/audiocut-keyword/scripts/audiocut_keyword.py \
input.mp3 \
-o output.mp3
使ç¨èªå®ä¹å ³é®åé ç½®
python3 ~/.claude/skills/audiocut-keyword/scripts/audiocut_keyword.py \
input.mp3 \
-k my_keywords.json
è°æ´ç¼å²æ¶é´
python3 ~/.claude/skills/audiocut-keyword/scripts/audiocut_keyword.py \
input.mp3 \
--buffer-before 1.0 \
--buffer-after 1.0
工使µç¨
1. é³é¢è½¬å½ï¼FunASR 30s åæ®µï¼
â
2. å è½½å
³é®åé
ç½®
â
3. æ¥æ¾å
³é®åä½ç½®ï¼å符级æ¶é´æ³ï¼
â
4. çæå é¤è®¡åï¼åå¹¶éå çæ®µï¼
â
5. FFmpeg åªè¾å¹¶åæ
â
6. è¾åºå¤çåçé³é¢
å ³é®åé ç½®æä»¶
é
ç½®æä»¶ä½äº: ~/.claude/skills/audiocut-keyword/config/keywords.json
{
"keywords": [
"广å",
"èµå©",
"æ¨å¹¿",
"å
³æ³¨",
"订é
",
"ç¹èµ",
"转å",
"å享",
"è¯è®ºåº",
"龿¥å¨ç®ä»",
"微信å
¬ä¼å·",
"å°ç¨åº"
],
"buffer_before": 0.5,
"buffer_after": 0.5,
"description": "å
³é®åé
ç½®æä»¶"
}
é 置说æ
keywords: å ³é®ååè¡¨ï¼æ¯æä¸æåè±æbuffer_before: å é¤åç¼å²æ¶é´ï¼ç§ï¼ï¼é¿å å é¤ä¸å®æ´buffer_after: å é¤åç¼å²æ¶é´ï¼ç§ï¼ï¼é¿å å é¤ä¸å®æ´
ææ¯å®ç°
1. é³é¢è½¬å½
ä½¿ç¨ FunASR Paraformer 模åè¿è¡ 30s åæ®µè½¬å½ï¼
- 模å:
paraformer-zh(䏿è¯é³è¯å«) - åæ®µçç¥: 30s 䏿®µï¼é¿å é¿é³é¢æ¶é´æ³æ¼ç§»
- æ¶é´æ³ç²¾åº¦: åç¬¦çº§ï¼æ¯«ç§çº§ï¼
- è¾åºæ ¼å¼: JSONï¼å 嫿¯ä¸ªå符ç start/end æ¶é´æ³ï¼
2. å ³é®åè¯å«
- å¨è½¬å½ææ¬ä¸ä½¿ç¨æ£åè¡¨è¾¾å¼æ¥æ¾å ³é®å
- æ ¹æ®å符ä½ç½®è·å对åºçæ¶é´æ³
- è®°å½ä¸ä¸æä¿¡æ¯ï¼ä¾¿äºå®¡æ¥
3. å é¤è®¡åçæ
- 为æ¯ä¸ªå ³é®åæ·»å ååç¼å²æ¶é´
- åå¹¶éå çæ¶é´æ®µï¼é¿å éå¤å é¤
- çææç»çå é¤ç段å表
4. é³é¢åªè¾
ä½¿ç¨ FFmpeg filter_complex è¿è¡æ æåªè¾ï¼
ffmpeg -i input.mp3 \
-filter_complex "[0:a]atrim=start=0:end=10,asetpts=PTS-STARTPTS[a0];
[0:a]atrim=start=15:end=30,asetpts=PTS-STARTPTS[a1];
[a0][a1]concat=n=2:v=0:a=1[outa]" \
-map "[outa]" output.mp3
è¾åºæä»¶
å¤ç宿åä¼çæä»¥ä¸æä»¶ï¼
<åæä»¶å>_filtered.mp3– å¤çåçé³é¢<åæä»¶å>_delete_plan.json– å é¤è®¡åï¼å å«å¹é ä¿¡æ¯ï¼<åæä»¶å>_transcript.json– è½¬å½æä»¶ï¼å¯éä¿çï¼
å½ä»¤è¡åæ°
usage: audiocut_keyword.py [-h] [-o OUTPUT] [-k KEYWORDS]
[--buffer-before BUFFER_BEFORE]
[--buffer-after BUFFER_AFTER]
[--keep-transcript]
input_audio
positional arguments:
input_audio è¾å
¥é³é¢æä»¶
optional arguments:
-h, --help æ¾ç¤ºå¸®å©ä¿¡æ¯
-o OUTPUT, --output OUTPUT
è¾åºé³é¢æä»¶ï¼é»è®¤ï¼è¾å
¥æä»¶å_filtered.mp3ï¼
-k KEYWORDS, --keywords KEYWORDS
å
³é®åé
ç½®æä»¶ï¼é»è®¤ï¼config/keywords.jsonï¼
--buffer-before BUFFER_BEFORE
å é¤åç¼å²æ¶é´ï¼ç§ï¼é»è®¤ï¼0.5ï¼
--buffer-after BUFFER_AFTER
å é¤åç¼å²æ¶é´ï¼ç§ï¼é»è®¤ï¼0.5ï¼
--keep-transcript ä¿çè½¬å½æä»¶
ä¾èµå®è£
FunASR ç¯å¢ï¼æ¨èï¼
使ç¨é¢é ç½®ç Python 3.10 ç¯å¢ï¼
# FunASR ç¯å¢å·²é¢å®è£
å¨ skill ç®å½
~/.claude/skills/audiocut-keyword/funasr_env_310/
å å«ï¼
- Python 3.10
- torch 2.10.0
- funasr 1.3.0
æå¨å®è£ Python ä¾èµ
pip install funasr modelscope
ç³»ç»ä¾èµ
- FFmpeg (ç¨äºé³é¢å¤ç)
- ffprobe (ç¨äºè·åé³é¢ä¿¡æ¯)
模åä¸è½½
馿¬¡è¿è¡ä¼èªå¨ä¸è½½ FunASR 模åï¼çº¦ 2GBï¼å° ~/.cache/modelscope/
æ§è½åè
| ææ | å¼ |
|---|---|
| 转å½é度 | ~0.16x 宿¶ï¼1åéé³é¢çº¦10ç§å¤çï¼ |
| åªè¾é度 | å ä¹ç¬æ¶å®æ |
| 15åéé³é¢ | æ»å¤çæ¶é´çº¦ 2-3 åé |
æµè¯ç¯å¢ï¼M1 Macï¼CPU æ¨ç
éæå° youtube-to-xiaoyuzhou
å¨ youtube-to-xiaoyuzhou 工使µä¸ä½¿ç¨ï¼
# ä¸è½½ YouTube é³é¢å
audio_file = "downloaded_audio.mp3"
# è¿æ»¤å
³é®å
filtered_audio = audiocut_keyword(audio_file)
# ä¸ä¼ å°å°å®å®
upload_to_xiaoyuzhou(filtered_audio)
注æäºé¡¹
- 馿¬¡è¿è¡: éè¦ä¸è½½ FunASR 模åï¼å¯è½éè¦å åé
- é³é¢æ ¼å¼: æ¯æ MP3, WAV, M4A çå¸¸è§æ ¼å¼
- å ³é®åå¹é : 精确å¹é ï¼ä¸æ¯ææ¨¡ç³å¹é
- ç¼å²æ¶é´: 建议设置 0.5-1.0 ç§ï¼é¿å å é¤ä¸å®æ´
- é¿é³é¢: 30s åæ®µçç¥ç¡®ä¿æ¶é´æ³ç²¾ç¡®ï¼æ é¿åº¦éå¶
常è§é®é¢
Q1: 转å½åç¡®çä½
åå : èæ¯åªé³å¤§ãå£é³éãé³è´¨å·®
è§£å³:
- 使ç¨éåªå·¥å ·é¢å¤çé³é¢
- è°æ´é³é¢éæ ·ç为 16kHz
- æ£æ¥é³é¢æ¯å¦æ¸ æ°
Q2: å ³é®åæªè¢«è¯å«
åå : 转å½é误æå ³é®åé ç½®ä¸åç¡®
è§£å³:
- æ£æ¥è½¬å½æä»¶
*_transcript.jsonä¸çææ¬ - è°æ´å ³é®åé ç½®ï¼ä½¿ç¨è½¬å½ä¸çå®é ææ¬
- æ·»å å ³é®åçåä½ï¼å¦”å ³æ³¨”ã”å ³æ³¨ä¸ä¸”ï¼
Q3: å é¤äºä¸è¯¥å é¤çå 容
åå : å ³é®åè¿äºå®½æ³æç¼å²æ¶é´è¿é¿
è§£å³:
- ä½¿ç¨æ´å ·ä½çå ³é®å
- åå°ç¼å²æ¶é´
- æ£æ¥å é¤è®¡åæä»¶
*_delete_plan.json
Q4: FFmpeg æ§è¡å¤±è´¥
åå : FFmpeg æªå®è£ æçæ¬è¿æ§
è§£å³:
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt-get install ffmpeg
# æ£æ¥çæ¬
ffmpeg -version
示ä¾
ç¤ºä¾ 1: å¤ç YouTube é³é¢
# ä¸è½½ YouTube é³é¢
yt-dlp -x --audio-format mp3 https://youtu.be/xxxxx -o input.mp3
# è¿æ»¤å
³é®å
python3 ~/.claude/skills/audiocut-keyword/scripts/audiocut_keyword.py input.mp3
# è¾åº: input_filtered.mp3
ç¤ºä¾ 2: èªå®ä¹å ³é®å
å建 my_keywords.json:
{
"keywords": ["广å", "èµå©å", "æ¨å¹¿é¾æ¥"],
"buffer_before": 1.0,
"buffer_after": 1.0
}
è¿è¡:
python3 ~/.claude/skills/audiocut-keyword/scripts/audiocut_keyword.py \
input.mp3 \
-k my_keywords.json
ç¤ºä¾ 3: æ¹éå¤ç
for file in *.mp3; do
python3 ~/.claude/skills/audiocut-keyword/scripts/audiocut_keyword.py "$file"
done
æªæ¥æ©å±
- æ¯ææ¨¡ç³å¹é 忣å表达å¼
- æ¯æå¤è¯è¨ï¼è±æãæ¥æçï¼
- æ·»å GUI çé¢
- æ¯æå®æ¶é¢è§å 餿æ
- éæå°æ´å¤æå®¢å·¥ä½æµ
License
MIT