dawood's picture
dawood HF staff
Upload folder using huggingface_hub
9dfbb06 verified
import type WaveSurfer from "wavesurfer.js";
import Regions from "wavesurfer.js/dist/plugins/regions.js";
import { audioBufferToWav } from "./audioBufferToWav";
export interface LoadedParams {
autoplay?: boolean;
}
export function blob_to_data_url(blob: Blob): Promise<string> {
return new Promise((fulfill, reject) => {
let reader = new FileReader();
reader.onerror = reject;
reader.onload = () => fulfill(reader.result as string);
reader.readAsDataURL(blob);
});
}
export const process_audio = async (
audioBuffer: AudioBuffer,
start?: number,
end?: number
): Promise<Uint8Array> => {
const audioContext = new AudioContext();
const numberOfChannels = audioBuffer.numberOfChannels;
const sampleRate = audioBuffer.sampleRate;
let trimmedLength = audioBuffer.length;
let startOffset = 0;
if (start && end) {
startOffset = Math.round(start * sampleRate);
const endOffset = Math.round(end * sampleRate);
trimmedLength = endOffset - startOffset;
}
const trimmedAudioBuffer = audioContext.createBuffer(
numberOfChannels,
trimmedLength,
sampleRate
);
for (let channel = 0; channel < numberOfChannels; channel++) {
const channelData = audioBuffer.getChannelData(channel);
const trimmedData = trimmedAudioBuffer.getChannelData(channel);
for (let i = 0; i < trimmedLength; i++) {
trimmedData[i] = channelData[startOffset + i];
}
}
return audioBufferToWav(trimmedAudioBuffer);
};
export function loaded(
node: HTMLAudioElement,
{ autoplay }: LoadedParams = {}
): void {
async function handle_playback(): Promise<void> {
if (!autoplay) return;
node.pause();
await node.play();
}
}
export const skipAudio = (waveform: WaveSurfer, amount: number): void => {
if (!waveform) return;
waveform.skip(amount);
};
export const addRegion = (
waveform: WaveSurfer,
waveformRegions: Regions,
start: number,
end: number
): void => {
waveformRegions = waveform.registerPlugin(Regions.create());
waveformRegions.addRegion({
start: start,
end: end,
color: "rgba(255, 0, 0, 0.1)",
drag: true,
resize: true
});
};
export const getSkipRewindAmount = (
audioDuration: number,
skip_length?: number | null
): number => {
return (audioDuration / 100) * (skip_length || 5);
};