这篇内容能帮你做什么
下面整理了一组“在线工具生成型”中文 AI 提示词(Prompts),主题聚焦在音频批量降噪与响度标准化。每条 Prompt 都要求 AI 产出一个可运行/可构建/可部署的在线工具,并且必须提供“一键输出 HTML”的能力,用于直接预览与交付。
音频处理 批量降噪与响度标准化工作台
面向播客、课程录音、会议纪要的批量处理:降噪、响度统一、峰值限幅、导出报告与可交付 HTML。
提示词 (Prompts):
你是一名资深前端工程师与音频算法工程师。请实现一个可部署的“音频批量降噪与响度标准化工作台”在线工具,要求:
1) 技术栈:Vite + React + Type (允许用 Web Audio API、AudioWorklet/OfflineAudioContext;不依赖后端即可运行)。
2) 输入:支持拖拽/选择多文件(wav/mp3/aac/m4a/ogg),并显示每个文件的时长、采样率、声道、峰值(dBFS)、RMS、近似LUFS(可用基于K-weighting的近似实现或说明近似方法)。
3) 处理链:
- 降噪:提供两种可选策略:A) 轻量噪声门+高通滤波;B) 频谱减法(基于噪声采样段,提供“噪声学习”按钮,生成噪声轮廓)。
- 响度标准化:目标响度可选(例如 -16 LUFS/-14 LUFS),并提供 true peak 限幅(例如 -1 dBTP),避免削波。
- 批量:可对选中条目一键应用相同参数;支持单条预览播放 A/B 对比。
4) 输出:
- 导出:支持导出处理后音频(WAV 优先;如转码需要说明限制并提供可选 wasm 方案)。
- 报告:生成处理报告(每个文件处理前后指标、使用的参数、异常提示)。
5) 一键输出 HTML(硬约束):实现“生成交付 HTML”按钮:
- 点击后,生成一个单文件 HTML(包含内嵌 CSS/JS),能离线打开查看报告、下载处理后的文件(可打包为 64 或提供将音频文件与 HTML 同目录的使用说明)。
- 该单文件 HTML 必须可直接打开运行,不依赖外部 CDN。
6) 交付物必须包含:
- 完整文件树(例如 src/、public/、package.json、tsconfig 等)
- 关键源码完整粘贴(不要省略)
- 本地运行命令(npm s)
- 构建命令与部署说明(例如静态托管)
- 至少 8 条 QA checklist(包含:不同浏览器、不同格式、长音频、内存上限、导出正确性、参数边界)
7) UI:提供队列列表、参数面板、波形/电平简单可视化(简单实现即可),并对失败解码给出可读错误。
主要用途:
把一批录音素材在浏览器里做可控的降噪与响度统一,并生成可离线交付的 HTML 报告页,方便交付与复盘。
音频处理 章节切分与时间轴标注器
把长音频按静音/能量阈值自动切分成章节,支持手工微调与导出章节表。
提示词 (Prompts):
请实现一个可部署的在线工具“音频章节切分与时间轴标注器”。要求:
- 技术栈:Vue 3 + Type + Vite,纯前端。
- 功能:导入单个音频文件后,计算能量曲线;根据静音阈值与最短片段长度自动生成章节;支持拖拽调整章节边界、合并/拆分章节;支持播放定位与快捷键。
- 输出:
1) 导出 JSON 与 CSV 章节表(起止时间、标题、备注)。
2) 一键输出 HTML:生成一个包含播放器+章节侧栏的单文件 index.html,内置章节数据(JSON 内嵌),离线打开即可播放并跳转章节。
- 交付物:给出完整文件树、全部源码、运行/构建命令、静态部署说明、至少 6 条测试用例。
主要用途:
用于播客/课程/会议录音的章节标注与交付,便于快速回听与剪辑定位。
音频处理 批量响度扫描与合规检查器
只扫描不改动:快速发现响度不合规、峰值过高、双声道不平衡等问题。
提示词 (Prompts):
实现“批量响度扫描与合规检查器”在线工具,要求:
- 技术栈:Next.js + Type (静态导出可用),前端计算为主。
- 输入:多文件队列;并行解码与指标计算(注意内存与并发控制)。
- 指标:峰值、RMS、动态范围估计、左右声道电平差、静音占比;给出合规判定(可配置阈值)。
- 输出:
1) 导出检测报告(HTML/CSV/JSON)。
2) 一键输出 HTML:生成一个自包含的单文件报告页(包含表格筛选、排序、红黄绿标记),离线打开可用,不依赖外链。
- 交付物:完整项目代码、文件树、运行命令、部署方式、至少 10 条 QA checklist。
主要用途:
在批量交付前做自动质检,减少返工并形成可追溯的验收报告。
音频处理 去齿音与刺耳频段抑制器
针对人声“嘶”“刺”的齿音做可控抑制,并提供频段可视化。
提示词 (Prompts):
请开发一个“去齿音与刺耳频段抑制器”在线工具:
- 技术栈:SvelteKit + Type (可静态部署)。
- 处理:实现一个简化的动态 EQ / de-esser:可选择目标频段(例如 4k-10k),阈值、比率、攻击/释放时间;支持预览 A/B。
- 可视化:显示简易频谱(FFT)与增益衰减曲线。
- 导出:导出处理后 WAV。
- 一键输出 HTML:生成可离线打开的单文件 HTML,包含当前参数、处理摘要、以及“如何复现处理”的说明(同目录放音频文件也可工作)。
- 交付:文件树+源码+运行/部署+至少 6 条测试用例。
主要用途:
快速改善人声刺耳问题,批量交付前做统一处理与可追踪记录。
音频处理 语音转写前处理与切片器
将长音频切成适合转写的片段,并输出切片清单与时间码。
提示词 (Prompts):
实现“语音转写前处理与切片器”在线工具(不做转写本身)。要求:
- 技术栈:原生 Type + Web Audio API(无需框架),单页应用。
- 功能:导入音频,进行降噪/归一化(轻量版),按最大时长/静音阈值切片;生成每个切片的起止时间与文件名;支持一键导出切片 WAV。
- 输出:
1) 导出切片清单(JSON/CSV),包含时间码与建议转写参数。
2) 一键输出 HTML:生成一个单文件 HTML,内置切片清单与播放跳转功能,作为交付物与对齐依据。
- 交付:给出 index.html(可直接打开)+ 可选工程版文件树;至少 8 条 QA checklist。
主要用途:
把大段录音整理成结构化切片,方便后续转写与对齐校对。
音频处理 批量片头片尾拼接器
把统一片头/片尾批量拼接到多条音频上,并保持输出响度一致。
提示词 (Prompts):
请实现“批量片头片尾拼接器”在线工具:
- 技术栈:React + Type ,使用 OfflineAudioContext 做离线合成。
- 输入:选择片头音频、片尾音频、以及多条主体音频;支持为每条主体指定淡入淡出。
- 处理:拼接前后做响度匹配(目标 -16 LUFS 近似),并进行峰值限幅。
- 输出:导出每条拼接后的 WAV。
- 一键输出 HTML:生成单文件 HTML 交付页,内置参数与处理日志(若音频文件不内嵌,可提供同目录放置与文件名约定,并在 HTML 内做存在性提示)。
- 交付物:项目文件树+源码+命令+部署+至少 6 条测试用例。
主要用途:
批量生成统一风格的节目音频,并保留可复现的处理记录。
音频处理 采样率与声道批量转换器
把不同来源的音频统一到同一采样率/声道布局,并生成转码清单。
提示词 (Prompts):
实现“采样率与声道批量转换器”在线工具:
- 技术栈:Vite + Vanilla TS。
- 功能:导入多音频,统一重采样(例如 48k/44.1k)、立体声/单声道转换、左右声道平衡调整;给出转换前后指标。
- 输出:导出 WAV;导出转换清单(JSON/CSV)。
- 一键输出 HTML:生成单文件 HTML(离线可用),展示批量转换结果表、参数、异常项与复现说明。
- 交付:完整代码、文件树、运行/部署命令、至少 8 条 QA checklist。
主要用途:
在进入剪辑/混音/转写流程前,把音频规格统一,减少兼容问题。
音频处理 处理参数模板与可复现配方库
把一套处理参数保存为“配方”,支持导入导出与团队复用。
提示词 (Prompts):
开发“音频处理配方库”在线工具:
- 技术栈:Nuxt 3 + Type (可静态部署)。
- 功能:定义配方(降噪、去齿音、响度目标、限幅阈值、切片策略等),支持版本管理、对比、导入导出(JSON)。
- 集成:提供一个最小可运行的批处理演示(对 1 条音频应用配方并导出 WAV)。
- 一键输出 HTML:生成包含配方详情与复现步骤的单文件 HTML(内置 JSON),用于交付与团队复盘。
- 交付:文件树+源码+运行/部署+至少 6 条测试用例。
主要用途:
让处理策略可复用、可对比、可交付,避免“凭感觉调参数”。
交付物:index.html(可直接打开的最小工具示例)
下面给出一个最小可运行的单文件 HTML 示例:支持多音频导入、计算基本指标、做轻量“高通+噪声门”与峰值归一化、导出 WAV,并提供“一键导出 HTML(带当前参数)”。
<!doctype html>
<html lang="zh-CN">
<head>
< charset="utf-8" />
< name="viewport" content="width=device-width,initial-scale=1" />
< >音频批量降噪与响度标准化(最小版)</ >
<style>
body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial; margin:24px; color:#111;}
.row{display:flex; gap:16px; flex-wrap:wrap;}
.card{border:1px solid #e5e7eb; border-radius:12px; padding:16px; max-width:980px;}
.muted{color:#6b7280;}
table{border-collapse:collapse; width:100%;}
th,td{border-bottom:1px solid #eee; padding:8px; text-align:left; font-size:14px;}
button{padding:8px 12px; border:1px solid #ddd; background:#fff; border-radius:10px; cursor:pointer;}
button.primary{background:#111; color:#fff; border-color:#111;}
input[type="number"]{width:120px; padding:6px 8px;}
.warn{color:#b45309;}
</style>
</head>
<body>
<h1>音频批量降噪与响度标准化(最小版)</h1>
<p class="muted">说明:这是一个纯前端离线示例,使用 Web Audio API 做轻量处理。不同浏览器对某些格式解码支持不同,建议优先使用 WAV。</p>
<div class="row">
<div class="card">
<h2>1) 导入</h2>
<input id="file" type="file" multiple accept="audio/*" />
<p class="muted">支持拖拽到页面任意位置。</p>
<div id="msg" class="warn"></div>
</div>
<div class="card">
<h2>2) 参数</h2>
<div>
<label>高通(Hz) <input id="hp" type="number" value="80" min="0" /></label>
</div>
<div>
<label>噪声门阈值(dBFS) <input id="gate" type="number" value="-45" /></label>
</div>
<div>
<label>目标峰值(dBFS) <input id="peak" type="number" value="-1" /></label>
</div>
<p class="muted">提示:此最小版用“峰值归一化 + 噪声门”近似替代 LUFS 标准化。工程版可把目标换成近似 LUFS 并增加 true peak 限幅。</p>
<div class="row">
<button class="primary" id="run">批量处理并导出 WAV</button>
<button id="exportHtml">一键导出 HTML(带当前参数)</button>
</div>
</div>
</div>
<div class="card" style="margin-top:16px;">
<h2>3) 列表与指标</h2>
<table>
<thead>
<tr><th>文件名</th><th>时长(s)</th><th>采样率</th><th>声道</th><th>峰值(dBFS)</th><th>RMS(dBFS)</th></tr>
</thead>
<tbody id="list"></tbody>
</table>
</div>
< >
const $ = (id) => document.getElementById(id);
const state = { files: [] };
function dbfsFromAmp(a){
const v = Math.max(1e-12, a);
return 20 * Math.log10(v);
}
async function decodeFile(file){
const buf = await file.arrayBuffer();
const ac = new (window.AudioContext || window.webkitAudioContext)();
try{
const audioBuf = await ac.decodeAudioData(buf.slice(0));
await ac.close();
return audioBuf;
}catch(e){
await ac.close();
throw e;
}
}
function analyze(audioBuf){
const ch = audioBuf.numberOfChannels;
const len = audioBuf.length;
let peak = 0;
let sumsq = 0;
for(let c=0;c<ch;c++){
const data = audioBuf.getChannelData(c);
for(let i=0;i<len;i++){
const v = Math.abs(data[i]);
if(v > peak) peak = v;
sumsq += data[i]*data[i];
}
}
const rms = Math.sqrt(sumsq / (len * ch));
return { peakDb: dbfsFromAmp(peak), rmsDb: dbfsFromAmp(rms), peakAmp: peak };
}
async function process(audioBuf, opts){
const sr = audioBuf.sampleRate;
const ch = audioBuf.numberOfChannels;
const oac = new OfflineAudioContext(ch, audioBuf.length, sr);
const src = oac.createBufferSource();
src.buffer = audioBuf;
const hp = oac.createBiquadFilter();
hp.type = 'highpass';
hp.frequency.value = Math.max(0, opts.hpHz);
const gain = oac.createGain();
src.connect(hp);
hp.connect(gain);
gain.connect(oac.destination);
src.start();
const rendered = await oac.startRendering();
const out = new AudioBuffer({ length: rendered.length, numberOfChannels: ch, sampleRate: sr });
const gateAmp = Math.pow(10, opts.gateDb/20);
const targetPeakAmp = Math.pow(10, opts.targetPeakDb/20);
let peak = 0;
for(let c=0;c<ch;c++){
const inData = rendered.getChannelData(c);
const outData = out.getChannelData(c);
for(let i=0;i<inData.length;i++){
const v = Math.abs(inData[i]) < gateAmp ? 0 : inData[i];
outData[i] = v;
const av = Math.abs(v);
if(av > peak) peak = av;
}
}
const norm = peak > 0 ? (targetPeakAmp / peak) : 1;
for(let c=0;c<ch;c++){
const d = out.getChannelData(c);
for(let i=0;i<d.length;i++) d[i] = Math.max(-1, Math.min(1, d[i]*norm));
}
return out;
}
function encodeWav(audioBuf){
const ch = audioBuf.numberOfChannels;
const sr = audioBuf.sampleRate;
const samples = audioBuf.length;
const bytesPerSample = 2;
const blockAlign = ch * bytesPerSample;
const byteRate = sr * blockAlign;
const dataSize = samples * blockAlign;
const buffer = new ArrayBuffer(44 + dataSize);
const view = new DataView(buffer);
let p = 0;
function wstr(s){ for(let i=0;i<s.length;i++) view.setUint8(p++, s.charCodeAt(i)); }
function w32(v){ view.setUint32(p, v, true); p += 4; }
function w16(v){ view.setUint16(p, v, true); p += 2; }
wstr('RIFF'); w32(36 + dataSize); wstr('WAVE');
wstr('fmt '); w32(16); w16(1); w16(ch); w32(sr); w32(byteRate); w16(blockAlign); w16(16);
wstr('data'); w32(dataSize);
const tmp = new Int16Array(samples * ch);
for(let i=0;i<samples;i++){
for(let c=0;c<ch;c++){
let v = audioBuf.getChannelData(c)[i];
v = Math.max(-1, Math.min(1, v));
tmp[i*ch + c] = v < 0 ? v * 0x8000 : v * 0x7fff;
}
}
for(let i=0;i<tmp.length;i++, p+=2) view.setInt16(p, tmp[i], true);
return new Blob([buffer], { type: 'audio/wav' });
}
function renderList(){
const tb = $('list');
tb.innerHTML = '';
for(const it of state.files){
const tr = document.createElement('tr');
tr.innerHTML = '
' + it.name + ' | ' +
'' + it.duration.toFixed(2) + ' | ' +
'' + it.sr + ' | ' +
'' + it.ch + ' | ' +
'' + it.peakDb.toFixed(1) + ' | ' +
'' + it.rmsDb.toFixed(1) + ' | ';
tb.appendChild(tr);
}
}
async function addFiles(files){
$('msg').textContent = '';
for(const f of files){
try{
const buf = await decodeFile(f);
const m = analyze(buf);
state.files.push({ file: f, name: f.name, buf, duration: buf.duration, sr: buf.sampleRate, ch: buf.numberOfChannels, peakDb: m.peakDb, rmsDb: m.rmsDb });
renderList();
}catch(e){
$('msg').textContent = '解码失败:' + f.name + '。建议转成 WAV 再试。';
}
}
}
$('file').addEventListener('change', (e) => addFiles(e.target.files));
document.addEventListener('dragover', (e) => { e.preventDefault(); });
document.addEventListener('drop', (e) => { e.preventDefault(); addFiles(e.dataTransfer.files); });
$('run').addEventListener('click', async () => {
if(state.files.length === 0){ $('msg').textContent = '请先导入音频文件。'; return; }
const opts = { hpHz: Number($('hp').value||0), gateDb: Number($('gate').value||-45), targetPeakDb: Number($('peak').value||-1) };
$('msg').textContent = '处理中...(请勿关闭页面)';
for(const it of state.files){
const out = await process(it.buf, opts);
const wav = encodeWav(out);
const a = document.createElement('a');
a.href = URL.create URL(wav);
a.download = it.name.replace(/\.[^.]+$/, '') + '.processed.wav';
a.click();
URL.revoke URL(a.href);
}
$('msg').textContent = '完成:已触发下载。';
});
$('exportHtml').addEventListener('click', () => {
const clone = document.documentElement.cloneNode(true);
clone.querySelector('#hp').setAttribute('value', String($('hp').value));
clone.querySelector('#gate').setAttribute('value', String($('gate').value));
clone.querySelector('#peak').setAttribute('value', String($('peak').value));
const html = '
' + clone.outerHTML;
const blob = new Blob([html], {type:'text/html'});
const a = document.createElement('a');
a.href = URL.create URL(blob);
a.download = 'index.html';
a.click();
URL.revoke URL(a.href);
});
</ >
</body>
</html>