{"_id":"@360labs/live-transcribe","_rev":"5-4654411d29f743e91f025b0a3ec9e05c","name":"@360labs/live-transcribe","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@360labs/live-transcribe","version":"0.1.0","keywords":["speech-to-text","transcription","live-transcription","speech-recognition","voice","audio","deepgram","assemblyai","web-speech-api","typescript","real-time","streaming","360labs"],"author":{"name":"360labs"},"license":"MIT","_id":"@360labs/live-transcribe@0.1.0","maintainers":[{"name":"saurabh360","email":"skkumar.sk94@gmail.com"}],"homepage":"https://github.com/360labs/live-transcribe#readme","bugs":{"url":"https://github.com/360labs/live-transcribe/issues"},"dist":{"shasum":"aa99d83d72d67da51a118db6e5562ba6aac3d4f0","tarball":"https://registry.npmjs.org/@360labs/live-transcribe/-/live-transcribe-0.1.0.tgz","fileCount":10,"integrity":"sha512-6QoBndsLj+DDTNyIkvl8JFl6gK+fkpwhT+meXF9/bu2Y0QMIlyNFygHUw7Ak+bb3fRS2N74Qyp3tnPaoX0AWAA==","signatures":[{"sig":"MEUCIQDHWQA3i1K65EVUMrb24PaKkdo2jKBZPGQnUBAhZbhdRQIgfvocVSA8NT/2X9PLPMsdl3x0OVtPtI4+PBU+NniFRmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1084775},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write \"src/**/*.ts\"","prepack":"npm run build","prepare":"npm run build","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","test:watch":"jest --watch","build:watch":"tsup --watch","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"saurabh360","email":"skkumar.sk94@gmail.com"},"repository":{"url":"git+https://github.com/360labs/live-transcribe.git","type":"git"},"_npmVersion":"10.9.2","description":"Professional live speech transcription library for TypeScript/JavaScript with multi-provider support","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.0.0","eslint":"^8.56.0","rimraf":"^5.0.5","ts-jest":"^29.1.0","prettier":"^3.2.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","jest-environment-jsdom":"^30.2.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/live-transcribe_0.1.0_1768673946217_0.5719015982825404","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@360labs/live-transcribe","version":"0.1.1","keywords":["speech-to-text","transcription","live-transcription","speech-recognition","voice","audio","deepgram","assemblyai","web-speech-api","typescript","real-time","streaming","360labs"],"author":{"name":"360labs"},"license":"MIT","_id":"@360labs/live-transcribe@0.1.1","maintainers":[{"name":"saurabh360","email":"skkumar.sk94@gmail.com"}],"homepage":"https://github.com/360labs/live-transcribe#readme","bugs":{"url":"https://github.com/360labs/live-transcribe/issues"},"dist":{"shasum":"92bb2546936202cca8db92968cefb3f8f2edfba5","tarball":"https://registry.npmjs.org/@360labs/live-transcribe/-/live-transcribe-0.1.1.tgz","fileCount":10,"integrity":"sha512-b7QehH3D+LAUyfY9zr45T5P68JWa6bKdbvA3ULKJjSN4dWogI2IgyMrGHwkIJr9a/1bXOHh8YrDpuAgLsV6wYQ==","signatures":[{"sig":"MEUCIQDt5DqCQrRz+wejC9O3BOYCXu1G0SUdR4Gybmr/VSUstwIgSuKo1nISK47QnL+puuL7+qTpylanSVEpP2k7odi8jrk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1101971},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write \"src/**/*.ts\"","prepack":"npm run build","prepare":"npm run build","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","test:watch":"jest --watch","build:watch":"tsup --watch","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"saurabh360","email":"skkumar.sk94@gmail.com"},"repository":{"url":"git+https://github.com/360labs/live-transcribe.git","type":"git"},"_npmVersion":"10.9.2","description":"Professional live speech transcription library for TypeScript/JavaScript with multi-provider support","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.0.0","eslint":"^8.56.0","rimraf":"^5.0.5","ts-jest":"^29.1.0","prettier":"^3.2.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","jest-environment-jsdom":"^30.2.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/live-transcribe_0.1.1_1768674203247_0.7445006585975023","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@360labs/live-transcribe","version":"0.2.0","keywords":["speech-to-text","transcription","live-transcription","speech-recognition","voice","audio","deepgram","assemblyai","web-speech-api","typescript","real-time","streaming","360labs"],"author":{"name":"360labs"},"license":"MIT","_id":"@360labs/live-transcribe@0.2.0","maintainers":[{"name":"saurabh360","email":"skkumar.sk94@gmail.com"}],"homepage":"https://github.com/360labs/live-transcribe#readme","bugs":{"url":"https://github.com/360labs/live-transcribe/issues"},"dist":{"shasum":"6194be13212d66f4d3f0dbd4da8f45a604a16131","tarball":"https://registry.npmjs.org/@360labs/live-transcribe/-/live-transcribe-0.2.0.tgz","fileCount":10,"integrity":"sha512-XeHXjpuBq9FkfTitso2twsZPodExU28DnnlUcyzoM42o/VBwoHXg56sRXbZeTKlohsYPYhPFnCR8jJdXsDO/gg==","signatures":[{"sig":"MEQCIHlxc6GZLXs/cdPexPw+VfoLS7wX+eeVCyz8E6qG9CTBAiBURurOmSgOKOzhhBv0/oc2KU9WhUJEsVMkIxXWhDItUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1123439},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write \"src/**/*.ts\"","prepack":"npm run build","prepare":"npm run build","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","test:watch":"jest --watch","build:watch":"tsup --watch","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"saurabh360","email":"skkumar.sk94@gmail.com"},"repository":{"url":"git+https://github.com/360labs/live-transcribe.git","type":"git"},"_npmVersion":"10.9.2","description":"Professional live speech transcription library for TypeScript/JavaScript with multi-provider support","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.0.0","eslint":"^8.56.0","rimraf":"^5.0.5","ts-jest":"^29.1.0","prettier":"^3.2.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","jest-environment-jsdom":"^30.2.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/live-transcribe_0.2.0_1768674910056_0.5222180837230377","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@360labs/live-transcribe","version":"0.2.1","keywords":["speech-to-text","transcription","live-transcription","speech-recognition","voice","audio","deepgram","assemblyai","web-speech-api","typescript","real-time","streaming","360labs"],"author":{"name":"360labs"},"license":"MIT","_id":"@360labs/live-transcribe@0.2.1","maintainers":[{"name":"saurabh360","email":"skkumar.sk94@gmail.com"}],"homepage":"https://github.com/100rabhkr/live-transcribe#readme","bugs":{"url":"https://github.com/100rabhkr/live-transcribe/issues"},"dist":{"shasum":"05809176aad7a256e6def9684ef3458af5e5c93f","tarball":"https://registry.npmjs.org/@360labs/live-transcribe/-/live-transcribe-0.2.1.tgz","fileCount":10,"integrity":"sha512-Y+6BkJuAKzhX5gpvi/LPT+6zUsHFoqeU69D0grOya76Ti6GdjVnJnVOk3oIT4y2Z9JfzvnM6RetJdm8ZoMktIQ==","signatures":[{"sig":"MEUCIQCLBvZS0jWZkKwvtA0MtfFPm4X0gKv1eAyK7SVtSC6ObwIgGTW1gjGmRD0J5k7u1o/+mO8O2ZUdkwExMiSEwC0gtqQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1123455},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write \"src/**/*.ts\"","prepack":"npm run build","prepare":"npm run build","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","test:watch":"jest --watch","build:watch":"tsup --watch","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"saurabh360","email":"skkumar.sk94@gmail.com"},"repository":{"url":"git+https://github.com/100rabhkr/live-transcribe.git","type":"git"},"_npmVersion":"10.9.2","description":"Professional live speech transcription library for TypeScript/JavaScript with multi-provider support","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.0.0","eslint":"^8.56.0","rimraf":"^5.0.5","ts-jest":"^29.1.0","prettier":"^3.2.0","typescript":"^5.3.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","jest-environment-jsdom":"^30.2.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/live-transcribe_0.2.1_1768722028748_0.887831187254057","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@360labs/live-transcribe","version":"0.2.2","description":"Professional live speech transcription library for TypeScript/JavaScript with multi-provider support","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./package.json":"./package.json"},"scripts":{"build":"tsup","build:watch":"tsup --watch","dev":"tsup --watch","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src/**/*.ts","lint:fix":"eslint src/**/*.ts --fix","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\"","typecheck":"tsc --noEmit","clean":"rimraf dist coverage","prepublishOnly":"npm run clean && npm run build && npm run test","prepare":"npm run build","prepack":"npm run build"},"keywords":["speech-to-text","transcription","live-transcription","speech-recognition","voice","audio","deepgram","assemblyai","web-speech-api","typescript","real-time","streaming","360labs"],"author":{"name":"360labs","url":"https://360labs.dev"},"license":"MIT","funding":{"type":"individual","url":"https://360labs.dev"},"repository":{"type":"git","url":"git+https://github.com/100rabhkr/live-transcribe.git"},"bugs":{"url":"https://github.com/100rabhkr/live-transcribe/issues"},"homepage":"https://github.com/100rabhkr/live-transcribe#readme","engines":{"node":">=18.0.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.19.0","@typescript-eslint/parser":"^6.19.0","eslint":"^8.56.0","jest":"^29.7.0","jest-environment-jsdom":"^30.2.0","prettier":"^3.2.0","rimraf":"^5.0.5","ts-jest":"^29.1.0","tsup":"^8.0.0","typescript":"^5.3.0"},"_id":"@360labs/live-transcribe@0.2.2","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-o3mzBH2m65365s2J9B6YvvBd9jd0qiDdjQdxIVwIljKjKXNSg59s5HVIi8XL3rrRKiQw8J1+aC2KbdIUXVJAOQ==","shasum":"3c405020ac30ddada067cdbf825c14272c6c303e","tarball":"https://registry.npmjs.org/@360labs/live-transcribe/-/live-transcribe-0.2.2.tgz","fileCount":10,"unpackedSize":1124187,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD9+CVNhsq/zolOXjhDrBXPYzo+8ezTpJiZ29UoIReUtwIgMn3G/5eLj2PA6I4n6+Pq11AzvYv05eIz5mKsQPa09r8="}]},"_npmUser":{"name":"saurabh360","email":"skkumar.sk94@gmail.com"},"directories":{},"maintainers":[{"name":"saurabh360","email":"skkumar.sk94@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/live-transcribe_0.2.2_1768722308454_0.281774665877105"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-17T18:19:06.135Z","modified":"2026-01-18T07:45:08.759Z","0.1.0":"2026-01-17T18:19:06.410Z","0.1.1":"2026-01-17T18:23:23.457Z","0.2.0":"2026-01-17T18:35:10.274Z","0.2.1":"2026-01-18T07:40:28.938Z","0.2.2":"2026-01-18T07:45:08.637Z"},"bugs":{"url":"https://github.com/100rabhkr/live-transcribe/issues"},"author":{"name":"360labs","url":"https://360labs.dev"},"license":"MIT","homepage":"https://github.com/100rabhkr/live-transcribe#readme","keywords":["speech-to-text","transcription","live-transcription","speech-recognition","voice","audio","deepgram","assemblyai","web-speech-api","typescript","real-time","streaming","360labs"],"repository":{"type":"git","url":"git+https://github.com/100rabhkr/live-transcribe.git"},"description":"Professional live speech transcription library for TypeScript/JavaScript with multi-provider support","maintainers":[{"name":"saurabh360","email":"skkumar.sk94@gmail.com"}],"readme":"# Live Transcribe\n\n> Professional live speech transcription library for TypeScript/JavaScript with multi-provider support\n\n[![npm version](https://img.shields.io/npm/v/@360labs/live-transcribe.svg)](https://www.npmjs.com/package/@360labs/live-transcribe)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.3+-blue.svg)](https://www.typescriptlang.org/)\n[![Tests](https://img.shields.io/badge/tests-242%20passing-brightgreen.svg)]()\n\n**Built by [360labs](https://360labs.dev)** - We build AI-powered developer tools and APIs.\n\n<a href=\"https://360labs.dev\">\n  <img src=\"https://img.shields.io/badge/360labs.dev-Visit%20Website-blue?style=for-the-badge\" alt=\"360labs.dev\" />\n</a>\n\n---\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Providers](#providers)\n  - [Web Speech API](#web-speech-api-browser)\n  - [Deepgram](#deepgram)\n  - [AssemblyAI](#assemblyai)\n  - [Custom Provider](#custom-provider)\n- [Session Management](#session-management)\n- [Events](#events)\n- [Export Formats](#export-formats)\n- [Supported Languages](#supported-languages)\n- [API Reference](#api-reference)\n- [Examples](#examples)\n- [Browser Support](#browser-support)\n- [Contributing](#contributing)\n- [License](#license)\n\n---\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **Multi-Provider Support** | Web Speech API, Deepgram, AssemblyAI, and custom providers |\n| **Real-time Transcription** | Live results with interim and final transcripts |\n| **40+ Languages** | Extensive language support across all providers |\n| **Session Management** | Full control with start, stop, pause, and resume |\n| **Voice Activity Detection** | Automatic speech detection (VAD) |\n| **Audio Recording** | Built-in recording capabilities |\n| **Export Formats** | JSON, Plain Text, SRT, VTT, CSV |\n| **TypeScript First** | Complete type definitions and IntelliSense support |\n| **Event-Driven** | Subscribe to transcription events easily |\n| **Lightweight** | ~200KB package size with zero runtime dependencies |\n| **Cross-Platform** | Works in browsers and Node.js |\n\n---\n\n## Installation\n\n```bash\n# npm\nnpm install @360labs/live-transcribe\n\n# yarn\nyarn add @360labs/live-transcribe\n\n# pnpm\npnpm add @360labs/live-transcribe\n```\n\n---\n\n## Quick Start\n\n### Basic Usage (Web Speech API)\n\n```typescript\nimport { createTranscriber, TranscriptionProvider } from '@360labs/live-transcribe';\n\n// Create a transcriber (Web Speech API - no API key required)\nconst transcriber = createTranscriber({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'en-US',\n  interimResults: true,\n});\n\n// Listen for transcription results\ntranscriber.on('transcript', (result) => {\n  if (result.isFinal) {\n    console.log('Final:', result.text);\n  } else {\n    console.log('Interim:', result.text);\n  }\n});\n\n// Handle errors\ntranscriber.on('error', (error) => {\n  console.error('Error:', error.message);\n});\n\n// Start transcribing\nawait transcriber.initialize();\nawait transcriber.start();\n\n// Stop when done\nawait transcriber.stop();\n```\n\n### Using Sessions (Recommended)\n\n```typescript\nimport { createSession, TranscriptionProvider } from '@360labs/live-transcribe';\n\n// Create a session for full control\nconst session = createSession({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'en-US',\n});\n\n// Access the provider for events\nsession.provider.on('transcript', (result) => {\n  console.log(result.text);\n\n  // Add to session for later export\n  if (result.isFinal) {\n    session.addTranscript(result);\n  }\n});\n\n// Lifecycle control\nawait session.start();\nsession.pause();    // Pause transcription\nsession.resume();   // Resume transcription\nawait session.stop();\n\n// Get results\nconst transcripts = session.getTranscripts();\nconst fullText = session.getFullText();\nconst stats = session.getStatistics();\n\n// Export in various formats\nconst srtFile = session.export('srt');\nconst jsonFile = session.export('json');\n```\n\n---\n\n## Providers\n\n### Web Speech API (Browser)\n\nThe Web Speech API is built into modern browsers and requires no API key. It's perfect for quick prototypes and applications that don't need cloud-based accuracy.\n\n```typescript\nimport { createTranscriber, TranscriptionProvider } from '@360labs/live-transcribe';\n\nconst transcriber = createTranscriber({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'en-US',\n  interimResults: true,  // Get real-time interim results\n});\n\n// Check browser support\nif (transcriber.isSupported()) {\n  await transcriber.initialize();\n  await transcriber.start();\n}\n```\n\n**Pros:**\n- No API key required\n- Free to use\n- Works offline (in some browsers)\n- Low latency\n\n**Cons:**\n- Accuracy varies by browser\n- Limited language support compared to cloud providers\n- Requires internet connection in most browsers\n\n---\n\n### Deepgram\n\n[Deepgram](https://deepgram.com) offers high-accuracy, real-time transcription with advanced features like speaker diarization and custom vocabularies.\n\n```typescript\nimport { createTranscriber, TranscriptionProvider } from '@360labs/live-transcribe';\n\nconst transcriber = createTranscriber({\n  provider: TranscriptionProvider.Deepgram,\n  apiKey: 'your-deepgram-api-key',\n  language: 'en-US',\n  model: 'nova-2',           // Latest model\n  punctuate: true,           // Auto-punctuation\n  interimResults: true,\n});\n\ntranscriber.on('transcript', (result) => {\n  console.log(result.text);\n  console.log('Confidence:', result.confidence);\n});\n\nawait transcriber.initialize();\nawait transcriber.start();\n```\n\n**Configuration Options:**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `apiKey` | string | required | Your Deepgram API key |\n| `model` | string | 'nova-2' | Model to use (nova-2, nova, enhanced, base) |\n| `language` | string | 'en-US' | Language code |\n| `punctuate` | boolean | true | Enable auto-punctuation |\n| `interimResults` | boolean | true | Enable interim results |\n| `smartFormat` | boolean | false | Enable smart formatting |\n| `diarize` | boolean | false | Enable speaker diarization |\n\n---\n\n### AssemblyAI\n\n[AssemblyAI](https://assemblyai.com) provides state-of-the-art transcription with features like automatic language detection and content moderation.\n\n```typescript\nimport { createTranscriber, TranscriptionProvider } from '@360labs/live-transcribe';\n\nconst transcriber = createTranscriber({\n  provider: TranscriptionProvider.AssemblyAI,\n  apiKey: 'your-assemblyai-api-key',\n  sampleRate: 16000,\n});\n\ntranscriber.on('transcript', (result) => {\n  console.log(result.text);\n});\n\nawait transcriber.initialize();\nawait transcriber.start();\n```\n\n**Configuration Options:**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `apiKey` | string | required | Your AssemblyAI API key |\n| `sampleRate` | number | 16000 | Audio sample rate in Hz |\n| `wordBoost` | string[] | [] | Words to boost recognition |\n\n---\n\n### Custom Provider\n\nYou can create custom providers by extending the `BaseTranscriber` class:\n\n```typescript\nimport { BaseTranscriber, TranscriptionConfig, SessionState } from '@360labs/live-transcribe';\n\nclass MyCustomProvider extends BaseTranscriber {\n  private recognition: any;\n\n  constructor(config: TranscriptionConfig) {\n    super(config);\n  }\n\n  isSupported(): boolean {\n    return true; // Check if your provider is available\n  }\n\n  async initialize(): Promise<void> {\n    // Initialize your provider\n    this.setState(SessionState.INITIALIZING);\n  }\n\n  async start(): Promise<void> {\n    this.setState(SessionState.ACTIVE);\n    this.emit('start');\n    // Start transcription\n  }\n\n  async stop(): Promise<void> {\n    this.setState(SessionState.STOPPED);\n    this.emit('stop');\n    // Stop transcription\n  }\n\n  pause(): void {\n    this.setState(SessionState.PAUSED);\n    this.emit('pause');\n  }\n\n  resume(): void {\n    this.setState(SessionState.ACTIVE);\n    this.emit('resume');\n  }\n\n  sendAudio(audioData: ArrayBuffer): void {\n    // Send audio to your provider\n  }\n\n  async cleanup(): Promise<void> {\n    // Clean up resources\n  }\n}\n```\n\n---\n\n## Session Management\n\nSessions provide a higher-level API for managing transcription with built-in transcript storage and export capabilities.\n\n```typescript\nimport { createSession, SessionManager, TranscriptionProvider } from '@360labs/live-transcribe';\n\n// Single session\nconst session = createSession({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'en-US',\n});\n\n// Session properties\nconsole.log(session.id);        // Unique session ID\nconsole.log(session.getState()); // Current state\n\n// Multiple sessions with SessionManager\nconst manager = new SessionManager();\n\nconst session1 = manager.createSession({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'en-US',\n});\n\nconst session2 = manager.createSession({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'es-ES',\n});\n\n// Get all sessions\nconst allSessions = manager.getAllSessions();\n\n// Get session by ID\nconst session = manager.getSession('session-id');\n\n// Get active sessions\nconst activeSessions = manager.getActiveSessions();\n```\n\n### Session States\n\n```typescript\nimport { SessionState } from '@360labs/live-transcribe';\n\n// Available states\nSessionState.IDLE         // Initial state\nSessionState.INITIALIZING // Provider initializing\nSessionState.ACTIVE       // Transcription in progress\nSessionState.PAUSED       // Transcription paused\nSessionState.STOPPING     // Stopping transcription\nSessionState.STOPPED      // Transcription stopped\nSessionState.ERROR        // Error occurred\n```\n\n---\n\n## Events\n\nSubscribe to events for real-time updates:\n\n```typescript\nconst transcriber = createTranscriber({ /* config */ });\n\n// Transcript events\ntranscriber.on('transcript', (result) => {\n  console.log('Text:', result.text);\n  console.log('Is Final:', result.isFinal);\n  console.log('Confidence:', result.confidence);\n  console.log('Timestamp:', result.timestamp);\n});\n\ntranscriber.on('final', (result) => {\n  // Only final transcripts\n  console.log('Final transcript:', result.text);\n});\n\ntranscriber.on('interim', (result) => {\n  // Only interim transcripts\n  console.log('Interim:', result.text);\n});\n\n// Lifecycle events\ntranscriber.on('start', () => {\n  console.log('Transcription started');\n});\n\ntranscriber.on('stop', () => {\n  console.log('Transcription stopped');\n});\n\ntranscriber.on('pause', () => {\n  console.log('Transcription paused');\n});\n\ntranscriber.on('resume', () => {\n  console.log('Transcription resumed');\n});\n\n// State changes\ntranscriber.on('stateChange', (state) => {\n  console.log('State changed to:', state);\n});\n\n// Language changes\ntranscriber.on('languageChange', (change) => {\n  console.log(`Language: ${change.from} -> ${change.to}`);\n});\n\n// Error handling\ntranscriber.on('error', (error) => {\n  console.error('Error code:', error.code);\n  console.error('Error message:', error.message);\n  console.error('Provider:', error.provider);\n});\n\n// Remove listeners\ntranscriber.off('transcript', myHandler);\ntranscriber.removeAllListeners();\n```\n\n### TranscriptionResult Object\n\n```typescript\ninterface TranscriptionResult {\n  text: string;           // Transcribed text\n  isFinal: boolean;       // Is this a final result?\n  confidence?: number;    // Confidence score (0-1)\n  timestamp: number;      // Unix timestamp\n  speaker?: string;       // Speaker ID (if diarization enabled)\n  language?: string;      // Detected language\n  words?: Word[];         // Word-level timing\n}\n\ninterface Word {\n  text: string;\n  start: number;  // Start time in ms\n  end: number;    // End time in ms\n  confidence?: number;\n}\n```\n\n---\n\n## Export Formats\n\nExport transcripts in multiple formats:\n\n```typescript\nconst session = createSession({ /* config */ });\n\n// Add transcripts during session\nsession.provider.on('transcript', (result) => {\n  if (result.isFinal) {\n    session.addTranscript(result);\n  }\n});\n\n// After transcription, export in various formats\n\n// JSON - Full data with metadata\nconst jsonExport = session.export('json');\nconsole.log(jsonExport.data);     // JSON string\nconsole.log(jsonExport.filename); // 'transcript-{id}.json'\nconsole.log(jsonExport.mimeType); // 'application/json'\n\n// Plain Text - Just the text\nconst textExport = session.export('text');\n// Output: \"Hello world. How are you today?\"\n\n// SRT - SubRip subtitles\nconst srtExport = session.export('srt');\n// Output:\n// 1\n// 00:00:01,000 --> 00:00:03,500\n// Hello world.\n//\n// 2\n// 00:00:04,000 --> 00:00:06,500\n// How are you today?\n\n// VTT - WebVTT subtitles\nconst vttExport = session.export('vtt');\n// Output:\n// WEBVTT\n//\n// 00:00:01.000 --> 00:00:03.500\n// Hello world.\n//\n// 00:00:04.000 --> 00:00:06.500\n// How are you today?\n\n// CSV - Spreadsheet format\nconst csvExport = session.export('csv');\n// Output: timestamp,text,confidence,isFinal\n// 1234567890,Hello world,0.95,true\n\n// Download in browser\nfunction downloadTranscript(format: string) {\n  const exported = session.export(format);\n  const blob = new Blob([exported.data], { type: exported.mimeType });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = exported.filename;\n  a.click();\n  URL.revokeObjectURL(url);\n}\n```\n\n---\n\n## Supported Languages\n\nThe library supports 40+ languages. Language support varies by provider.\n\n### Web Speech API Languages\n\n| Language | Code | Language | Code |\n|----------|------|----------|------|\n| English (US) | `en-US` | English (UK) | `en-GB` |\n| English (Australia) | `en-AU` | English (India) | `en-IN` |\n| Spanish (Spain) | `es-ES` | Spanish (Mexico) | `es-MX` |\n| French (France) | `fr-FR` | French (Canada) | `fr-CA` |\n| German | `de-DE` | Italian | `it-IT` |\n| Portuguese (Brazil) | `pt-BR` | Portuguese (Portugal) | `pt-PT` |\n| Chinese (Simplified) | `zh-CN` | Chinese (Traditional) | `zh-TW` |\n| Japanese | `ja-JP` | Korean | `ko-KR` |\n| Hindi | `hi-IN` | Arabic (Saudi Arabia) | `ar-SA` |\n| Russian | `ru-RU` | Dutch | `nl-NL` |\n| Polish | `pl-PL` | Turkish | `tr-TR` |\n| Thai | `th-TH` | Vietnamese | `vi-VN` |\n| Indonesian | `id-ID` | Hebrew | `he-IL` |\n| Czech | `cs-CZ` | Greek | `el-GR` |\n| Swedish | `sv-SE` | Danish | `da-DK` |\n| Finnish | `fi-FI` | Norwegian | `no-NO` |\n| Ukrainian | `uk-UA` | Romanian | `ro-RO` |\n| Hungarian | `hu-HU` | Malay | `ms-MY` |\n\n### Setting Language\n\n```typescript\n// At creation\nconst transcriber = createTranscriber({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'es-ES', // Spanish (Spain)\n});\n\n// Or use session\nconst session = createSession({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'fr-FR', // French\n});\n```\n\n### Changing Language Mid-Transcript\n\nYou can change the language during an active transcription session. The library automatically handles stopping and restarting the transcription with the new language:\n\n```typescript\nconst session = createSession({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'en-US',\n});\n\nawait session.start();\n\n// User switches to Spanish mid-conversation\nawait session.setLanguage('es-ES');\n// Transcription continues seamlessly in Spanish\n\n// Switch to French\nawait session.setLanguage('fr-FR');\n\n// Get current language\nconsole.log(session.getLanguage()); // 'fr-FR'\n```\n\n**With Transcriber Directly:**\n\n```typescript\nconst transcriber = createTranscriber({\n  provider: TranscriptionProvider.WebSpeechAPI,\n  language: 'en-US',\n});\n\n// Listen for language changes\ntranscriber.on('languageChange', (change) => {\n  console.log(`Language changed from ${change.from} to ${change.to}`);\n});\n\nawait transcriber.initialize();\nawait transcriber.start();\n\n// Change language while recording\nawait transcriber.setLanguage('de-DE');\n\n// Get current language\nconsole.log(transcriber.getLanguage()); // 'de-DE'\n```\n\n**React Example with Language Selector:**\n\n```tsx\nfunction TranscriptionWithLanguageSwitch() {\n  const [language, setLanguage] = useState('en-US');\n  const sessionRef = useRef<TranscriptionSession | null>(null);\n\n  const changeLanguage = async (newLang: string) => {\n    setLanguage(newLang);\n    if (sessionRef.current) {\n      await sessionRef.current.setLanguage(newLang);\n    }\n  };\n\n  return (\n    <div>\n      <select value={language} onChange={(e) => changeLanguage(e.target.value)}>\n        <option value=\"en-US\">English</option>\n        <option value=\"es-ES\">Spanish</option>\n        <option value=\"fr-FR\">French</option>\n        <option value=\"de-DE\">German</option>\n        <option value=\"ja-JP\">Japanese</option>\n      </select>\n      {/* Transcription continues without interruption */}\n    </div>\n  );\n}\n```\n\n---\n\n## API Reference\n\n### createTranscriber(config)\n\nCreates a new transcriber instance.\n\n```typescript\nfunction createTranscriber(config: TranscriptionConfig): ITranscriptionProvider;\n```\n\n**Config Options:**\n\n| Option | Type | Required | Default | Description |\n|--------|------|----------|---------|-------------|\n| `provider` | TranscriptionProvider | Yes | - | Provider to use |\n| `apiKey` | string | For cloud | - | API key for cloud providers |\n| `language` | string | No | 'en-US' | Language code |\n| `interimResults` | boolean | No | true | Enable interim results |\n| `punctuation` | boolean | No | true | Enable auto-punctuation |\n| `profanityFilter` | boolean | No | false | Filter profanity |\n\n### createSession(config)\n\nCreates a new transcription session.\n\n```typescript\nfunction createSession(config: TranscriptionConfig): TranscriptionSession;\n```\n\n### TranscriptionSession\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `start()` | Promise<void> | Start transcription |\n| `stop()` | Promise<void> | Stop transcription |\n| `pause()` | void | Pause transcription |\n| `resume()` | void | Resume transcription |\n| `getState()` | SessionState | Get current state |\n| `getTranscripts(finalOnly?)` | TranscriptionResult[] | Get all transcripts |\n| `getFullText()` | string | Get concatenated text |\n| `getStatistics()` | SessionStatistics | Get session stats |\n| `addTranscript(result)` | void | Add a transcript |\n| `export(format)` | ExportResult | Export transcripts |\n| `setLanguage(language)` | Promise<void> | Change language mid-session |\n| `getLanguage()` | string | Get current language |\n\n### SessionStatistics\n\n```typescript\ninterface SessionStatistics {\n  wordCount: number;\n  transcriptCount: number;\n  duration: number;\n  averageConfidence: number;\n}\n```\n\n---\n\n## Examples\n\n### React Integration\n\n```tsx\nimport React, { useState, useEffect, useRef } from 'react';\nimport { createSession, TranscriptionProvider, TranscriptionSession } from '@360labs/live-transcribe';\n\nfunction TranscriptionComponent() {\n  const [isRecording, setIsRecording] = useState(false);\n  const [transcript, setTranscript] = useState('');\n  const sessionRef = useRef<TranscriptionSession | null>(null);\n\n  useEffect(() => {\n    return () => {\n      sessionRef.current?.stop();\n    };\n  }, []);\n\n  const startRecording = async () => {\n    const session = createSession({\n      provider: TranscriptionProvider.WebSpeechAPI,\n      language: 'en-US',\n    });\n\n    session.provider.on('transcript', (result) => {\n      if (result.isFinal) {\n        setTranscript(prev => prev + ' ' + result.text);\n        session.addTranscript(result);\n      }\n    });\n\n    sessionRef.current = session;\n    await session.start();\n    setIsRecording(true);\n  };\n\n  const stopRecording = async () => {\n    await sessionRef.current?.stop();\n    setIsRecording(false);\n  };\n\n  return (\n    <div>\n      <button onClick={isRecording ? stopRecording : startRecording}>\n        {isRecording ? 'Stop' : 'Start'} Recording\n      </button>\n      <p>{transcript}</p>\n    </div>\n  );\n}\n```\n\n### Vue Integration\n\n```vue\n<template>\n  <div>\n    <button @click=\"toggleRecording\">\n      {{ isRecording ? 'Stop' : 'Start' }} Recording\n    </button>\n    <p>{{ transcript }}</p>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onUnmounted } from 'vue';\nimport { createSession, TranscriptionProvider } from '@360labs/live-transcribe';\n\nconst isRecording = ref(false);\nconst transcript = ref('');\nlet session: any = null;\n\nconst toggleRecording = async () => {\n  if (isRecording.value) {\n    await session?.stop();\n    isRecording.value = false;\n  } else {\n    session = createSession({\n      provider: TranscriptionProvider.WebSpeechAPI,\n      language: 'en-US',\n    });\n\n    session.provider.on('transcript', (result: any) => {\n      if (result.isFinal) {\n        transcript.value += ' ' + result.text;\n      }\n    });\n\n    await session.start();\n    isRecording.value = true;\n  }\n};\n\nonUnmounted(() => {\n  session?.stop();\n});\n</script>\n```\n\n### Node.js with Deepgram\n\n```typescript\nimport { createTranscriber, TranscriptionProvider } from '@360labs/live-transcribe';\nimport { createReadStream } from 'fs';\n\nconst transcriber = createTranscriber({\n  provider: TranscriptionProvider.Deepgram,\n  apiKey: process.env.DEEPGRAM_API_KEY,\n  language: 'en-US',\n});\n\ntranscriber.on('transcript', (result) => {\n  console.log(result.text);\n});\n\nawait transcriber.initialize();\nawait transcriber.start();\n\n// Send audio data\nconst audioStream = createReadStream('audio.wav');\naudioStream.on('data', (chunk) => {\n  transcriber.sendAudio(chunk);\n});\n\naudioStream.on('end', async () => {\n  await transcriber.stop();\n});\n```\n\n---\n\n## Browser Support\n\n| Browser | Web Speech API | WebSocket (Cloud) |\n|---------|---------------|-------------------|\n| Chrome 33+ | ✅ Full | ✅ Full |\n| Edge 79+ | ✅ Full | ✅ Full |\n| Safari 14.1+ | ✅ Partial | ✅ Full |\n| Firefox | ❌ | ✅ Full |\n| Opera 20+ | ✅ Full | ✅ Full |\n\n**Note:** Web Speech API requires an internet connection in most browsers as it uses cloud-based recognition.\n\n---\n\n## Error Handling\n\n```typescript\nimport { TranscriptionError, ErrorCode } from '@360labs/live-transcribe';\n\ntranscriber.on('error', (error: TranscriptionError) => {\n  switch (error.code) {\n    case ErrorCode.MICROPHONE_ACCESS_DENIED:\n      console.log('Please allow microphone access');\n      break;\n    case ErrorCode.NETWORK_ERROR:\n      console.log('Network error - check your connection');\n      break;\n    case ErrorCode.AUTHENTICATION_FAILED:\n      console.log('Invalid API key');\n      break;\n    case ErrorCode.UNSUPPORTED_BROWSER:\n      console.log('Browser not supported');\n      break;\n    default:\n      console.log('Error:', error.message);\n  }\n});\n```\n\n### Error Codes\n\n| Code | Description |\n|------|-------------|\n| `INITIALIZATION_FAILED` | Provider failed to initialize |\n| `AUTHENTICATION_FAILED` | Invalid or missing API key |\n| `NETWORK_ERROR` | Network connection error |\n| `MICROPHONE_ACCESS_DENIED` | Microphone permission denied |\n| `UNSUPPORTED_BROWSER` | Browser doesn't support required APIs |\n| `INVALID_CONFIG` | Invalid configuration provided |\n| `PROVIDER_ERROR` | Provider-specific error |\n| `UNKNOWN_ERROR` | Unknown error occurred |\n\n---\n\n## Audio Processing Utilities\n\nThe library includes audio processing utilities:\n\n```typescript\nimport { AudioProcessor } from '@360labs/live-transcribe';\n\n// Convert Float32 to Int16 (for sending to APIs)\nconst int16Data = AudioProcessor.convertFloat32ToInt16(float32Array);\n\n// Convert Int16 to Float32\nconst float32Data = AudioProcessor.convertInt16ToFloat32(int16Array);\n\n// Resample audio\nconst resampled = AudioProcessor.resampleBuffer(buffer, 44100, 16000);\n\n// Normalize audio levels\nconst normalized = AudioProcessor.normalizeBuffer(buffer);\n\n// Apply gain\nconst amplified = AudioProcessor.applyGain(buffer, 1.5);\n\n// Mix two audio buffers\nconst mixed = AudioProcessor.mixBuffers(buffer1, buffer2, 0.5);\n```\n\n---\n\n## Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](./CONTRIBUTING.md) for details.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n---\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.\n\n---\n\n## Support\n\n- **Website:** [360labs.dev](https://360labs.dev)\n- **Issues:** [GitHub Issues](https://github.com/100rabhkr/live-transcribe/issues)\n- **Discussions:** [GitHub Discussions](https://github.com/100rabhkr/live-transcribe/discussions)\n\n---\n\n## About 360labs\n\n[360labs](https://360labs.dev) builds AI-powered developer tools and APIs. We focus on creating simple, powerful libraries that help developers build amazing products faster.\n\n**Other products by 360labs:**\n- Visit [360labs.dev](https://360labs.dev) to see all our tools and APIs\n\n---\n\n**Made with ❤️ by [360labs](https://360labs.dev)**\n","readmeFilename":"README.md"}