{"_id":"@ainative/ai-kit-video","_rev":"4-4710752e226f1c0a33e4f35d4ddab0fc","name":"@ainative/ai-kit-video","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@ainative/ai-kit-video","version":"0.1.0","keywords":["ainative","ai","llm","typescript","video","transcription","whisper","recording","media","ai-kit","screen-recording","camera-recording","audio-recording","video-processing","audio-transcription","openai","mediastream","webrtc","screen-capture","webcam","voice-to-text","speech-to-text","picture-in-picture","pip","noise-cancellation","video-capture","browser-recording","media-recorder","audio-processing","video-streaming","video-player","react-video-player","programmatic-video-player","ainative-video-player","video-playback","custom-video-player","html5-video","video-controls"],"author":{"name":"AINative Studio"},"license":"MIT","_id":"@ainative/ai-kit-video@0.1.0","maintainers":[{"name":"ainative-studio","email":"toby@rely.ventures"}],"homepage":"https://ainative.studio/ai-kit","bugs":{"url":"https://github.com/AINative-Studio/ai-kit/issues"},"dist":{"shasum":"b915c55d4bbd54ba31a08f3563511dbfe2e1b169","tarball":"https://registry.npmjs.org/@ainative/ai-kit-video/-/ai-kit-video-0.1.0.tgz","fileCount":15,"integrity":"sha512-Ko1eQ9MRG/Rg9EkDxpFTAamBvUTmPvLaJIjG166qkW9giKifPd9PUOpMUt3mMk89kZ7W/yBPe74o89T/ZHBu+g==","signatures":[{"sig":"MEUCIQCybH/AS1TnbJpHchTiEhgkivPCviHi3rrZhRvZ4fBJiQIgPMHzodp/eb7rK8TL88e1wZwxLAYh//BRe7vEAIXbJec=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":350485},"main":"./dist/index.js","_from":"file:ainative-ai-kit-video-0.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./recording":{"types":"./dist/recording/index.d.ts","import":"./dist/recording/index.mjs","require":"./dist/recording/index.js"},"./processing":{"types":"./dist/processing/index.d.ts","import":"./dist/processing/index.mjs","require":"./dist/processing/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"ainative-studio","email":"toby@rely.ventures"},"_resolved":"/private/var/folders/pm/zvd9fdyd61g_7jdvfp9vzcw00000gn/T/7dedb9fcead9d874571410e431028980/ainative-ai-kit-video-0.1.0.tgz","_integrity":"sha512-Ko1eQ9MRG/Rg9EkDxpFTAamBvUTmPvLaJIjG166qkW9giKifPd9PUOpMUt3mMk89kZ7W/yBPe74o89T/ZHBu+g==","repository":{"url":"git+https://github.com/AINative-Studio/ai-kit.git","type":"git","directory":"packages/video"},"_npmVersion":"10.9.4","description":"AI Kit - Video processing utilities including recording and transcription","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.22.4","openai":"^4.20.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^4.0.18","typescript":"^5.3.0","@types/node":"^20.10.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/ai-kit-video_0.1.0_1770534860983_0.1994514181892968","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ainative/ai-kit-video","version":"0.1.1","keywords":["ainative","ai","llm","typescript","video","transcription","whisper","recording","media","ai-kit","screen-recording","camera-recording","audio-recording","video-processing","audio-transcription","openai","mediastream","webrtc","screen-capture","webcam","voice-to-text","speech-to-text","picture-in-picture","pip","noise-cancellation","video-capture","browser-recording","media-recorder","audio-processing","video-streaming","video-player","react-video-player","programmatic-video-player","ainative-video-player","video-playback","custom-video-player","html5-video","video-controls"],"author":{"name":"AINative Studio"},"license":"MIT","_id":"@ainative/ai-kit-video@0.1.1","maintainers":[{"name":"ainative-studio","email":"toby@rely.ventures"}],"homepage":"https://ainative.studio/ai-kit","bugs":{"url":"https://github.com/AINative-Studio/ai-kit/issues"},"dist":{"shasum":"ab07ff7106db9e37fb902e7b9aa02b8a2f2ca118","tarball":"https://registry.npmjs.org/@ainative/ai-kit-video/-/ai-kit-video-0.1.1.tgz","fileCount":15,"integrity":"sha512-TjQws4djqNug6D7elvRmaUUxXYdj5ANXBBf4F0IJru8gYN5rlpvom3EzK8/DGcFZ3arGthzc58fvjAYgnVhBIA==","signatures":[{"sig":"MEYCIQDl2ISmDL/xI+5UxxomoL3J1c2PPTqoxALJeBfysmkiYwIhANseqX1oSyykxStTgsxa2RvH+99DOqj9m1XKs5l5hwXr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":351050},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./recording":{"types":"./dist/recording/index.d.ts","import":"./dist/recording/index.mjs","require":"./dist/recording/index.js"},"./processing":{"types":"./dist/processing/index.d.ts","import":"./dist/processing/index.mjs","require":"./dist/processing/index.js"}},"gitHead":"20c46435e47c7b04321440147c853677f79c7982","scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:all":"vitest run && playwright test","test:watch":"vitest","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage","test:integration":"playwright test","test:integration:ui":"playwright test --ui","test:integration:headed":"playwright test --headed","test:integration:mobile":"playwright test --project=mobile-chrome --project=mobile-safari","test:integration:report":"playwright show-report","test:integration:webkit":"playwright test --project=webkit","test:integration:firefox":"playwright test --project=firefox","test:integration:chromium":"playwright test --project=chromium"},"_npmUser":{"name":"ainative-studio","email":"toby@rely.ventures"},"repository":{"url":"git+https://github.com/AINative-Studio/ai-kit.git","type":"git","directory":"packages/video"},"_npmVersion":"10.9.4","description":"AI Kit - Video processing utilities including recording and transcription","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.22.4","openai":"^4.20.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^4.0.18","typescript":"^5.3.0","@types/node":"^20.10.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/ai-kit-video_0.1.1_1770580044493_0.3933098097766121","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@ainative/ai-kit-video","version":"0.1.2","keywords":["ainative","ai","llm","typescript","video","transcription","whisper","recording","media","ai-kit","screen-recording","camera-recording","audio-recording","video-processing","audio-transcription","openai","mediastream","webrtc","screen-capture","webcam","voice-to-text","speech-to-text","picture-in-picture","pip","noise-cancellation","video-capture","browser-recording","media-recorder","audio-processing","video-streaming","video-player","react-video-player","programmatic-video-player","ainative-video-player","video-playback","custom-video-player","html5-video","video-controls"],"author":{"name":"AINative Studio"},"license":"MIT","_id":"@ainative/ai-kit-video@0.1.2","maintainers":[{"name":"ainative-studio","email":"toby@rely.ventures"}],"homepage":"https://ainative.studio/ai-kit","bugs":{"url":"https://github.com/AINative-Studio/ai-kit/issues"},"dist":{"shasum":"c96f7fde2490c126ef0dee06019cba5c2ad596ed","tarball":"https://registry.npmjs.org/@ainative/ai-kit-video/-/ai-kit-video-0.1.2.tgz","fileCount":15,"integrity":"sha512-RbsIF7flq4qr3V2UjEIbFheuWIXGj45queBQtN8WRKXipiJRa9DArc4mt+/cM0h6mOunAWVnvHae5+VyiOpQ3Q==","signatures":[{"sig":"MEUCIGNNqyEm8sQWm/Y+PXfeDrY49D/ljVLtjjtmS/fA1rjUAiEA5iZ0hxdOqe5ZDzwDI/19I+6hJjdEdimfc0W65y7hHlY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":355852},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./recording":{"types":"./dist/recording/index.d.ts","import":"./dist/recording/index.mjs","require":"./dist/recording/index.js"},"./processing":{"types":"./dist/processing/index.d.ts","import":"./dist/processing/index.mjs","require":"./dist/processing/index.js"}},"gitHead":"be8621fb43716d44c5d4a0ca16ca09494dab356f","scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:all":"vitest run && playwright test","test:watch":"vitest","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage","test:integration":"playwright test","test:integration:ui":"playwright test --ui","test:integration:headed":"playwright test --headed","test:integration:mobile":"playwright test --project=mobile-chrome --project=mobile-safari","test:integration:report":"playwright show-report","test:integration:webkit":"playwright test --project=webkit","test:integration:firefox":"playwright test --project=firefox","test:integration:chromium":"playwright test --project=chromium"},"_npmUser":{"name":"ainative-studio","email":"toby@rely.ventures"},"repository":{"url":"git+https://github.com/AINative-Studio/ai-kit.git","type":"git","directory":"packages/video"},"_npmVersion":"10.9.4","description":"AI Kit - Video processing utilities including recording and transcription","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.22.4","openai":"^4.20.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^4.0.18","typescript":"^5.3.0","@types/node":"^20.10.0","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/ai-kit-video_0.1.2_1780889755782_0.6389634619157796","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@ainative/ai-kit-video","version":"0.1.3","description":"AI Kit - Video processing utilities including recording and transcription","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./recording":{"types":"./dist/recording/index.d.ts","import":"./dist/recording/index.mjs","require":"./dist/recording/index.js"},"./processing":{"types":"./dist/processing/index.d.ts","import":"./dist/processing/index.mjs","require":"./dist/processing/index.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","test:integration":"playwright test","test:integration:ui":"playwright test --ui","test:integration:headed":"playwright test --headed","test:integration:chromium":"playwright test --project=chromium","test:integration:firefox":"playwright test --project=firefox","test:integration:webkit":"playwright test --project=webkit","test:integration:mobile":"playwright test --project=mobile-chrome --project=mobile-safari","test:integration:report":"playwright show-report","test:all":"vitest run && playwright test","type-check":"tsc --noEmit","lint":"eslint src","clean":"rm -rf dist"},"keywords":["ainative","ai","llm","typescript","video","transcription","whisper","recording","media","ai-kit","screen-recording","camera-recording","audio-recording","video-processing","audio-transcription","openai","mediastream","webrtc","screen-capture","webcam","voice-to-text","speech-to-text","picture-in-picture","pip","noise-cancellation","video-capture","browser-recording","media-recorder","audio-processing","video-streaming","video-player","react-video-player","programmatic-video-player","ainative-video-player","video-playback","custom-video-player","html5-video","video-controls"],"author":{"name":"AINative Studio"},"license":"MIT","homepage":"https://ainative.studio/ai-kit","repository":{"type":"git","url":"git+https://github.com/AINative-Studio/ai-kit.git","directory":"packages/video"},"bugs":{"url":"https://github.com/AINative-Studio/ai-kit/issues"},"dependencies":{"openai":"^4.20.0","zod":"^3.22.4"},"devDependencies":{"@types/node":"^20.10.0","@vitest/coverage-v8":"^4.0.18","tsup":"^8.0.1","typescript":"^5.3.0","vitest":"^4.0.18"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"engines":{"node":">=18.0.0"},"_id":"@ainative/ai-kit-video@0.1.3","gitHead":"262c8692815737be564edf0833a8424f82d8b226","_nodeVersion":"22.21.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-A6Pb0rbp863Nz02hGhHKmkDUilnuBZiOK9nddvNIHSwujrM+O7ITaSTVCL1OLLfCQbBwx/kTMjB6EtjuHmEvug==","shasum":"3d1b86140bcfcffa305a88635fd26a42098e1b87","tarball":"https://registry.npmjs.org/@ainative/ai-kit-video/-/ai-kit-video-0.1.3.tgz","fileCount":15,"unpackedSize":355852,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD+gSV9ikyrw3e/9qv6/hOrDSHXyBh7nc/CWVXSuuz2oAIhAPs38FK6cS2w1hS6FNR71R1G6cEsAWbmi1msutje4wcM"}]},"_npmUser":{"name":"ainative-studio","email":"toby@rely.ventures"},"directories":{},"maintainers":[{"name":"ainative-studio","email":"toby@rely.ventures"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-kit-video_0.1.3_1780890286659_0.6038701164032412"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-08T07:14:20.914Z","modified":"2026-06-08T03:44:46.927Z","0.1.0":"2026-02-08T07:14:21.134Z","0.1.1":"2026-02-08T19:47:24.642Z","0.1.2":"2026-06-08T03:35:55.917Z","0.1.3":"2026-06-08T03:44:46.797Z"},"bugs":{"url":"https://github.com/AINative-Studio/ai-kit/issues"},"author":{"name":"AINative Studio"},"license":"MIT","homepage":"https://ainative.studio/ai-kit","keywords":["ainative","ai","llm","typescript","video","transcription","whisper","recording","media","ai-kit","screen-recording","camera-recording","audio-recording","video-processing","audio-transcription","openai","mediastream","webrtc","screen-capture","webcam","voice-to-text","speech-to-text","picture-in-picture","pip","noise-cancellation","video-capture","browser-recording","media-recorder","audio-processing","video-streaming","video-player","react-video-player","programmatic-video-player","ainative-video-player","video-playback","custom-video-player","html5-video","video-controls"],"repository":{"type":"git","url":"git+https://github.com/AINative-Studio/ai-kit.git","directory":"packages/video"},"description":"AI Kit - Video processing utilities including recording and transcription","maintainers":[{"name":"ainative-studio","email":"toby@rely.ventures"}],"readme":"# @ainative/ai-kit-video\n\nVideo processing utilities for AI Kit, including screen recording, camera recording, audio processing, and AI-powered transcription using OpenAI's Whisper API.\n\n[![npm version](https://img.shields.io/npm/v/@ainative/ai-kit-video.svg)](https://www.npmjs.com/package/@ainative/ai-kit-video)\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\n## Features\n\n### Recording\n- **Screen Recording** - Capture screen with customizable settings (quality, frame rate, audio)\n- **Camera Recording** - Record from webcam with MediaStream API\n- **Audio Recording** - Record audio with noise cancellation and processing\n- **Picture-in-Picture** - Composite camera feed over screen recording\n\n### Processing\n- **Audio Transcription** - AI-powered transcription using OpenAI Whisper\n- **Text Formatting** - Clean and format transcribed text\n- **Highlight Detection** - Detect significant moments in video\n- **Noise Processing** - Reduce background noise in audio\n\n### Observability\n- **Instrumented Recording** - Built-in performance metrics and event logging\n- **Correlation IDs** - Track recordings across your application\n- **Performance Metrics** - Monitor bitrate, file size, and duration\n\n## Installation\n\n```bash\nnpm install @ainative/ai-kit-video\n```\n\n## Usage\n\n### Screen Recording\n\n```typescript\nimport { ScreenRecorder } from '@ainative/ai-kit-video/recording'\n\nconst recorder = new ScreenRecorder({\n  mimeType: 'video/webm;codecs=vp9',\n  videoBitsPerSecond: 2500000,\n  audioBitsPerSecond: 128000\n})\n\n// Start recording\nconst stream = await recorder.getStream()\nawait recorder.start()\n\n// Stop and get recording\nawait recorder.stop()\nconst blob = recorder.getRecordingBlob()\nconst url = recorder.getRecordingURL()\n\n// Download the recording\nconst link = document.createElement('a')\nlink.href = url\nlink.download = 'screen-recording.webm'\nlink.click()\n\n// Clean up\nrecorder.revokeURL(url)\n```\n\n### Camera Recording\n\n```typescript\nimport { CameraRecorder } from '@ainative/ai-kit-video/recording'\n\nconst recorder = new CameraRecorder({\n  video: {\n    width: { ideal: 1920 },\n    height: { ideal: 1080 },\n    frameRate: { ideal: 30 }\n  },\n  audio: true\n})\n\nconst stream = await recorder.getStream()\nawait recorder.start()\n\n// Display preview\nconst videoElement = document.querySelector('video')\nvideoElement.srcObject = stream\n\n// Stop and save\nawait recorder.stop()\nconst blob = recorder.getRecordingBlob()\n```\n\n### Audio Transcription with Whisper\n\n```typescript\nimport { transcribeAudio } from '@ainative/ai-kit-video/processing'\n\n// Transcribe audio file\nconst result = await transcribeAudio(audioFile, {\n  apiKey: process.env.OPENAI_API_KEY,\n  language: 'en',\n  response_format: 'verbose_json',\n  timestamp_granularities: ['segment', 'word']\n})\n\nconsole.log(result.text)\nconsole.log(result.segments) // Segment-level timestamps\nconsole.log(result.words)    // Word-level timestamps\n```\n\n### Text Formatting\n\n```typescript\nimport { TextFormatter } from '@ainative/ai-kit-video/processing'\n\nconst formatter = new TextFormatter({\n  removeFillerWords: true,\n  correctPunctuation: true,\n  capitalizeFirstWord: true\n})\n\nconst formatted = formatter.format(transcribedText)\nconsole.log(formatted)\n```\n\n### Noise Cancellation\n\n```typescript\nimport { NoiseProcessor } from '@ainative/ai-kit-video/recording'\n\nconst processor = new NoiseProcessor({\n  noiseReduction: 0.8,\n  autoGain: true\n})\n\n// Process audio stream\nconst cleanStream = await processor.process(audioStream)\n```\n\n### Instrumented Recording with Observability\n\n```typescript\nimport { InstrumentedScreenRecorder } from '@ainative/ai-kit-video/recording'\n\nconst recorder = new InstrumentedScreenRecorder({\n  correlationId: 'user-session-123',\n  logger: customLogger,\n  enablePerformanceMetrics: true\n})\n\n// All events are logged with correlation ID\nrecorder.on('recording_started', (event) => {\n  console.log(`Recording started: ${event.recordingId}`)\n  console.log(`Correlation: ${event.correlationId}`)\n})\n\nrecorder.on('performance_metrics', (metrics) => {\n  console.log(`Bitrate: ${metrics.avgBitrate}`)\n  console.log(`File size: ${metrics.fileSize}`)\n})\n\nawait recorder.start()\n```\n\n### Picture-in-Picture Composite\n\n```typescript\nimport { PiPCompositor } from '@ainative/ai-kit-video/recording'\n\nconst compositor = new PiPCompositor({\n  position: 'bottom-right',\n  size: { width: 320, height: 180 },\n  borderRadius: 8,\n  border: '2px solid white'\n})\n\n// Combine screen and camera\nconst screenStream = await screenRecorder.getStream()\nconst cameraStream = await cameraRecorder.getStream()\n\nconst composite = compositor.composite(screenStream, cameraStream)\n```\n\n## API Reference\n\n### Recording Classes\n\n#### `ScreenRecorder`\n- `getStream(): Promise<MediaStream>` - Get display media stream\n- `start(): Promise<void>` - Start recording\n- `stop(): Promise<void>` - Stop recording\n- `pause(): void` - Pause recording\n- `resume(): void` - Resume recording\n- `getRecordingBlob(): Blob` - Get recorded video as Blob\n- `getRecordingURL(): string` - Get Blob URL for download\n- `revokeURL(url: string): void` - Revoke Blob URL to free memory\n\n#### `CameraRecorder`\n- Same API as ScreenRecorder\n- Automatically cleans up MediaStream on page unload\n- Prevents memory leaks with proper resource disposal\n\n#### `AudioRecorder`\n- Record audio only with customizable settings\n- Built-in noise reduction\n- Auto-gain control\n\n#### `InstrumentedScreenRecorder`\n- Extends ScreenRecorder with observability\n- Emits performance metrics and lifecycle events\n- Supports correlation IDs for distributed tracing\n\n### Processing Functions\n\n#### `transcribeAudio(file, options)`\nTranscribe audio using OpenAI Whisper API.\n\n**Options:**\n- `apiKey` (required) - OpenAI API key\n- `language` - ISO-639-1 language code (e.g., 'en', 'es')\n- `prompt` - Guide the model's style or terminology\n- `response_format` - 'json' | 'text' | 'srt' | 'verbose_json' | 'vtt'\n- `temperature` - Sampling temperature (0-1)\n- `timestamp_granularities` - ['word', 'segment']\n\n**Returns:** `TranscriptionResult`\n- `text` - Full transcription\n- `language` - Detected language (verbose_json only)\n- `duration` - Audio duration in seconds (verbose_json only)\n- `segments` - Timestamped segments\n- `words` - Word-level timestamps\n\n#### `formatSegments(segments)`\nFormat transcription segments into readable text with timestamps.\n\n#### `extractSpeakers(text)`\nExtract speaker-labeled text from transcription (requires speaker hints in prompt).\n\n#### `estimateTranscriptionCost(durationSeconds)`\nCalculate estimated cost for Whisper transcription ($0.006/minute).\n\n### Utility Classes\n\n#### `TextFormatter`\nClean and format transcribed text.\n\n**Options:**\n- `removeFillerWords` - Remove 'um', 'uh', 'like', etc.\n- `correctPunctuation` - Add proper punctuation\n- `capitalizeFirstWord` - Capitalize first word of sentences\n- `removeExtraSpaces` - Normalize whitespace\n\n#### `NoiseProcessor`\nProcess audio streams to reduce background noise.\n\n**Options:**\n- `noiseReduction` - Noise reduction strength (0-1)\n- `autoGain` - Enable automatic gain control\n- `echoCancellation` - Enable echo cancellation\n\n## TypeScript Support\n\nThis package is written in TypeScript and includes complete type definitions.\n\n```typescript\nimport type {\n  RecordingConfig,\n  TranscriptionOptions,\n  TranscriptionResult,\n  InstrumentationConfig\n} from '@ainative/ai-kit-video'\n```\n\n## Browser Compatibility\n\n- Chrome/Edge 87+\n- Firefox 94+\n- Safari 15.4+\n- Requires HTTPS for MediaStream APIs\n\n## Memory Management\n\nAll recorders automatically clean up resources:\n- Blob URLs are revocable via `revokeURL()`\n- MediaStreams are stopped on page unload\n- No memory leaks from unreleased resources\n\n```typescript\n// Manual cleanup\nrecorder.stop()\nconst url = recorder.getRecordingURL()\n// ... use the URL\nrecorder.revokeURL(url) // Free memory\n```\n\n## Performance\n\n- **Screen Recording**: 2.5 Mbps video, 128 kbps audio (default)\n- **Camera Recording**: 1920x1080 @ 30fps (configurable)\n- **Whisper Transcription**: ~$0.006 per minute of audio\n\n## Examples\n\nSee the [examples directory](https://github.com/AINative-Studio/ai-kit/tree/main/examples) for complete working examples:\n- Screen recording with download\n- Camera recording with preview\n- Audio transcription with Whisper\n- PiP composite recording\n- Instrumented recording with metrics\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](https://github.com/AINative-Studio/ai-kit/blob/main/docs/contributing/CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT - See [LICENSE](./LICENSE) for details.\n\n## Support\n\n- [GitHub Issues](https://github.com/AINative-Studio/ai-kit/issues)\n- [Documentation](https://ainative.studio/ai-kit)\n\n---\n\n**Built by [AINative Studio](https://ainative.studio)**\n","readmeFilename":"README.md"}