v82: trimStartBlob через AudioContext+OfflineRenderer — обрезка 0.2с для Whisper
This commit is contained in:
+24
-9
@@ -321,13 +321,28 @@ function encodeWAV(samples, sampleRate) {
|
||||
|
||||
// Обрезает первые cutSec секунд, возвращает WAV Blob (для Groq)
|
||||
async function trimStartBlob(blob, cutSec = 0.2) {
|
||||
const ctx = new OfflineAudioContext(1, 1, 44100);
|
||||
const ab = await blob.arrayBuffer();
|
||||
const buf = await ctx.decodeAudioData(ab);
|
||||
const sr = buf.sampleRate;
|
||||
const data = buf.getChannelData(0);
|
||||
const cutSamples = Math.floor(sr * cutSec);
|
||||
const trimmed = data.slice(cutSamples);
|
||||
const wav = encodeWAV(trimmed, sr);
|
||||
return new Blob([wav], { type: 'audio/wav' });
|
||||
try {
|
||||
const ab = await blob.arrayBuffer();
|
||||
const actx = new AudioContext();
|
||||
const rawBuf = await actx.decodeAudioData(ab);
|
||||
const sr = rawBuf.sampleRate;
|
||||
const cutSamples = Math.floor(sr * cutSec);
|
||||
const newLen = rawBuf.length - cutSamples;
|
||||
if (newLen < sr * 0.05) { actx.close(); return blob; }
|
||||
|
||||
// Render trimmed via OfflineAudioContext (надёжнее ручного slice)
|
||||
const offline = new OfflineAudioContext(1, newLen, sr);
|
||||
const src = offline.createBufferSource();
|
||||
src.buffer = rawBuf;
|
||||
src.connect(offline.destination);
|
||||
src.start(0, cutSec / sr);
|
||||
const rendered = await offline.startRendering();
|
||||
actx.close();
|
||||
|
||||
const wav = encodeWAV(rendered.getChannelData(0), sr);
|
||||
return new Blob([wav], { type: 'audio/wav' });
|
||||
} catch(e) {
|
||||
console.log('[trimStartBlob] fallback to raw:', e);
|
||||
return blob;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user