I'm working on a project to stream real-time audio from Asterisk 20 to a Node.js server for Speech-to-Text processing. I'm using a setup where Asterisk is running in a WSL Docker container on Windows, and Node.js is on the same machine.
My goal is to redirect the audio from an active call to my Node.js application.
I first tried using the AudioSocket dialplan application to stream audio over a standard TCP socket:
Asterisk extensions.conf snippet:
same => n,AudioSocket(40325ec2-5efd-4bd3-808f-53576e581d13,172.25.25.150:8088)
same => n,Wait(1000)
same => n,Hangup()
and nodejs server
const net = require('net');
const port = 8088;
const server = net.createServer((socket) => {
console.log('β‘ Asterisk connected'); // This never prints
socket.on('data', (data) => {
console.log('π§ Received audio chunk:', data.length, 'bytes');
});
socket.on('close', () => {
console.log('β Socket closed');
});
socket.on('end', () => {
console.log('π Asterisk disconnected');
});
socket.on('error', (err) => {
console.error('π₯ Socket error:', err);
});
});
server.on('connection', () => {
console.log('π New connection event fired'); // This never prints either
});
server.on('error', (err) => {
console.error('π₯ Server error:', err);
});
server.listen(port, '0.0.0.0', () => {
console.log(`π TCP server listening on port ${port}`);
});
even i tried with ws
const WebSocket = require('ws');
// const speech = require('@google-cloud/speech');
// Creates a client
// const client = new speech.SpeechClient();
// Configure request
const request = {
config: {
encoding: 'LINEAR16',
sampleRateHertz: 8000,
languageCode: 'en-US',
},
interimResults: true, // If you want interim results, set this to true
};
// as from asterisk this port is used
const port = 8088;
// Create a WebSocket server
const wss = new WebSocket.Server({ port, host: "0.0.0.0" });
console.log('WebSocket server is listening on port ' + port);
wss.on('connection', function connection(ws) {
console.log('Asterisk connected');
// const recognizeStream = client
// .streamingRecognize(request)
// .on('error', console.error)
// .on('data', data =>
// process.stdout.write(
// data.results[0] && data.results[0].alternatives[0]
// ? `Transcription: ${data.results[0].alternatives[0].transcript}\n`
// : '\n\nReached transcription time limit, press Ctrl+C\n'
// )
// );
ws.on('message', function incoming(message) {
console.log(" incoming ~ message:", message);
// recognizeStream.write(message);
});
ws.on('close', () => {
// recognizeStream.end();
console.log('Asterisk disconnected');
});
});
When a call hits the AudioSocket application, Asterisk immediately logs the following errors:
[Jun 2 04:25:29] WARNING[956][C-00000001]: res_audiosocket.c:264 ast_audiosocket_receive_frame: Received non-audio AudioSocket message
[Jun 2 04:25:29] ERROR[956][C-00000001]: res_audiosocket.c:302 ast_audiosocket_receive_frame: Insufficient data read from AudioSocket
[Jun 2 04:25:29] ERROR[956][C-00000001]: app_audiosocket.c:207 audiosocket_run: Failed to receive frame from AudioSocket message for channel PJSIP/docker-sip-00000000
== Spawn extension (sub-ivr, s, 45) exited non-zero on 'PJSIP/docker-sip-00000000'
My Node.js server does not log "Asterisk connected" or any data. Basic network connectivity (ping to Asterisk container IP, nc from Asterisk container to Node.js port) seems fine.
the ip i am using i got from my windows machine with
(wsl.exe hostname -I).split(" ")[0];
nc command says
[root@7d9dae36abf2 sounds]# nc -vz 172.25.25.150 8088
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 172.25.25.150:8088.
Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds.
any help on this ?
update1
i changed the port to 8090 and enabled in asterisk, and now no error logs like that and call continues
though there is no message like connection created on my node server. And seems like it is listening and when i hangup it shows
[Jun 3 06:20:27] NOTICE[222][C-00000003]: Ext. s:44 @ sub-ivr: Start
-- Executing [s@sub-ivr:45] AudioSocket("PJSIP/docker-sip-00000002", "42f55a54-6b6c-403f-8414-ffa01a7b22fb,172.25.25.150:8090") in new stack
[Jun 3 06:20:39] WARNING[222][C-00000003]: app_audiosocket.c:212 audiosocket_run: Failed to forward frame to channel PJSIP/docker-sip-00000002
== Spawn extension (sub-ivr, s, 45) exited non-zero on 'PJSIP/docker-sip-00000002'