Skip to content

Commit

Permalink
merge code and get analyser data
Browse files Browse the repository at this point in the history
  • Loading branch information
lloydzhou committed Nov 8, 2024
1 parent 48a1e8a commit 50e6310
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
19 changes: 17 additions & 2 deletions app/components/realtime-chat/realtime-chat.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export function RealtimeChat({
const turnDetection: TurnDetection = useVAD
? { type: "server_vad" }
: null;
clientRef.current.configure({
await clientRef.current.configure({
instructions: "",
voice,
input_audio_transcription: { model: "whisper-1" },
Expand Down Expand Up @@ -100,6 +100,7 @@ export function RealtimeChat({
});
}
}
await clientRef.current.generateResponse();
} catch (error) {
console.error("Set message failed:", error);
}
Expand Down Expand Up @@ -267,11 +268,25 @@ export function RealtimeChat({
console.error(error);
});

// TODO demo to get frequency. will pass audioHandlerRef.current to child component draw.
// TODO try using requestAnimationFrame
const interval = setInterval(() => {
if (audioHandlerRef.current) {
const data = audioHandlerRef.current.getByteFrequencyData();
console.log("getByteFrequencyData", data);
}
}, 100);

return () => {
if (isRecording) {
toggleRecording();
}
audioHandlerRef.current?.close().catch(console.error);
audioHandlerRef.current
?.close()
.catch(console.error)
.finally(() => {
clearInterval(interval);
});
disconnect();
};
}, []);
Expand Down
15 changes: 15 additions & 0 deletions app/lib/audio.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
export class AudioHandler {
private context: AudioContext;
private mergeNode: ChannelMergerNode;
private analyserData: Uint8Array;
public analyser: AnalyserNode;
private workletNode: AudioWorkletNode | null = null;
private stream: MediaStream | null = null;
private source: MediaStreamAudioSourceNode | null = null;
Expand All @@ -13,6 +16,16 @@ export class AudioHandler {

constructor() {
this.context = new AudioContext({ sampleRate: this.sampleRate });
// using ChannelMergerNode to get merged audio data, and then get analyser data.
this.mergeNode = new ChannelMergerNode(this.context, { numberOfInputs: 2 });
this.analyser = new AnalyserNode(this.context, { fftSize: 256 });
this.analyserData = new Uint8Array(this.analyser.frequencyBinCount);
this.mergeNode.connect(this.analyser);
}

getByteFrequencyData() {
this.analyser.getByteFrequencyData(this.analyserData);
return this.analyserData;
}

async initialize() {
Expand Down Expand Up @@ -60,6 +73,7 @@ export class AudioHandler {
};

this.source.connect(this.workletNode);
this.source.connect(this.mergeNode, 0, 0);
this.workletNode.connect(this.context.destination);

this.workletNode.port.postMessage({ command: "START_RECORDING" });
Expand Down Expand Up @@ -114,6 +128,7 @@ export class AudioHandler {
const source = this.context.createBufferSource();
source.buffer = audioBuffer;
source.connect(this.context.destination);
source.connect(this.mergeNode, 0, 1);

const chunkDuration = audioBuffer.length / this.sampleRate;

Expand Down

0 comments on commit 50e6310

Please sign in to comment.