# About Audio socket

**URL:** <https://community.asterisk.org/t/about-audio-socket/110712>\
**Category:** Asterisk APIs\
**Created:** [October 27, 2025, 10:49am UTC](https://community.asterisk.org/t/about-audio-socket/110712 "2025-10-27T10:49:31Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![peush\_12](https://avatars.discourse-cdn.com/v4/letter/p/ea666f/32.png) [@peush\_12](https://community.asterisk.org/u/peush_12)\
**Post date:** [October 27, 2025, 10:49am UTC](https://community.asterisk.org/t/about-audio-socket/110712/1 "2025-10-27T10:49:31Z")

</div>

📡 Connecting to ARI WebSocket at ws://127.0.0.1:8080/ari/events?app=my\_stasis\_app&api\_key=tcriber:myst  
✅ AudioSocket server listening on 127.0.0.1:4000  
📡 Connected to ARI WebSocket.  
🎧 Connected audio stream from (‘127.0.0.1’, 35202)  
⚠ Audio socket error: [Errno 104] Connection reset by peer  
❌ Stream ended.  
I got this error actully i want to stream audio from asterisk to python server for real time transcribe but i got this error please tell me how to resolve it?

---

<div class="post-metadata">

**Author:** ![jcolp](https://sea1.discourse-cdn.com/asterisk/user_avatar/community.asterisk.org/jcolp/32/8848_2.png) [@jcolp](https://community.asterisk.org/u/jcolp)\
**Post date:** [October 27, 2025, 10:52am UTC](https://community.asterisk.org/t/about-audio-socket/110712/2 "2025-10-27T10:52:41Z")

</div>

You haven’t provided sufficient information. What troubleshooting or debugging have you done already? Have you confirmed your code is actually correct (I would wager it is AI generated so it should still be reviewed regardless)? What are the ARI requests that are happening? How are you initiating the audiosocket request? If using the external media ARI request, is it going to the correct place in Asterisk? What shows on the Asterisk console?

---

<div class="post-metadata">

**Author:** ![peush\_12](https://avatars.discourse-cdn.com/v4/letter/p/ea666f/32.png) [@peush\_12](https://community.asterisk.org/u/peush_12)\
**Post date:** [October 27, 2025, 12:29pm UTC](https://community.asterisk.org/t/about-audio-socket/110712/3 "2025-10-27T12:29:31Z")

</div>

[incoming]  
exten =\> +911204845652,1,NoOp(📞 Incoming Call: ${EXTEN} from ${CALLERID(all)})  
same =\> n,Answer()  
same =\> n,NoOp(Diversion: ${PJSIP\_HEADER(read,Diversion)})  
same =\> n,NoOp(History-Info: ${PJSIP\_HEADER(read,History-Info)})  
same =\> n,NoOp(To: ${PJSIP\_HEADER(read,To)})  
same =\> n,NoOp(Channel UNIQUEID: ${UNIQUEID})  
same =\> n,Set(UUID=${UUID()})  
same =\> n,NoOp(Using AudioSocket UUID: ${UUID})  
same =\> n,AudioSocket(${UUID},127.0.0.1:4000)  
same =\> n,Hangup()  
this my extension conf file and below is python code  
#!/usr/bin/env python3  
import requests  
import json  
import threading  
import socket  
import time  
import websocket  
import os  
import sys  
import numpy as np  
import io  
from faster\_whisper import WhisperModel

# ---------------- CONFIG ----------------

ARI\_URL = “[http://127.0.0.1:8088/ari”](http://127.0.0.1:8088/ari%E2%80%9D)  
ARI\_USER = “transcriber”  
ARI\_PASS = “mysecret”  
STASIS\_APP = “my\_stasis\_app”

AUDIOSOCKET\_HOST = “127.0.0.1”  
AUDIOSOCKET\_PORT = 4000

# choose a Whisper model size: tiny, base, small, medium, large-v2

WHISPER\_MODEL\_NAME = “small”  
WHISPER\_DEVICE = “cpu” # or “cuda” for GPU

# ---------------- LOAD WHISPER MODEL ----------------

print(f"🔄 Loading Whisper model ‘{WHISPER\_MODEL\_NAME}’ on {WHISPER\_DEVICE} …")  
model = WhisperModel(WHISPER\_MODEL\_NAME, device=WHISPER\_DEVICE, compute\_type=“int8”)  
print(“✅ Whisper model loaded!”)

# ---------------- AUDIO SOCKET HANDLER ----------------

def handle\_audio(conn, addr):  
print(f"🎧 Connected audio stream from {addr}")  
conn.settimeout(5.0)

```auto
# buffer for accumulating PCM samples (16-bit signed, mono)
audio_buffer = bytearray()

def transcribe_chunk(chunk):
    """Transcribe small PCM chunks in background."""
    try:
        # Convert raw PCM (16-bit, little-endian) to float32 numpy
        audio_np = np.frombuffer(chunk, dtype=np.int16).astype(np.float32) / 32768.0

        # Whisper expects 16 kHz audio
        segments, _ = model.transcribe(audio_np, language="en", beam_size=5)
        text = " ".join([seg.text.strip() for seg in segments])
        if text.strip():
            print("🗣️", text)
    except Exception as e:
        print("⚠️ Transcription error:", e)

def keep_alive():
    """Send silence periodically to keep Asterisk happy."""
    while True:
        try:
            conn.send(b'\x00' * 320) # 20 ms silence
            time.sleep(1)
        except:
            break
threading.Thread(target=keep_alive, daemon=True).start()

# --- receive audio in chunks ---
while True:
    try:
        data = conn.recv(320)
        if not data:
            break
        audio_buffer.extend(data)

        # every ~1 sec (16000 samples = 2 bytes * 16000 = 32000 bytes)
        if len(audio_buffer) >= 32000:
            chunk = bytes(audio_buffer[:32000])
            audio_buffer = audio_buffer[32000:]
            threading.Thread(target=transcribe_chunk, args=(chunk,), daemon=True).start()

    except socket.timeout:
        continue
    except Exception as e:
        print("⚠️ Audio socket error:", e)
        break

print("❌ Stream ended.")
conn.close()

```

# ---------------- AUDIO SOCKET SERVER ----------------

def start\_audiosocket\_server():  
s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)  
s.setsockopt(socket.SOL\_SOCKET, socket.SO\_REUSEADDR, 1)  
s.bind((AUDIOSOCKET\_HOST, AUDIOSOCKET\_PORT))  
s.listen(5)  
print(f"✅ AudioSocket server listening on {AUDIOSOCKET\_HOST}:{AUDIOSOCKET\_PORT}")

```auto
while True:
    conn, addr = s.accept()
    threading.Thread(target=handle_audio, args=(conn, addr), daemon=True).start()

```

# ---------------- ARI HANDLERS ----------------

def on\_incoming\_call(channel\_id):  
print(f"📞 Incoming call on channel {channel\_id}")

```auto
external_media_url = f"{ARI_URL}/channels"
payload = {
    "endpoint": f"audiosocket:tcp://{AUDIOSOCKET_HOST}:{AUDIOSOCKET_PORT}?direction=send&timeout=0",
    "app": STASIS_APP,
    "appArgs": "audiosocket",
    "format": "slin16"
}

print("➡️ Creating external media channel...")
r = requests.post(external_media_url, auth=(ARI_USER, ARI_PASS), json=payload)
print(f"🔍 ARI Response Status: {r.status_code}")
print(f"🔍 ARI Response Body: {r.text}")

if r.status_code != 200:
    print("❌ Failed to create external media channel.")
    return

try:
    ext_chan = r.json()
    ext_id = ext_chan["id"]
    print(f"🎧 Created external media channel {ext_id}")
except Exception as e:
    print(f"❌ Error parsing ARI response: {e}")
    return

# Wait a moment before bridging
time.sleep(0.5)

bridge_id = f"bridge-{channel_id}"
bridge_url = f"{ARI_URL}/bridges/{bridge_id}"

requests.post(bridge_url, auth=(ARI_USER, ARI_PASS), json={"type": "mixing"})
requests.post(f"{bridge_url}/addChannel", auth=(ARI_USER, ARI_PASS),
              json={"channel": [channel_id, ext_id]})
print("🔗 Audio bridged to AudioSocket stream.")

```

# ---------------- ARI EVENT LISTENER ----------------

def listen\_ari\_events():  
ws\_url = f"ws://127.0.0.1:8088/ari/events?app={STASIS\_APP}&api\_key={ARI\_USER}:{ARI\_PASS}"  
print(f"📡 Connecting to ARI WebSocket at {ws\_url}")  
ws = websocket.create\_connection(ws\_url)  
print(“📡 Connected to ARI WebSocket.”)

```auto
while True:
    try:
        msg = ws.recv()
        data = json.loads(msg)
        event = data.get("type")

        if event == "StasisStart":
            channel = data["channel"]["id"]
            on_incoming_call(channel)

    except KeyboardInterrupt:
        print("\n🛑 Stopping server.")
        ws.close()
        break
    except Exception as e:
        print("⚠️ WebSocket error:", e)
        time.sleep(2)
        try:
            ws = websocket.create_connection(ws_url)
        except:
            pass

```

# ---------------- MAIN ----------------

if **name** == “ **main** ”:  
threading.Thread(target=start\_audiosocket\_server, daemon=True).start()  
listen\_ari\_events()

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/asterisk/original/2X/4/475d0c889911cfb84ac4881ad6df8b523e3f9105.png) [@system](https://community.asterisk.org/u/system)\
**Post date:** [November 26, 2025, 12:29pm UTC](https://community.asterisk.org/t/about-audio-socket/110712/4 "2025-11-26T12:29:48Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
