हमारी सीरीज़ ए फंडिंग (Series A Funding) की घोषणा

हमारी सीरीज़ ए फंडिंग (Series A Funding) की घोषणा

पायथन में वॉयस एआई बनाएं: संपूर्ण स्पीच-टू-टेक्स्ट डेवलपर गाइड (2026)

एआई (AI) के साथ सारांशित करें

हमारे साथ अपने संपर्क केंद्रों (Contact Centers) को स्वचालित करें

तेज़ लेटेंसी, मजबूत सुरक्षा और असीमित स्पीच जनरेशन का अनुभव करें।

इस संपूर्ण 2026 स्पीच-टू-टेक्स्ट डेवलपर गाइड के साथ Python में Voice AI बनाएं। रीयल-टाइम ट्रांसक्रिप्शन, API, मॉडल और प्रोडक्शन की सर्वोत्तम प्रथाएं सीखें।

संक्षेप (TL;DR) - त्वरित एकीकरण अवलोकन

API प्लेटफॉर्म: Smallest AI द्वारा Pulse STT - एक अत्याधुनिक स्पीच-टू-टेक्स्ट API जो वास्तविक समय की स्ट्रीमिंग और बैच ऑडियो ट्रांसक्रिप्शन का समर्थन करती है।

प्रमुख विशेषताएं:

  • स्वचालित भाषा पहचान के साथ 32+ भाषाओं में ट्रांसक्राइब करता है

  • अति-कम विलंबता (अल्ट्रा-लो लेटेंसी): स्ट्रीमिंग के लिए पहले-ट्रांसक्रिप्ट-तक-का-समय लगभग ~64ms है

  • समृद्ध मेटाडेटा: शब्द टाइमस्टैम्प, स्पीकर डायराइजेशन, भावना पहचान, आयु/लिंग अनुमान, PII संपादन

एकीकरण के तरीके:

  • पहले से रिकॉर्ड किया गया ऑडियो: POST https://waves-api.smallest.ai/api/v1/pulse/get_text – बैच प्रोसेसिंग के लिए फ़ाइलें अपलोड करें

  • वास्तविक समय की स्ट्रीमिंग: wss://waves-api.smallest.ai/api/v1/pulse/get_text – लाइव ट्रांसक्रिप्शन के लिए WebSocket

डेवलपर अनुभव: किसी भी HTTP/WebSocket क्लाइंट या आधिकारिक SDK (Python, Node.js) का उपयोग करें। एकल API कुंजी के माध्यम से प्रमाणीकरण।

Pulse STT क्यों? अन्य प्रदाताओं की तुलना में, Pulse तेज़ प्रतिक्रिया (64ms बनाम विशिष्ट क्लाउड STT के लिए 200-500ms) और ऑल-इन-वन सुविधाएँ प्रदान करता है (स्पीकर ID, भावना विश्लेषण, या PII मास्किंग के लिए अलग सेवाओं की कोई आवश्यकता नहीं है)।

त्वरित लिंक:

परिचय: वॉयस इंटीग्रेशन क्यों महत्वपूर्ण है

आवाज उपयोगकर्ता संपर्क के लिए अगला माध्यम बनती जा रही है। वर्चुअल असिस्टेंट और वॉयस बॉट्स से लेकर बैठकों में रीयल-टाइम ट्रांसक्रिप्शन तक, वॉयस इंटरफेस सॉफ्टवेयर को अधिक सुलभ और उपयोगकर्ता के अनुकूल बना रहे हैं। डेवलपर्स के पास आज स्वचालित भाषण पहचान (ASR) API तक पहुंच है जो आवाज को टेक्स्ट में बदल देती है, जिससे हैंड्स-फ्री नियंत्रण, लाइव कैप्शन, वॉयस सर्च और बहुत कुछ की संभावनाएं खुल जाती हैं।

हालांकि, वॉयस AI को एकीकृत करना केवल ऑडियो से कच्चा टेक्स्ट प्राप्त करने से कहीं अधिक है। आधुनिक उपयोग के मामलों में गति और सटीकता की मांग होती है - एक वॉयस असिस्टेंट को लगभग तुरंत कमांड ट्रांसक्राइब करने की आवश्यकता होती है, और एक कॉल सेंटर एनालिटिक्स टूल को न केवल ट्रांसक्रिप्ट की आवश्यकता हो सकती है बल्कि यह भी कि किसने कब और कैसे बात की।

लेटेंसी महत्वपूर्ण है। बातचीत में एक सेकंड की भी देरी सुस्त महसूस होती है। पारंपरिक क्लाउड स्पीच API में लाइव ट्रांसक्रिप्शन के लिए अक्सर 500-1200ms की लेटेंसी होती है, जिसमें बेहतर वाले 200-250ms के आसपास होते हैं। इसने उद्योग को सहज वास्तविक समय के इंटरैक्शन को सक्षम करने के लिए अति-कम विलंबता - 300ms से कम - की ओर धकेल दिया है।

इस गाइड में, हम सीखेंगे कि Smallest AI के Pulse STT का उपयोग करके एक AI वॉयस और स्पीच API को कैसे एकीकृत किया जाए जो इन आधुनिक मांगों को पूरा करता है। अंत तक, आप जानेंगे कि:

  1. एक साधारण HTTP API का उपयोग करके ऑडियो फ़ाइलों (WAV/MP3) को टेक्स्ट में कैसे ट्रांसक्राइब करें

  2. WebSockets के माध्यम से त्वरित ट्रांसक्रिप्ट के लिए लाइव ऑडियो कैसे स्ट्रीम करें

  3. टाइमस्टैम्प, स्पीकर डायराइजेशन और भावना पहचान जैसी उन्नत सुविधाओं का लाभ कैसे उठाएं

  4. आवाज क्षमताओं को एकीकृत करने के लिए Python और Node.js दोनों का उपयोग कैसे करें



Pulse STT को समझना

Pulse, Smallest AI के "Waves" प्लेटफॉर्म का स्पीच-टू-टेक्स्ट/ASR (स्वचालित भाषण पहचान) मॉडल है। इसे स्ट्रीमिंग ऑडियो के लिए पहले ट्रांसक्राइब किए गए शब्द TTFT के लिए लगभग 64 मिलीसेकंड की उद्योग-अग्रणी लेटेंसी के साथ तेज़, सटीक और समृद्ध ट्रांसक्रिप्शन के लिए डिज़ाइन किया गया है। यह कई अन्य विकल्पों की तुलना में काफी तेज़ है।



प्रमुख विशेषताएं

विशेषता

विवरण

रीयल-टाइम और बैच मोड

WebSocket के माध्यम से लाइव ऑडियो स्ट्रीम करें या HTTP POST के माध्यम से फ़ाइलें अपलोड करें

32+ भाषाएँ

स्वचालित पहचान के साथ अंग्रेजी, स्पेनिश, हिंदी, फ्रेंच, जर्मन, अरबी, जापानी और बहुत कुछ

शब्द/वाक्य टाइमस्टैम्प

सटीक रूप से जानें कि प्रत्येक शब्द कब बोला गया था (उपशीर्षक के लिए बढ़िया)

स्पीकर डायराइजेशन

वक्ताओं में अंतर करें: "वक्ता A ने X कहा, वक्ता B ने Y कहा"

भावना पहचान

भावनाओं के साथ खंडों को टैग करें: खुश, गुस्से में, तटस्थ, आदि।

आयु/लिंग अनुमान

एनालिटिक्स के लिए वक्ता जनसांख्यिकी का अनुमान लगाएं

PII/PCI संपादन

क्रेडिट कार्ड, SSN और व्यक्तिगत जानकारी को स्वचालित रूप से मास्क करें

64ms लेटेंसी

स्ट्रीमिंग मोड में पहले-ट्रांसक्रिप्ट-तक-का-समय



शुरू करना: प्रमाणीकरण

चरण 1: अपनी API कुंजी प्राप्त करें

Smallest AI कंसोल पर साइन अप करें और एक API कुंजी उत्पन्न करें। यह कुंजी आपके सभी अनुरोधों को प्रमाणित करती है।



चरण 2: अपनी कुंजी का परीक्षण करें

curl -H "Authorization: Bearer $SMALLEST_API_KEY" \
  https://waves-api.smallest.ai/api/v1/lightning-v3.1/get_voices
curl -H "Authorization: Bearer $SMALLEST_API_KEY" \
  https://waves-api.smallest.ai/api/v1/lightning-v3.1/get_voices
curl -H "Authorization: Bearer $SMALLEST_API_KEY" \
  https://waves-api.smallest.ai/api/v1/lightning-v3.1/get_voices

प्रमाणीकरण हेडर

सभी अनुरोधों के लिए इस हेडर की आवश्यकता होती है:

Authorization: Bearer <YOUR_API_KEY>
Authorization: Bearer <YOUR_API_KEY>
Authorization: Bearer <YOUR_API_KEY>



भाग 1: ऑडियो फ़ाइलों को ट्रांसक्राइब करना (REST API)

पहले से रिकॉर्ड किया गया API वॉइसमेल, पॉडकास्ट, मीटिंग रिकॉर्डिंग या किसी भी मौजूदा ऑडियो फ़ाइलों की बैच प्रोसेसिंग के लिए बिल्कुल सही है।



एंडपॉइंट



क्वेरी पैरामीटर

पैरामीटर

प्रकार

विवरण

model

string

मॉडल पहचानकर्ता: pulse (आवश्यक)

language

string

ISO कोड (en, es, hi) या स्वतः-पहचान के लिए multi

word_timestamps

boolean

शब्द-स्तरीय समय डेटा शामिल करें

diarize

boolean

स्पीकर डायराइजेशन सक्षम करें

emotion_detection

boolean

स्पीकर की भावनाओं का पता लगाएं

age_detection

boolean

वक्ता के आयु वर्ग का अनुमान लगाएं

gender_detection

boolean

वक्ता के लिंग का अनुमान लगाएं



समर्थित भाषाएँ (32+)

इतालवी, स्पेनिश, अंग्रेजी, पुर्तगाली, हिंदी, जर्मन, फ्रेंच, यूक्रेनी, रूसी, कन्नड़, मलयालम, पोलिश, मराठी, गुजराती, चेक, स्लोवाक, तेलुगु, ओडिया, डच, बंगाली, लातवियाई, एस्टोनियाई, रोमानियाई, पंजाबी, फिनिश, स्वीडिश, बल्गेरियाई, तमिल, हंगेरियन, डेनिश, लिथुआनियाई, माल्टीज़, और स्वचालित पहचान (multi)।



cURL उदाहरण



curl --request POST \
  --url "https://waves-api.smallest.ai/api/v1/pulse/get_text?model=pulse&language=en&diarize=true&word_timestamps=true&emotion_detection=true" \
  --header "Authorization: Bearer $SMALLEST_API_KEY" \
  --header "Content-Type: audio/wav" \
  --data-binary "@/path/to/audio.wav"
curl --request POST \
  --url "https://waves-api.smallest.ai/api/v1/pulse/get_text?model=pulse&language=en&diarize=true&word_timestamps=true&emotion_detection=true" \
  --header "Authorization: Bearer $SMALLEST_API_KEY" \
  --header "Content-Type: audio/wav" \
  --data-binary "@/path/to/audio.wav"
curl --request POST \
  --url "https://waves-api.smallest.ai/api/v1/pulse/get_text?model=pulse&language=en&diarize=true&word_timestamps=true&emotion_detection=true" \
  --header "Authorization: Bearer $SMALLEST_API_KEY" \
  --header "Content-Type: audio/wav" \
  --data-binary "@/path/to/audio.wav"



Python उदाहरण



import os
import requests
<p>API_KEY = os.getenv("SMALLEST_API_KEY")<br>audio_file = "meeting_recording.wav"</p>
<p>url = "<a href="https://waves-api.smallest.ai/api/v1/pulse/get_text" data-framer-link="Link:{"url":"https://waves-api.smallest.ai/api/v1/pulse/get_text","type":"url"}">https://waves-api.smallest.ai/api/v1/pulse/get_text</a>"<br>params = {<br>"model": "pulse",<br>"language": "en",<br>"word_timestamps": "true",<br>"diarize": "true",<br>"emotion_detection": "true"<br>}<br>headers = {<br>"Authorization": f"Bearer {API_KEY}",<br>"Content-Type": "audio/wav"<br>}</p>
<p>with open(audio_file, "rb") as f:<br>audio_data = f.read()</p>
<p>response = requests.post(url, params=params, headers=headers, data=audio_data)<br>result = response.json()</p>
<h1>Print transcription</h1>
<p>print("Transcription:", result.get("transcription"))</p>
<h1>Print word-level details with speaker info</h1>
<p>for word in result.get("words", []):<br>speaker = word.get("speaker", "N/A")<br>print(f"  [Speaker {speaker}] [{word['start']:.2f}s - {word['end']:.2f}s] {word['word']}")</p>
<h1>Check emotions</h1>
import os
import requests
<p>API_KEY = os.getenv("SMALLEST_API_KEY")<br>audio_file = "meeting_recording.wav"</p>
<p>url = "<a href="https://waves-api.smallest.ai/api/v1/pulse/get_text" data-framer-link="Link:{"url":"https://waves-api.smallest.ai/api/v1/pulse/get_text","type":"url"}">https://waves-api.smallest.ai/api/v1/pulse/get_text</a>"<br>params = {<br>"model": "pulse",<br>"language": "en",<br>"word_timestamps": "true",<br>"diarize": "true",<br>"emotion_detection": "true"<br>}<br>headers = {<br>"Authorization": f"Bearer {API_KEY}",<br>"Content-Type": "audio/wav"<br>}</p>
<p>with open(audio_file, "rb") as f:<br>audio_data = f.read()</p>
<p>response = requests.post(url, params=params, headers=headers, data=audio_data)<br>result = response.json()</p>
<h1>Print transcription</h1>
<p>print("Transcription:", result.get("transcription"))</p>
<h1>Print word-level details with speaker info</h1>
<p>for word in result.get("words", []):<br>speaker = word.get("speaker", "N/A")<br>print(f"  [Speaker {speaker}] [{word['start']:.2f}s - {word['end']:.2f}s] {word['word']}")</p>
<h1>Check emotions</h1>
import os
import requests
<p>API_KEY = os.getenv("SMALLEST_API_KEY")<br>audio_file = "meeting_recording.wav"</p>
<p>url = "<a href="https://waves-api.smallest.ai/api/v1/pulse/get_text" data-framer-link="Link:{"url":"https://waves-api.smallest.ai/api/v1/pulse/get_text","type":"url"}">https://waves-api.smallest.ai/api/v1/pulse/get_text</a>"<br>params = {<br>"model": "pulse",<br>"language": "en",<br>"word_timestamps": "true",<br>"diarize": "true",<br>"emotion_detection": "true"<br>}<br>headers = {<br>"Authorization": f"Bearer {API_KEY}",<br>"Content-Type": "audio/wav"<br>}</p>
<p>with open(audio_file, "rb") as f:<br>audio_data = f.read()</p>
<p>response = requests.post(url, params=params, headers=headers, data=audio_data)<br>result = response.json()</p>
<h1>Print transcription</h1>
<p>print("Transcription:", result.get("transcription"))</p>
<h1>Print word-level details with speaker info</h1>
<p>for word in result.get("words", []):<br>speaker = word.get("speaker", "N/A")<br>print(f"  [Speaker {speaker}] [{word['start']:.2f}s - {word['end']:.2f}s] {word['word']}")</p>
<h1>Check emotions</h1>



Node.js उदाहरण



const fs = require('fs');<br>const axios = require('axios');<p></p>
<p>const API_KEY = process.env.SMALLEST_API_KEY;<br>const audioFile = 'meeting_recording.wav';</p>
<p>const url = '<a href="https://waves-api.smallest.ai/api/v1/pulse/get_text" data-framer-link="Link:{"url":"https://waves-api.smallest.ai/api/v1/pulse/get_text","type":"url"}">https://waves-api.smallest.ai/api/v1/pulse/get_text</a>';<br>const params = new URLSearchParams({<br>model: 'pulse',<br>language: 'en',<br>word_timestamps: 'true',<br>diarize: 'true',<br>emotion_detection: 'true'<br>});</p>
<p>const audioData = fs.readFileSync(audioFile);</p>
<p>axios.post(<code>${url}?${params}</code>, audioData, {<br>headers: {<br>'Authorization': <code>Bearer ${API_KEY}</code>,<br>'Content-Type': 'audio/wav'<br>}<br>})<br>.then(res => {<br>console.log('Transcription:', res.data.transcription);</p>
const fs = require('fs');<br>const axios = require('axios');<p></p>
<p>const API_KEY = process.env.SMALLEST_API_KEY;<br>const audioFile = 'meeting_recording.wav';</p>
<p>const url = '<a href="https://waves-api.smallest.ai/api/v1/pulse/get_text" data-framer-link="Link:{"url":"https://waves-api.smallest.ai/api/v1/pulse/get_text","type":"url"}">https://waves-api.smallest.ai/api/v1/pulse/get_text</a>';<br>const params = new URLSearchParams({<br>model: 'pulse',<br>language: 'en',<br>word_timestamps: 'true',<br>diarize: 'true',<br>emotion_detection: 'true'<br>});</p>
<p>const audioData = fs.readFileSync(audioFile);</p>
<p>axios.post(<code>${url}?${params}</code>, audioData, {<br>headers: {<br>'Authorization': <code>Bearer ${API_KEY}</code>,<br>'Content-Type': 'audio/wav'<br>}<br>})<br>.then(res => {<br>console.log('Transcription:', res.data.transcription);</p>
const fs = require('fs');<br>const axios = require('axios');<p></p>
<p>const API_KEY = process.env.SMALLEST_API_KEY;<br>const audioFile = 'meeting_recording.wav';</p>
<p>const url = '<a href="https://waves-api.smallest.ai/api/v1/pulse/get_text" data-framer-link="Link:{"url":"https://waves-api.smallest.ai/api/v1/pulse/get_text","type":"url"}">https://waves-api.smallest.ai/api/v1/pulse/get_text</a>';<br>const params = new URLSearchParams({<br>model: 'pulse',<br>language: 'en',<br>word_timestamps: 'true',<br>diarize: 'true',<br>emotion_detection: 'true'<br>});</p>
<p>const audioData = fs.readFileSync(audioFile);</p>
<p>axios.post(<code>${url}?${params}</code>, audioData, {<br>headers: {<br>'Authorization': <code>Bearer ${API_KEY}</code>,<br>'Content-Type': 'audio/wav'<br>}<br>})<br>.then(res => {<br>console.log('Transcription:', res.data.transcription);</p>



उदाहरण प्रतिक्रिया



{<br>"status": "success",<br>"transcription": "Hello, this is a test transcription.",<br>"words": [<br>{"start": 0.0, "end": 0.88, "word": "Hello,", "confidence": 0.82, "speaker": 0, "speaker_confidence": 0.61},<br>{"start": 0.88, "end": 1.04, "word": "this", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.76},<br>{"start": 1.04, "end": 1.20, "word": "is", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.20, "end": 1.36, "word": "a", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.36, "end": 1.68, "word": "test", "confidence": 0.99, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.68, "end": 2.16, "word": "transcription.", "confidence": 0.99, "speaker": 0, "speaker_confidence": 0.99}<br>],<br>"utterances": [<br>{"start": 0.0, "end": 2.16, "text": "Hello, this is a test transcription.", "speaker": 0}<br>],<br>"age": "adult",<br>"gender": "female",<br>"emotions": {<br>"happiness": 0.28,<br>"sadness": 0.0,<br>"anger": 0.0,<br>"fear": 0.0,<br>"disgust": 0.0<br>},<br>"metadata": {<br>"duration": 1.97,<br>"fileSize": 63236<br>}<br>
{<br>"status": "success",<br>"transcription": "Hello, this is a test transcription.",<br>"words": [<br>{"start": 0.0, "end": 0.88, "word": "Hello,", "confidence": 0.82, "speaker": 0, "speaker_confidence": 0.61},<br>{"start": 0.88, "end": 1.04, "word": "this", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.76},<br>{"start": 1.04, "end": 1.20, "word": "is", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.20, "end": 1.36, "word": "a", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.36, "end": 1.68, "word": "test", "confidence": 0.99, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.68, "end": 2.16, "word": "transcription.", "confidence": 0.99, "speaker": 0, "speaker_confidence": 0.99}<br>],<br>"utterances": [<br>{"start": 0.0, "end": 2.16, "text": "Hello, this is a test transcription.", "speaker": 0}<br>],<br>"age": "adult",<br>"gender": "female",<br>"emotions": {<br>"happiness": 0.28,<br>"sadness": 0.0,<br>"anger": 0.0,<br>"fear": 0.0,<br>"disgust": 0.0<br>},<br>"metadata": {<br>"duration": 1.97,<br>"fileSize": 63236<br>}<br>
{<br>"status": "success",<br>"transcription": "Hello, this is a test transcription.",<br>"words": [<br>{"start": 0.0, "end": 0.88, "word": "Hello,", "confidence": 0.82, "speaker": 0, "speaker_confidence": 0.61},<br>{"start": 0.88, "end": 1.04, "word": "this", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.76},<br>{"start": 1.04, "end": 1.20, "word": "is", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.20, "end": 1.36, "word": "a", "confidence": 1.0, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.36, "end": 1.68, "word": "test", "confidence": 0.99, "speaker": 0, "speaker_confidence": 0.99},<br>{"start": 1.68, "end": 2.16, "word": "transcription.", "confidence": 0.99, "speaker": 0, "speaker_confidence": 0.99}<br>],<br>"utterances": [<br>{"start": 0.0, "end": 2.16, "text": "Hello, this is a test transcription.", "speaker": 0}<br>],<br>"age": "adult",<br>"gender": "female",<br>"emotions": {<br>"happiness": 0.28,<br>"sadness": 0.0,<br>"anger": 0.0,<br>"fear": 0.0,<br>"disgust": 0.0<br>},<br>"metadata": {<br>"duration": 1.97,<br>"fileSize": 63236<br>}<br>



भाग 2: वास्तविक समय स्ट्रीमिंग (WebSocket API)

लाइव ऑडियो के लिए – वॉयस असिस्टेंट, लाइव कैप्शनिंग, कॉल सेंटर एनालिटिक्स – ऑडियो स्ट्रीम के रूप में आंशिक परिणामों के साथ एक सेकंड से भी कम की लेटेंसी के लिए WebSocket API का उपयोग करें।

WebSocket एंडपॉइंट

क्वेरी पैरामीटर

पैरामीटर

प्रकार

डिफ़ॉल्ट

विवरण

language

string

en

भाषा कोड या स्वतः-पहचान के लिए multi

encoding

string

linear16

ऑडियो प्रारूप: linear16, linear32, alaw, mulaw, opus

sample_rate

string

16000

नमूना दर: 8000, 16000, 22050, 24000, 44100, 48000

word_timestamps

string

true

शब्द-स्तरीय टाइमस्टैम्प शामिल करें

full_transcript

string

false

संचयी ट्रांसक्रिप्ट शामिल करें

sentence_timestamps

string

false

वाक्य-स्तरीय टाइमस्टैम्प शामिल करें

redact_pii

string

false

व्यक्तिगत जानकारी संपादित (redact) करें

redact_pci

string

false

भुगतान कार्ड की जानकारी संपादित करें

diarize

string

false

स्पीकर डायराइजेशन सक्षम करें



Python स्ट्रीमिंग उदाहरण

आधिकारिक कुकबुक से:

import asyncio<br>import json<br>import os<br>import numpy as np<br>import websockets<br>import librosa<br>from urllib.parse import urlencode<p></p>
<p>WS_URL = "wss://waves-api.smallest.ai/api/v1/pulse/get_text"</p>
<h1>Configurable features</h1>
<p>LANGUAGE = "en"<br>ENCODING = "linear16"<br>SAMPLE_RATE = 16000<br>WORD_TIMESTAMPS = False<br>FULL_TRANSCRIPT = True<br>SENTENCE_TIMESTAMPS = False<br>DIARIZE = False<br>REDACT_PII = False<br>REDACT_PCI = False</p>
<p>async def transcribe(audio_file: str, api_key: str):<br>params = {<br>"language": LANGUAGE,<br>"encoding": ENCODING,<br>"sample_rate": SAMPLE_RATE,<br>"word_timestamps": str(WORD_TIMESTAMPS).lower(),<br>"full_transcript": str(FULL_TRANSCRIPT).lower(),<br>"sentence_timestamps": str(SENTENCE_TIMESTAMPS).lower(),<br>"diarize": str(DIARIZE).lower(),<br>"redact_pii": str(REDACT_PII).lower(),<br>"redact_pci": str(REDACT_PCI).lower(),<br>}</p>
<pre><code>url = f"{WS_URL}?{urlencode(params)}"
headers = {"Authorization": f"Bearer {api_key}"}

# Load audio with librosa (handles any format)
audio, _ = librosa.load(audio_file, sr=SAMPLE_RATE, mono=True)
chunk_duration = 0.1  # 100ms chunks
chunk_size = int(chunk_duration * SAMPLE_RATE)

async with websockets.connect(url, additional_headers=headers) as ws:
    print("✅ Connected to Pulse STT WebSocket")
    
    async def send_audio():
        for i in range(0, len(audio), chunk_size):
            chunk = audio[i:i + chunk_size]
            pcm16 = (chunk * 32768.0).astype(np.int16).tobytes()
            await ws.send(pcm16)
            await asyncio.sleep(chunk_duration)
        await ws.send(json.dumps({"type": "end"}))
        print("📤 Sent end signal")

    async def receive_responses():
        async for message in ws:
            result = json.loads(message)
            
            if result.get("is_final"):
                print(f"✓ {result.get('transcript')}")
                
                if result.get("is_last"):
                    if result.get("full_transcript"):
                        print(f"\n{'='*60}")
                        print("FULL TRANSCRIPT")
                        print(f"{'='*60}")
                        print(result.get("full_transcript"))
                    break

    await asyncio.gather(send_audio(), receive_responses())
</code></pre>
<h1>Usage</h1>
import asyncio<br>import json<br>import os<br>import numpy as np<br>import websockets<br>import librosa<br>from urllib.parse import urlencode<p></p>
<p>WS_URL = "wss://waves-api.smallest.ai/api/v1/pulse/get_text"</p>
<h1>Configurable features</h1>
<p>LANGUAGE = "en"<br>ENCODING = "linear16"<br>SAMPLE_RATE = 16000<br>WORD_TIMESTAMPS = False<br>FULL_TRANSCRIPT = True<br>SENTENCE_TIMESTAMPS = False<br>DIARIZE = False<br>REDACT_PII = False<br>REDACT_PCI = False</p>
<p>async def transcribe(audio_file: str, api_key: str):<br>params = {<br>"language": LANGUAGE,<br>"encoding": ENCODING,<br>"sample_rate": SAMPLE_RATE,<br>"word_timestamps": str(WORD_TIMESTAMPS).lower(),<br>"full_transcript": str(FULL_TRANSCRIPT).lower(),<br>"sentence_timestamps": str(SENTENCE_TIMESTAMPS).lower(),<br>"diarize": str(DIARIZE).lower(),<br>"redact_pii": str(REDACT_PII).lower(),<br>"redact_pci": str(REDACT_PCI).lower(),<br>}</p>
<pre><code>url = f"{WS_URL}?{urlencode(params)}"
headers = {"Authorization": f"Bearer {api_key}"}

# Load audio with librosa (handles any format)
audio, _ = librosa.load(audio_file, sr=SAMPLE_RATE, mono=True)
chunk_duration = 0.1  # 100ms chunks
chunk_size = int(chunk_duration * SAMPLE_RATE)

async with websockets.connect(url, additional_headers=headers) as ws:
    print("✅ Connected to Pulse STT WebSocket")
    
    async def send_audio():
        for i in range(0, len(audio), chunk_size):
            chunk = audio[i:i + chunk_size]
            pcm16 = (chunk * 32768.0).astype(np.int16).tobytes()
            await ws.send(pcm16)
            await asyncio.sleep(chunk_duration)
        await ws.send(json.dumps({"type": "end"}))
        print("📤 Sent end signal")

    async def receive_responses():
        async for message in ws:
            result = json.loads(message)
            
            if result.get("is_final"):
                print(f"✓ {result.get('transcript')}")
                
                if result.get("is_last"):
                    if result.get("full_transcript"):
                        print(f"\n{'='*60}")
                        print("FULL TRANSCRIPT")
                        print(f"{'='*60}")
                        print(result.get("full_transcript"))
                    break

    await asyncio.gather(send_audio(), receive_responses())
</code></pre>
<h1>Usage</h1>
import asyncio<br>import json<br>import os<br>import numpy as np<br>import websockets<br>import librosa<br>from urllib.parse import urlencode<p></p>
<p>WS_URL = "wss://waves-api.smallest.ai/api/v1/pulse/get_text"</p>
<h1>Configurable features</h1>
<p>LANGUAGE = "en"<br>ENCODING = "linear16"<br>SAMPLE_RATE = 16000<br>WORD_TIMESTAMPS = False<br>FULL_TRANSCRIPT = True<br>SENTENCE_TIMESTAMPS = False<br>DIARIZE = False<br>REDACT_PII = False<br>REDACT_PCI = False</p>
<p>async def transcribe(audio_file: str, api_key: str):<br>params = {<br>"language": LANGUAGE,<br>"encoding": ENCODING,<br>"sample_rate": SAMPLE_RATE,<br>"word_timestamps": str(WORD_TIMESTAMPS).lower(),<br>"full_transcript": str(FULL_TRANSCRIPT).lower(),<br>"sentence_timestamps": str(SENTENCE_TIMESTAMPS).lower(),<br>"diarize": str(DIARIZE).lower(),<br>"redact_pii": str(REDACT_PII).lower(),<br>"redact_pci": str(REDACT_PCI).lower(),<br>}</p>
<pre><code>url = f"{WS_URL}?{urlencode(params)}"
headers = {"Authorization": f"Bearer {api_key}"}

# Load audio with librosa (handles any format)
audio, _ = librosa.load(audio_file, sr=SAMPLE_RATE, mono=True)
chunk_duration = 0.1  # 100ms chunks
chunk_size = int(chunk_duration * SAMPLE_RATE)

async with websockets.connect(url, additional_headers=headers) as ws:
    print("✅ Connected to Pulse STT WebSocket")
    
    async def send_audio():
        for i in range(0, len(audio), chunk_size):
            chunk = audio[i:i + chunk_size]
            pcm16 = (chunk * 32768.0).astype(np.int16).tobytes()
            await ws.send(pcm16)
            await asyncio.sleep(chunk_duration)
        await ws.send(json.dumps({"type": "end"}))
        print("📤 Sent end signal")

    async def receive_responses():
        async for message in ws:
            result = json.loads(message)
            
            if result.get("is_final"):
                print(f"✓ {result.get('transcript')}")
                
                if result.get("is_last"):
                    if result.get("full_transcript"):
                        print(f"\n{'='*60}")
                        print("FULL TRANSCRIPT")
                        print(f"{'='*60}")
                        print(result.get("full_transcript"))
                    break

    await asyncio.gather(send_audio(), receive_responses())
</code></pre>
<h1>Usage</h1>

निर्भरताएं स्थापित करें (Install dependencies):

रन करें:

export SMALLEST_API_KEY="your-api-key"<br>python transcribe.py recording.wav
export SMALLEST_API_KEY="your-api-key"<br>python transcribe.py recording.wav
export SMALLEST_API_KEY="your-api-key"<br>python transcribe.py recording.wav

(पूर्वावलोकन आउटपुट)

Node.js स्ट्रीमिंग उदाहरण

आधिकारिक कुकबुक से:

const fs = require("fs");<br>const WebSocket = require("ws");<br>const wav = require("wav");<p></p>
<p>const WS_URL = "wss://waves-api.smallest.ai/api/v1/pulse/get_text";</p>
<p>// Configurable features<br>const LANGUAGE = "en";<br>const ENCODING = "linear16";<br>const SAMPLE_RATE = 16000;<br>const WORD_TIMESTAMPS = false;<br>const FULL_TRANSCRIPT = true;<br>const DIARIZE = false;<br>const REDACT_PII = false;<br>const REDACT_PCI = false;</p>
<p>async function loadAudio(audioFile) {<br>return new Promise((resolve, reject) => {<br>const reader = new wav.Reader();<br>const chunks = [];</p>
<pre><code>reader.on("format", (format) =&gt; {
  reader.on("data", (chunk) =&gt; chunks.push(chunk));
  reader.on("end", () =&gt; {
    const buffer = Buffer.concat(chunks);
    const samples = new Int16Array(buffer.buffer, buffer.byteOffset, buffer.length / 2);
    resolve(samples);
  });
});

reader.on("error", reject);
fs.createReadStream(audioFile).pipe(reader);
</code></pre>
<p>});<br>}</p>
<p>async function transcribe(audioFile, apiKey) {<br>const params = new URLSearchParams({<br>language: LANGUAGE,<br>encoding: ENCODING,<br>sample_rate: SAMPLE_RATE,<br>word_timestamps: WORD_TIMESTAMPS,<br>full_transcript: FULL_TRANSCRIPT,<br>diarize: DIARIZE,<br>redact_pii: REDACT_PII,<br>redact_pci: REDACT_PCI,<br>});</p>
<p>const url = <code>${WS_URL}?${params}</code>;<br>const audio = await loadAudio(audioFile);<br>const chunkDuration = 0.1; // 100ms<br>const chunkSize = Math.floor(chunkDuration * SAMPLE_RATE);</p>
<p>return new Promise((resolve, reject) => {<br>const ws = new WebSocket(url, {<br>headers: { Authorization: <code>Bearer ${apiKey}</code> },<br>});</p>
<pre><code>ws.on("open", async () =&gt; {
  console.log("✅ Connected to Pulse STT WebSocket");
  
  for (let i = 0; i &lt; audio.length; i += chunkSize) {
    const chunk = audio.slice(i, i + chunkSize);
    ws.send(Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength));
    await new Promise((r) =&gt; setTimeout(r, chunkDuration * 1000));
  }
  ws.send(JSON.stringify({ type: "end" }));
  console.log("📤 Sent end signal");
});

ws.on("message", (data) =&gt; {
  const result = JSON.parse(data.toString());
  
  if (result.is_final) {
    console.log(`✓ ${result.transcript}`);
    
    if (result.is_last) {
      if (result.full_transcript) {
        console.log("\n" + "=".repeat(60));
        console.log("FULL TRANSCRIPT");
        console.log("=".repeat(60));
        console.log(result.full_transcript);
      }
      ws.close();
    }
  }
});

ws.on("close", resolve);
ws.on("error", reject);
</code></pre>
<p>});<br>}</p>
const fs = require("fs");<br>const WebSocket = require("ws");<br>const wav = require("wav");<p></p>
<p>const WS_URL = "wss://waves-api.smallest.ai/api/v1/pulse/get_text";</p>
<p>// Configurable features<br>const LANGUAGE = "en";<br>const ENCODING = "linear16";<br>const SAMPLE_RATE = 16000;<br>const WORD_TIMESTAMPS = false;<br>const FULL_TRANSCRIPT = true;<br>const DIARIZE = false;<br>const REDACT_PII = false;<br>const REDACT_PCI = false;</p>
<p>async function loadAudio(audioFile) {<br>return new Promise((resolve, reject) => {<br>const reader = new wav.Reader();<br>const chunks = [];</p>
<pre><code>reader.on("format", (format) =&gt; {
  reader.on("data", (chunk) =&gt; chunks.push(chunk));
  reader.on("end", () =&gt; {
    const buffer = Buffer.concat(chunks);
    const samples = new Int16Array(buffer.buffer, buffer.byteOffset, buffer.length / 2);
    resolve(samples);
  });
});

reader.on("error", reject);
fs.createReadStream(audioFile).pipe(reader);
</code></pre>
<p>});<br>}</p>
<p>async function transcribe(audioFile, apiKey) {<br>const params = new URLSearchParams({<br>language: LANGUAGE,<br>encoding: ENCODING,<br>sample_rate: SAMPLE_RATE,<br>word_timestamps: WORD_TIMESTAMPS,<br>full_transcript: FULL_TRANSCRIPT,<br>diarize: DIARIZE,<br>redact_pii: REDACT_PII,<br>redact_pci: REDACT_PCI,<br>});</p>
<p>const url = <code>${WS_URL}?${params}</code>;<br>const audio = await loadAudio(audioFile);<br>const chunkDuration = 0.1; // 100ms<br>const chunkSize = Math.floor(chunkDuration * SAMPLE_RATE);</p>
<p>return new Promise((resolve, reject) => {<br>const ws = new WebSocket(url, {<br>headers: { Authorization: <code>Bearer ${apiKey}</code> },<br>});</p>
<pre><code>ws.on("open", async () =&gt; {
  console.log("✅ Connected to Pulse STT WebSocket");
  
  for (let i = 0; i &lt; audio.length; i += chunkSize) {
    const chunk = audio.slice(i, i + chunkSize);
    ws.send(Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength));
    await new Promise((r) =&gt; setTimeout(r, chunkDuration * 1000));
  }
  ws.send(JSON.stringify({ type: "end" }));
  console.log("📤 Sent end signal");
});

ws.on("message", (data) =&gt; {
  const result = JSON.parse(data.toString());
  
  if (result.is_final) {
    console.log(`✓ ${result.transcript}`);
    
    if (result.is_last) {
      if (result.full_transcript) {
        console.log("\n" + "=".repeat(60));
        console.log("FULL TRANSCRIPT");
        console.log("=".repeat(60));
        console.log(result.full_transcript);
      }
      ws.close();
    }
  }
});

ws.on("close", resolve);
ws.on("error", reject);
</code></pre>
<p>});<br>}</p>
const fs = require("fs");<br>const WebSocket = require("ws");<br>const wav = require("wav");<p></p>
<p>const WS_URL = "wss://waves-api.smallest.ai/api/v1/pulse/get_text";</p>
<p>// Configurable features<br>const LANGUAGE = "en";<br>const ENCODING = "linear16";<br>const SAMPLE_RATE = 16000;<br>const WORD_TIMESTAMPS = false;<br>const FULL_TRANSCRIPT = true;<br>const DIARIZE = false;<br>const REDACT_PII = false;<br>const REDACT_PCI = false;</p>
<p>async function loadAudio(audioFile) {<br>return new Promise((resolve, reject) => {<br>const reader = new wav.Reader();<br>const chunks = [];</p>
<pre><code>reader.on("format", (format) =&gt; {
  reader.on("data", (chunk) =&gt; chunks.push(chunk));
  reader.on("end", () =&gt; {
    const buffer = Buffer.concat(chunks);
    const samples = new Int16Array(buffer.buffer, buffer.byteOffset, buffer.length / 2);
    resolve(samples);
  });
});

reader.on("error", reject);
fs.createReadStream(audioFile).pipe(reader);
</code></pre>
<p>});<br>}</p>
<p>async function transcribe(audioFile, apiKey) {<br>const params = new URLSearchParams({<br>language: LANGUAGE,<br>encoding: ENCODING,<br>sample_rate: SAMPLE_RATE,<br>word_timestamps: WORD_TIMESTAMPS,<br>full_transcript: FULL_TRANSCRIPT,<br>diarize: DIARIZE,<br>redact_pii: REDACT_PII,<br>redact_pci: REDACT_PCI,<br>});</p>
<p>const url = <code>${WS_URL}?${params}</code>;<br>const audio = await loadAudio(audioFile);<br>const chunkDuration = 0.1; // 100ms<br>const chunkSize = Math.floor(chunkDuration * SAMPLE_RATE);</p>
<p>return new Promise((resolve, reject) => {<br>const ws = new WebSocket(url, {<br>headers: { Authorization: <code>Bearer ${apiKey}</code> },<br>});</p>
<pre><code>ws.on("open", async () =&gt; {
  console.log("✅ Connected to Pulse STT WebSocket");
  
  for (let i = 0; i &lt; audio.length; i += chunkSize) {
    const chunk = audio.slice(i, i + chunkSize);
    ws.send(Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength));
    await new Promise((r) =&gt; setTimeout(r, chunkDuration * 1000));
  }
  ws.send(JSON.stringify({ type: "end" }));
  console.log("📤 Sent end signal");
});

ws.on("message", (data) =&gt; {
  const result = JSON.parse(data.toString());
  
  if (result.is_final) {
    console.log(`✓ ${result.transcript}`);
    
    if (result.is_last) {
      if (result.full_transcript) {
        console.log("\n" + "=".repeat(60));
        console.log("FULL TRANSCRIPT");
        console.log("=".repeat(60));
        console.log(result.full_transcript);
      }
      ws.close();
    }
  }
});

ws.on("close", resolve);
ws.on("error", reject);
</code></pre>
<p>});<br>}</p>

निर्भरताएं स्थापित करें (Install dependencies):



रन करें:



export SMALLEST_API_KEY="your-api-key"<br>node transcribe.js recording.wav
export SMALLEST_API_KEY="your-api-key"<br>node transcribe.js recording.wav
export SMALLEST_API_KEY="your-api-key"<br>node transcribe.js recording.wav



WebSocket प्रतिक्रिया प्रारूप (Response Format)



{<br>"session_id": "sess_12345abcde",<br>"transcript": "Hello, how are you?",<br>"full_transcript": "Hello, how are you?",<br>"is_final": true,<br>"is_last": false,<br>"language": "en",<br>"words": [<br>{"word": "Hello,", "start": 0.0, "end": 0.5, "confidence": 0.98, "speaker": 0},<br>{"word": "how", "start": 0.5, "end": 0.7, "confidence": 0.99, "speaker": 0},<br>{"word": "are", "start": 0.7, "end": 0.9, "confidence": 0.97, "speaker": 0},<br>{"word": "you?", "start": 0.9, "end": 1.2, "confidence": 0.99, "speaker": 0}<br>]<br>
{<br>"session_id": "sess_12345abcde",<br>"transcript": "Hello, how are you?",<br>"full_transcript": "Hello, how are you?",<br>"is_final": true,<br>"is_last": false,<br>"language": "en",<br>"words": [<br>{"word": "Hello,", "start": 0.0, "end": 0.5, "confidence": 0.98, "speaker": 0},<br>{"word": "how", "start": 0.5, "end": 0.7, "confidence": 0.99, "speaker": 0},<br>{"word": "are", "start": 0.7, "end": 0.9, "confidence": 0.97, "speaker": 0},<br>{"word": "you?", "start": 0.9, "end": 1.2, "confidence": 0.99, "speaker": 0}<br>]<br>
{<br>"session_id": "sess_12345abcde",<br>"transcript": "Hello, how are you?",<br>"full_transcript": "Hello, how are you?",<br>"is_final": true,<br>"is_last": false,<br>"language": "en",<br>"words": [<br>{"word": "Hello,", "start": 0.0, "end": 0.5, "confidence": 0.98, "speaker": 0},<br>{"word": "how", "start": 0.5, "end": 0.7, "confidence": 0.99, "speaker": 0},<br>{"word": "are", "start": 0.7, "end": 0.9, "confidence": 0.97, "speaker": 0},<br>{"word": "you?", "start": 0.9, "end": 1.2, "confidence": 0.99, "speaker": 0}<br>]<br>



मुख्य प्रतिक्रिया फ़ील्ड

फ़ील्ड

विवरण

is_final

false = आंशिक/अंतरिम ट्रांसक्रिप्ट; true = अंतिम रूप दिया गया खंड

is_last

संपूर्ण सत्र समाप्त होने पर true

transcript

वर्तमान खंड टेक्स्ट

full_transcript

संपूर्ण सत्र से संचित पाठ (यदि सक्षम हो)

words

शब्द-स्तरीय टाइमस्टैम्प (यदि सक्षम हो)



भाग 3: उन्नत सुविधाएँ



स्पीकर डायराइजेशन

विभिन्न वक्ताओं की पहचान करने के लिए diarize=true सक्षम करें:



params = {"model": "pulse", "language": "en", "diarize": "true"}
params = {"model": "pulse", "language": "en", "diarize": "true"}
params = {"model": "pulse", "language": "en", "diarize": "true"}

प्रतिक्रिया में स्पीकर लेबल शामिल होते हैं:



{<br>"words": [<br>{"word": "Hello", "speaker": 0, "speaker_confidence": 0.95},<br>{"word": "Hi", "speaker": 1, "speaker_confidence": 0.92}<br>],<br>"utterances": [<br>{"text": "Hello, how can I help?", "speaker": 0},<br>{"text": "I have a question.", "speaker": 1}<br>]<br>
{<br>"words": [<br>{"word": "Hello", "speaker": 0, "speaker_confidence": 0.95},<br>{"word": "Hi", "speaker": 1, "speaker_confidence": 0.92}<br>],<br>"utterances": [<br>{"text": "Hello, how can I help?", "speaker": 0},<br>{"text": "I have a question.", "speaker": 1}<br>]<br>
{<br>"words": [<br>{"word": "Hello", "speaker": 0, "speaker_confidence": 0.95},<br>{"word": "Hi", "speaker": 1, "speaker_confidence": 0.92}<br>],<br>"utterances": [<br>{"text": "Hello, how can I help?", "speaker": 0},<br>{"text": "I have a question.", "speaker": 1}<br>]<br>



भावना पहचान (Emotion Detection)

वक्ता की भावनाओं का विश्लेषण करने के लिए emotion_detection=true सक्षम करें:



{<br>"emotions": {<br>"happiness": 0.28,<br>"sadness": 0.0,<br>"anger": 0.0,<br>"fear": 0.0,<br>"disgust": 0.0<br>}<br>
{<br>"emotions": {<br>"happiness": 0.28,<br>"sadness": 0.0,<br>"anger": 0.0,<br>"fear": 0.0,<br>"disgust": 0.0<br>}<br>
{<br>"emotions": {<br>"happiness": 0.28,<br>"sadness": 0.0,<br>"anger": 0.0,<br>"fear": 0.0,<br>"disgust": 0.0<br>}<br>



PII/PCI संपादन (Redaction)

अनुपालन (HIPAA, PCI-DSS) के लिए, redact_pii=true या redact_pci=true सक्षम करें:



{<br>"transcript": "My credit card is [CREDITCARD_1] and SSN is [SSN_1]",<br>"redacted_entities": ["[CREDITCARD_1]", "[SSN_1]"]<br>
{<br>"transcript": "My credit card is [CREDITCARD_1] and SSN is [SSN_1]",<br>"redacted_entities": ["[CREDITCARD_1]", "[SSN_1]"]<br>
{<br>"transcript": "My credit card is [CREDITCARD_1] and SSN is [SSN_1]",<br>"redacted_entities": ["[CREDITCARD_1]", "[SSN_1]"]<br>



आयु और लिंग पहचान

age_detection=true और gender_detection=true सक्षम करें:



{<br>"age": "adult",<br>"gender": "female"<br>
{<br>"age": "adult",<br>"gender": "female"<br>
{<br>"age": "adult",<br>"gender": "female"<br>



STT प्रदाताओं की तुलना

प्रदाता

विलंबता (Latency)

भाषाएँ

डायराइजेशन

भावना

PII संपादन

कीमत (प्रति 1000 मिनट)

Pulse STT

64ms

32+

प्रतिस्पर्धी

Google Cloud STT

200-300ms

125+

$16

Deepgram

100-200ms

36+

$4-5

AssemblyAI

200-400ms

30+

$3.50

OpenAI Whisper

केवल बैच

99+

~$6

क्यों Pulse STT सबसे अलग है:

  • सबसे तेज़ समय-से-पहला-ट्रांसक्रिप्ट (64ms)

  • ऑल-इन-वन विशेषताएं (अलग सेवाओं की आवश्यकता नहीं)

  • विविध लहजों में प्रतिस्पर्धी सटीकता

  • वास्तविक समय के वॉयस AI अनुप्रयोगों के लिए निर्मित

सर्वोत्तम प्रथाएं

ऑडियो गुणवत्ता

  • सर्वोत्तम परिणामों के लिए 16kHz, मोनो, 16-बिट PCM का उपयोग करें

  • WAV या FLAC प्रारूप आदर्श हैं

  • जब संभव हो तो पृष्ठभूमि के शोर को कम करें



त्रुटि प्रबंधन (Error Handling)

try:<br>response = requests.post(url, params=params, headers=headers, data=audio_data, timeout=120)<br>response.raise_for_status()<br>except requests.exceptions.HTTPError as e:<br>if e.response.status_code == 429:<br># Rate limited - implement exponential backoff<br>time.sleep(2 ** retry_count)<br>elif e.response.status_code == 401:<br># Invalid API key<br>
try:<br>response = requests.post(url, params=params, headers=headers, data=audio_data, timeout=120)<br>response.raise_for_status()<br>except requests.exceptions.HTTPError as e:<br>if e.response.status_code == 429:<br># Rate limited - implement exponential backoff<br>time.sleep(2 ** retry_count)<br>elif e.response.status_code == 401:<br># Invalid API key<br>
try:<br>response = requests.post(url, params=params, headers=headers, data=audio_data, timeout=120)<br>response.raise_for_status()<br>except requests.exceptions.HTTPError as e:<br>if e.response.status_code == 429:<br># Rate limited - implement exponential backoff<br>time.sleep(2 ** retry_count)<br>elif e.response.status_code == 401:<br># Invalid API key<br>

दर सीमित करना (Rate Limiting)

  • बैच अनुरोधों के बीच 500ms+ का विलंब जोड़ें

  • लंबी ऑडियो फ़ाइलों के लिए वेबहुक का उपयोग करें

  • 429 त्रुटियों के लिए घातीय बैकऑफ़ (exponential backoff) लागू करें

बोनस: पूर्ण डेमो एप्लीकेशन

सब कुछ एक साथ काम करते देखना चाहते हैं? कोड नमूने रिपॉजिटरी में डेमो ऐप देखें — एक पूर्ण Next.js वेब एप्लिकेशन जिसमें शामिल हैं:

  • शब्द-स्तरीय टाइमस्टैम्प के साथ फ़ाइल अपलोड ट्रांसक्रिप्शन (समय देखने के लिए होवर करें)

  • लाइव ट्रांसक्रिप्ट डिस्प्ले के साथ वास्तविक समय का माइक्रोफ़ोन स्ट्रीमिंग

  • सुरक्षित WebSocket प्रॉक्सी जो आपकी API कुंजी को सर्वर-साइड रखता है

  • Smallest AI ब्रांड रंगों के साथ आधुनिक UI

  • भाषा चयन (अंग्रेजी, हिंदी, स्पेनिश, फ्रेंच, जर्मन, पुर्तगाली, स्वतः पहचान)

  • भावना पहचान और स्पीकर डायराइजेशन डिस्प्ले



त्वरित शुरुआत

cd demo-app<br>npm install
cd demo-app<br>npm install
cd demo-app<br>npm install

अपनी API कुंजी के साथ एक .env.local फ़ाइल बनाएं:

echo 'SMALLEST_API_KEY=your-api-key' > .env.local
echo 'SMALLEST_API_KEY=your-api-key' > .env.local
echo 'SMALLEST_API_KEY=your-api-key' > .env.local

दोनों सर्वर प्रारंभ करें (Next.js + WebSocket प्रॉक्सी):

फिर Chrome या Safari में http://localhost:3000 खोलें (माइक्रोफ़ोन पहुंच के लिए)।

यह कैसे काम करता है

डेमो दो सर्वर चलाता है:

  1. Next.js (पोर्ट 3000) — React UI परोसता है और /api/transcribe के माध्यम से फ़ाइल अपलोड संभालता है

  2. WebSocket प्रॉक्सी (पोर्ट 3001) — ब्राउज़र से Pulse STT WebSocket API को ऑडियो सुरक्षित रूप से प्रॉक्सी करता है

Browser → WebSocket Proxy (3001) → Pulse STT (wss://waves-api.smallest.ai)<br>
Browser → WebSocket Proxy (3001) → Pulse STT (wss://waves-api.smallest.ai)<br>
Browser → WebSocket Proxy (3001) → Pulse STT (wss://waves-api.smallest.ai)<br>

यह आर्किटेक्चर रीयल-टाइम स्ट्रीमिंग को सक्षम करते हुए सर्वर पर आपकी API कुंजी को सुरक्षित रखता है।

परियोजना संरचना (Project Structure)

demo-app/<br>├── src/<br>│   └── app/<br>│       ├── api/<br>│       │   └── transcribe/<br>│       │       └── route.ts    # REST API for file upload<br>│       ├── page.tsx            # Main UI<br>│       └── layout.tsx<br>├── ws-server.js                # WebSocket proxy server<br>├── .env.local                  # Your API key (create this)<br>
demo-app/<br>├── src/<br>│   └── app/<br>│       ├── api/<br>│       │   └── transcribe/<br>│       │       └── route.ts    # REST API for file upload<br>│       ├── page.tsx            # Main UI<br>│       └── layout.tsx<br>├── ws-server.js                # WebSocket proxy server<br>├── .env.local                  # Your API key (create this)<br>
demo-app/<br>├── src/<br>│   └── app/<br>│       ├── api/<br>│       │   └── transcribe/<br>│       │       └── route.ts    # REST API for file upload<br>│       ├── page.tsx            # Main UI<br>│       └── layout.tsx<br>├── ws-server.js                # WebSocket proxy server<br>├── .env.local                  # Your API key (create this)<br>

स्क्रिप्ट

कमांड

विवरण

npm run dev

केवल Next.js प्रारंभ करें

npm run dev:ws

केवल WebSocket प्रॉक्सी प्रारंभ करें

npm run dev:all

दोनों प्रारंभ करें (अनुशंसित)

उत्पादन ऐप्स के लिए इस आर्किटेक्चर पैटर्न की सिफारिश की जाती है — API कुंजियां सर्वर-साइड रहती हैं जबकि React फ्रंटएंड फ़ाइल अपलोड और रीयल-टाइम माइक्रोफ़ोन ट्रांसक्रिप्शन दोनों के साथ एक सहज उपयोगकर्ता अनुभव प्रदान करता है।



निष्कर्ष

अपने कार्यप्रवाह और ऐप्स में आवाज और भाषण क्षमताओं को एकीकृत करने से उपयोगकर्ता अनुभव में काफी सुधार हो सकता है। Pulse STT के साथ, डेवलपर्स केवल कुछ API कॉल के साथ उच्च-सटीकता, कम-विलंबता ट्रांसक्रिप्शन प्राप्त कर सकते हैं।

REST API का उपयोग कब करें:

  • पॉडकास्ट ट्रांसक्रिप्शन

  • बैठक रिकॉर्डिंग

  • वॉइसमेल प्रोसेसिंग

  • बैच एनालिटिक्स

WebSocket API का उपयोग कब करें:

  • लाइव कैप्शनिंग

  • वॉयस असिस्टेंट

  • कॉल सेंटर रीयल-टाइम एनालिटिक्स

  • इंटरैक्टिव वॉयस एप्लीकेशन

इस गाइड के कोड पैटर्न सीधे उत्पादन के अनुकूल हैं। प्रोटोटाइप के लिए REST API से शुरुआत करें, फिर वास्तविक समय के इंटरैक्शन की आवश्यकता होने पर WebSocket स्ट्रीमिंग जोड़ें।

संसाधन


एआई (AI) के साथ सारांशित करें