asigo_
10/15/2025, 12:45 AMVapi Support Bot
10/15/2025, 12:47 AMjs
navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
const audioContext = new AudioContext();
const source = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(1024, 1, 1);
const socket = new WebSocket('wss://your-server-url');
processor.onaudioprocess = (event) => {
const pcmData = event.inputBuffer.getChannelData(0);
const int16Data = new Int16Array(pcmData.length);
for (let i = 0; i < pcmData.length; i++) {
int16Data[i] = Math.max(-32768, Math.min(32767, pcmData[i] * 32768));
}
if (socket.readyState === WebSocket.OPEN) socket.send(int16Data.buffer);
};
source.connect(processor);
processor.connect(audioContext.destination);
});
This streams raw PCM audio to your WebSocket server, where you can forward or process it as needed.
For best results, ensure your receiving application can handle the incoming audio buffer format.
[See more details in the documentation.](https://docs.vapi.ai/calls/websocket-transport)
Source:
- [WebSocket Transport Vapi Documentation](https://docs.vapi.ai/calls/websocket-transport)asigo_
10/15/2025, 12:51 AMVapi Support Bot
10/15/2025, 12:52 AMasigo_
10/15/2025, 12:53 AMVapi Support Bot
10/15/2025, 12:54 AMjs
app.post('/api/synthesize', async (req, res) => {
// Generate or fetch audioBuffer (PCM) for req.body.message.text
// Forward audioBuffer to your other application here
res.setHeader('Content-Type', 'application/octet-stream');
res.write(audioBuffer);
res.end();
});
This gives you full control over the agent's audio stream before it's sent to the user.
See: [Custom TTS Integration Guide](https://docs.vapi.ai/customization/custom-voices/custom-tts)
Source:
- [Custom TTS Integration Guide](https://docs.vapi.ai/customization/custom-voices/custom-tts)