音频处理 音频批量降噪与响度标准化工具 AI 提示词 (Prompts)

这篇内容能帮你做什么

下面整理了一组“在线工具生成型”中文 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>

用户评论 (0)

登录后参与讨论

立即登录 注册账号

暂无评论,快来抢沙发吧~

操作成功