一个减少75%token的 claude code skill技能
- 内容介绍
- 文章标签
- 相关推荐
号称 “在保持完全技术准确性的同时,削减大约 75% 的token数量”,感觉更像是某种回复风格
GitHub - JuliusBrussee/caveman: 🪨 why use many token when few token do trick —...
🪨 why use many token when few token do trick — Claude Code skill that cuts 75% of tokens by talking like caveman
网友解答:--【壹】--:
怎么实现的呢?完全没有损失那几乎不可能,只是好奇这个到底损失了啥
--【贰】--:
Question:讲解mel滤波器实现算法
Mel 滤波器组实现算法
核心概念
Mel 滤波器组是语音处理中的关键步骤,模拟人耳对频率的非线性感知——低频分辨率高,高频分辨率低。
频率转换公式
Hz → Mel:
mel = 2595 × log₁₀(1 + f/700)
Mel → Hz:
f = 700 × (10^(mel/2595) - 1)
实现步骤
Step 1:确定频率边界
import numpy as np
def mel_filterbank(sample_rate, n_fft, n_filters, f_min=0, f_max=None):
if f_max is None:
f_max = sample_rate / 2 # Nyquist 频率
# Hz → Mel
mel_min = 2595 * np.log10(1 + f_min / 700)
mel_max = 2595 * np.log10(1 + f_max / 700)
Step 2:在 Mel 域均匀采样
# 在 Mel 域均匀分布 n_filters+2 个点(含两端边界)
mel_points = np.linspace(mel_min, mel_max, n_filters + 2)
# Mel → Hz
hz_points = 700 * (10 ** (mel_points / 2595) - 1)
Step 3:映射到 FFT bin 索引
# FFT bin 索引:freq = bin * sample_rate / n_fft
bins = np.floor((n_fft + 1) * hz_points / sample_rate).astype(int)
Step 4:构造三角滤波器
filters = np.zeros((n_filters, n_fft // 2 + 1))
for m in range(1, n_filters + 1):
left = bins[m - 1] # 左边界
center = bins[m] # 中心(峰值)
right = bins[m + 1] # 右边界
# 上升沿
for k in range(left, center):
filters[m-1, k] = (k - left) / (center - left)
# 下降沿
for k in range(center, right):
filters[m-1, k] = (right - k) / (right - center)
return filters
用向量化写法更高效:
for m in range(1, n_filters + 1):
l, c, r = bins[m-1], bins[m], bins[m+1]
filters[m-1] = np.maximum(0, np.minimum(
(np.arange(n_fft//2+1) - l) / (c - l),
(r - np.arange(n_fft//2+1)) / (r - c)
))
完整流程图
音频信号
│
▼
预加重(可选): x[n] = x[n] - α·x[n-1]
│
▼
分帧 + 加窗(Hann/Hamming)
│
▼
FFT → 功率谱 |X[k]|²
│
▼
× Mel 滤波器组(三角滤波器)
│
▼
每个滤波器求和 → n_filters 个能量值
│
▼
取 log(对数压缩)
│
▼
DCT → MFCC 系数(可选)
关键参数
| 参数 | 典型值 | 说明 |
|---|---|---|
n_filters |
40~128 | 滤波器数量 |
n_fft |
512/1024/2048 | FFT 点数 |
f_min |
0~80 Hz | 最低频率 |
f_max |
8000 Hz | 最高频率(通常=采样率/2) |
sample_rate |
16000/22050 | 采样率 |
为什么是三角形?
- 连续性:相邻滤波器之间平滑过渡,无频率盲区
- 归一化:每个滤波器面积约为 1,保持能量一致性
- 高频压缩:在 Hz 域看,高频三角形更宽(体现 Mel 非线性)
Mel域(均匀间隔): | | | | | | | |
Hz域(非线性): ||||||| | | | |
低频滤波器窄(精细),高频滤波器宽(粗糙),与人耳特性一致。
Question: /caveman 讲解mel滤波器实现算法
Mel 滤波器实现
核心思想
人耳感知频率非线性。低频分辨率高,高频分辨率低。Mel scale 模拟此特性。
Hz → Mel 转换
mel = 2595 * log10(1 + hz / 700)
hz = 700 * (10^(mel/2595) - 1)
实现步骤
1. 定频率范围
f_min = 0 # Hz
f_max = sr / 2 # Nyquist
2. Mel空间均匀采样
# N个滤波器 → N+2个点(含两端边界)
mel_points = linspace(hz2mel(f_min), hz2mel(f_max), N+2)
hz_points = mel2hz(mel_points) # 转回Hz,非线性分布
3. FFT bin对齐
bin_points = floor((nfft+1) * hz_points / sr)
4. 构造三角滤波器
每个滤波器 m,跨3个点:左端 m-1,峰值 m,右端 m+1。
for m in range(1, N+1):
left, center, right = bin[m-1], bin[m], bin[m+1]
# 上升段
fbank[m, left:center] = (k - left) / (center - left)
# 下降段
fbank[m, center:right] = (right - k) / (right - center)
形状:(N_filters, nfft//2 + 1)
5. 应用滤波器
power_spec = |FFT(frame)|^2
mel_energies = fbank @ power_spec # shape: (N_filters,)
log_mel = log(mel_energies + eps)
关键参数
| 参数 | 典型值 | 作用 |
|---|---|---|
N_filters |
40 / 80 | Mel通道数 |
nfft |
512 / 1024 | FFT点数 |
sr |
16000 / 22050 | 采样率 |
f_min |
0 / 80 Hz | 低频截止 |
f_max |
sr/2 | 高频截止 |
数据流
音频帧 → 加窗 → FFT → 幂谱 → Mel滤波器组 → log → log-mel spectrogram
↓
再加DCT → MFCC
低频密、高频稀本质
Mel空间等距 → Hz空间非等距。低频bin窄(精细),高频bin宽(粗糙)。模拟耳蜗basilar membrane响应。
--【叁】--:
非常神奇的 skill
在用 Opus 的时候,直接 @caveman wenyan-ultra,还是能够看到节省了一定的 Tokens 的
安装方法:npx skills add JuliusBrussee/caveman
--【肆】--:
到底是怎么实现的?能不能贴一段出来,我这没连梯子看不到,要是简化回复,那么对于写文之类的岂不是没有用处
--【伍】--:
总感觉这种简化的话,不会导致质量下降吗?
--【陆】--:
可以具体看下Skill.md, 代码、警告、安全等应该不受影响,主要是简化回复
--【柒】--:
真的假的,这么猛,codex里面可以用不?
--【捌】--:
这种过于精简的表达方式会不会影响模型能力?用符号来代替某些词句不会影响概率预测吗?
IMG_23921908×2682 536 KB
号称 “在保持完全技术准确性的同时,削减大约 75% 的token数量”,感觉更像是某种回复风格
GitHub - JuliusBrussee/caveman: 🪨 why use many token when few token do trick —...
🪨 why use many token when few token do trick — Claude Code skill that cuts 75% of tokens by talking like caveman
网友解答:--【壹】--:
怎么实现的呢?完全没有损失那几乎不可能,只是好奇这个到底损失了啥
--【贰】--:
Question:讲解mel滤波器实现算法
Mel 滤波器组实现算法
核心概念
Mel 滤波器组是语音处理中的关键步骤,模拟人耳对频率的非线性感知——低频分辨率高,高频分辨率低。
频率转换公式
Hz → Mel:
mel = 2595 × log₁₀(1 + f/700)
Mel → Hz:
f = 700 × (10^(mel/2595) - 1)
实现步骤
Step 1:确定频率边界
import numpy as np
def mel_filterbank(sample_rate, n_fft, n_filters, f_min=0, f_max=None):
if f_max is None:
f_max = sample_rate / 2 # Nyquist 频率
# Hz → Mel
mel_min = 2595 * np.log10(1 + f_min / 700)
mel_max = 2595 * np.log10(1 + f_max / 700)
Step 2:在 Mel 域均匀采样
# 在 Mel 域均匀分布 n_filters+2 个点(含两端边界)
mel_points = np.linspace(mel_min, mel_max, n_filters + 2)
# Mel → Hz
hz_points = 700 * (10 ** (mel_points / 2595) - 1)
Step 3:映射到 FFT bin 索引
# FFT bin 索引:freq = bin * sample_rate / n_fft
bins = np.floor((n_fft + 1) * hz_points / sample_rate).astype(int)
Step 4:构造三角滤波器
filters = np.zeros((n_filters, n_fft // 2 + 1))
for m in range(1, n_filters + 1):
left = bins[m - 1] # 左边界
center = bins[m] # 中心(峰值)
right = bins[m + 1] # 右边界
# 上升沿
for k in range(left, center):
filters[m-1, k] = (k - left) / (center - left)
# 下降沿
for k in range(center, right):
filters[m-1, k] = (right - k) / (right - center)
return filters
用向量化写法更高效:
for m in range(1, n_filters + 1):
l, c, r = bins[m-1], bins[m], bins[m+1]
filters[m-1] = np.maximum(0, np.minimum(
(np.arange(n_fft//2+1) - l) / (c - l),
(r - np.arange(n_fft//2+1)) / (r - c)
))
完整流程图
音频信号
│
▼
预加重(可选): x[n] = x[n] - α·x[n-1]
│
▼
分帧 + 加窗(Hann/Hamming)
│
▼
FFT → 功率谱 |X[k]|²
│
▼
× Mel 滤波器组(三角滤波器)
│
▼
每个滤波器求和 → n_filters 个能量值
│
▼
取 log(对数压缩)
│
▼
DCT → MFCC 系数(可选)
关键参数
| 参数 | 典型值 | 说明 |
|---|---|---|
n_filters |
40~128 | 滤波器数量 |
n_fft |
512/1024/2048 | FFT 点数 |
f_min |
0~80 Hz | 最低频率 |
f_max |
8000 Hz | 最高频率(通常=采样率/2) |
sample_rate |
16000/22050 | 采样率 |
为什么是三角形?
- 连续性:相邻滤波器之间平滑过渡,无频率盲区
- 归一化:每个滤波器面积约为 1,保持能量一致性
- 高频压缩:在 Hz 域看,高频三角形更宽(体现 Mel 非线性)
Mel域(均匀间隔): | | | | | | | |
Hz域(非线性): ||||||| | | | |
低频滤波器窄(精细),高频滤波器宽(粗糙),与人耳特性一致。
Question: /caveman 讲解mel滤波器实现算法
Mel 滤波器实现
核心思想
人耳感知频率非线性。低频分辨率高,高频分辨率低。Mel scale 模拟此特性。
Hz → Mel 转换
mel = 2595 * log10(1 + hz / 700)
hz = 700 * (10^(mel/2595) - 1)
实现步骤
1. 定频率范围
f_min = 0 # Hz
f_max = sr / 2 # Nyquist
2. Mel空间均匀采样
# N个滤波器 → N+2个点(含两端边界)
mel_points = linspace(hz2mel(f_min), hz2mel(f_max), N+2)
hz_points = mel2hz(mel_points) # 转回Hz,非线性分布
3. FFT bin对齐
bin_points = floor((nfft+1) * hz_points / sr)
4. 构造三角滤波器
每个滤波器 m,跨3个点:左端 m-1,峰值 m,右端 m+1。
for m in range(1, N+1):
left, center, right = bin[m-1], bin[m], bin[m+1]
# 上升段
fbank[m, left:center] = (k - left) / (center - left)
# 下降段
fbank[m, center:right] = (right - k) / (right - center)
形状:(N_filters, nfft//2 + 1)
5. 应用滤波器
power_spec = |FFT(frame)|^2
mel_energies = fbank @ power_spec # shape: (N_filters,)
log_mel = log(mel_energies + eps)
关键参数
| 参数 | 典型值 | 作用 |
|---|---|---|
N_filters |
40 / 80 | Mel通道数 |
nfft |
512 / 1024 | FFT点数 |
sr |
16000 / 22050 | 采样率 |
f_min |
0 / 80 Hz | 低频截止 |
f_max |
sr/2 | 高频截止 |
数据流
音频帧 → 加窗 → FFT → 幂谱 → Mel滤波器组 → log → log-mel spectrogram
↓
再加DCT → MFCC
低频密、高频稀本质
Mel空间等距 → Hz空间非等距。低频bin窄(精细),高频bin宽(粗糙)。模拟耳蜗basilar membrane响应。
--【叁】--:
非常神奇的 skill
在用 Opus 的时候,直接 @caveman wenyan-ultra,还是能够看到节省了一定的 Tokens 的
安装方法:npx skills add JuliusBrussee/caveman
--【肆】--:
到底是怎么实现的?能不能贴一段出来,我这没连梯子看不到,要是简化回复,那么对于写文之类的岂不是没有用处
--【伍】--:
总感觉这种简化的话,不会导致质量下降吗?
--【陆】--:
可以具体看下Skill.md, 代码、警告、安全等应该不受影响,主要是简化回复
--【柒】--:
真的假的,这么猛,codex里面可以用不?
--【捌】--:
这种过于精简的表达方式会不会影响模型能力?用符号来代替某些词句不会影响概率预测吗?
IMG_23921908×2682 536 KB

