npm package: @lakshmideepak/voicesdk
Description: SDK for audio streaming using Socket.IO
Author: Lakshmi Deepak
Latest version: 1.3.3

# VoiceSDK 🎤

A simple SDK to integrate real-time voice streaming with your backend using WebRTC, WebSocket, and AudioWorklets. It captures microphone input, streams audio to your server, and handles responses in real-time.

## ✅ Features

- 🎤 Real-time microphone capture
- 🔊 Audio level meter
- 🔗 Easy integration with backend (WebSocket)
- ⚡ Works with HTML, React, or any frontend

## 📥 Installation

You can use the VoiceSDK via CDN for HTML projects or install it via npm for modern JavaScript frameworks.

### Using CDN (for HTML projects)

```html
<script src="https://unpkg.com/js-base64"></script>
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
<script>
  window.jsBase64 = { Base64: window.Base64 };
  window.socket_io_esm_min_js = { io: window.io };
</script>
<script src="https://cdn.jsdelivr.net/npm/@lakshmideepak/voicesdk@latest/dist/voice-sdk.umd.js"></script>
```

### Using npm (for React or other frameworks)

```bash
npm install @lakshmideepak/voicesdk
```

## ⚡ Usage

### 1. HTML Example

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Voice SDK Demo</title>
</head>
<body>
  <h1>Voice SDK Demo</h1>
  <button id="startBtn">Start</button>
  <button id="stopBtn">Stop</button>
  <p>Status: <span id="status">disconnected</span></p>
  <p>Mic Level: <span id="level">0</span></p>
  <p id="error"></p>

  <script src="https://unpkg.com/js-base64"></script>
  <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
  <script>
    window.jsBase64 = { Base64: window.Base64 };
    window.socket_io_esm_min_js = { io: window.io };
  </script>
  <script src="https://cdn.jsdelivr.net/npm/@lakshmideepak/voicesdk@latest/dist/voice-sdk.umd.js"></script>
  <script>
    const voice = window.VoiceSDK({
      serverUrl: "https://your-server-url.com",
      token: "YOUR_JWT_TOKEN",
      username: "your-username",
      onStatus: (s) => {
        document.getElementById("status").textContent = s;
      },
      onAudioLevel: (lvl) => {
        document.getElementById("level").textContent = Math.round(lvl);
      },
      onModelSpeaking: (speaking) => {
        console.log("Bot speaking:", speaking);
      },
    });

    document.getElementById("startBtn").onclick = () => voice.start();
    document.getElementById("stopBtn").onclick = () => voice.stop();
  </script>
</body>
</html>
```

### 2. React Example

```jsx
import { useEffect, useState, useRef } from "react";

export default function App() {
  const [status, setStatus] = useState("disconnected");
  const [level, setLevel] = useState(0);
  const [error, setError] = useState("");
  const voiceRef = useRef(null);

  useEffect(() => {
    const voice = window.VoiceSDK({
      serverUrl: import.meta.env.VITE_APP_API,
      token: import.meta.env.VITE_APP_BOT_TOKEN,
      username: import.meta.env.VITE_APP_USER_NAME,
      onStatus: (s) => setStatus(s),
      onAudioLevel: (lvl) => setLevel(Math.round(lvl)),
      onModelSpeaking: (speaking) => console.log("Bot speaking:", speaking),
    });

    voiceRef.current = voice;
    return () => voice.stop();
  }, []);

  return (
    <div>
      <h1>Voice SDK Demo</h1>
      <button onClick={() => voiceRef.current.start()}>Start</button>
      <button onClick={() => voiceRef.current.stop()}>Stop</button>
      <p>Status: {status}</p>
      <p>Mic Level: {level}</p>
      {error && <p style={{ color: "red" }}>{error}</p>}
    </div>
  );
}
```

## 📦 API Reference

### `VoiceSDK(options)`

| Option            | Type   | Required | Description                                               |
| ----------------- | ------ | -------- | --------------------------------------------------------- |
| `serverUrl`       | string | ✅ Yes   | Your backend server WebSocket URL                         |
| `token`           | string | ✅ Yes   | JWT authentication token                                  |
| `username`        | string | ✅ Yes   | Username identifier                                       |
| `onStatus`        | fn     | ❌ No    | Callback for status changes (`connected`, `disconnected`) |
| `onAudioLevel`    | fn     | ❌ No    | Callback for microphone input level                       |
| `onModelSpeaking` | fn     | ❌ No    | Callback when the AI model starts/stops speaking          |

### Methods

| Method     | Description                                     |
| ---------- | ----------------------------------------------- |
| `.start()` | Starts capturing mic and streaming audio        |
| `.stop()`  | Stops capturing mic and disconnects from server |

## 📜 License

MIT License © 2025 Lakshmi Deepak