संक्षेप (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 मास्किंग के लिए अलग सेवाओं की कोई आवश्यकता नहीं है)।
त्वरित लिंक:
API कंसोल – अपनी API कुंजी प्राप्त करें
दस्तावेज़ीकरण – पूर्ण API संदर्भ
Python SDK – आधिकारिक क्लाइंट
परिचय: वॉयस इंटीग्रेशन क्यों महत्वपूर्ण है आवाज उपयोगकर्ता संपर्क के लिए अगला माध्यम बनती जा रही है। वर्चुअल असिस्टेंट और वॉयस बॉट्स से लेकर बैठकों में रीयल-टाइम ट्रांसक्रिप्शन तक, वॉयस इंटरफेस सॉफ्टवेयर को अधिक सुलभ और उपयोगकर्ता के अनुकूल बना रहे हैं। डेवलपर्स के पास आज स्वचालित भाषण पहचान (ASR) API तक पहुंच है जो आवाज को टेक्स्ट में बदल देती है, जिससे हैंड्स-फ्री नियंत्रण, लाइव कैप्शन, वॉयस सर्च और बहुत कुछ की संभावनाएं खुल जाती हैं।
हालांकि, वॉयस AI को एकीकृत करना केवल ऑडियो से कच्चा टेक्स्ट प्राप्त करने से कहीं अधिक है। आधुनिक उपयोग के मामलों में गति और सटीकता की मांग होती है - एक वॉयस असिस्टेंट को लगभग तुरंत कमांड ट्रांसक्राइब करने की आवश्यकता होती है, और एक कॉल सेंटर एनालिटिक्स टूल को न केवल ट्रांसक्रिप्ट की आवश्यकता हो सकती है बल्कि यह भी कि किसने कब और कैसे बात की।
लेटेंसी महत्वपूर्ण है। बातचीत में एक सेकंड की भी देरी सुस्त महसूस होती है। पारंपरिक क्लाउड स्पीच API में लाइव ट्रांसक्रिप्शन के लिए अक्सर 500-1200ms की लेटेंसी होती है, जिसमें बेहतर वाले 200-250ms के आसपास होते हैं। इसने उद्योग को सहज वास्तविक समय के इंटरैक्शन को सक्षम करने के लिए अति-कम विलंबता - 300ms से कम - की ओर धकेल दिया है।
इस गाइड में, हम सीखेंगे कि Smallest AI के Pulse STT का उपयोग करके एक AI वॉयस और स्पीच API को कैसे एकीकृत किया जाए जो इन आधुनिक मांगों को पूरा करता है। अंत तक, आप जानेंगे कि:
एक साधारण HTTP API का उपयोग करके ऑडियो फ़ाइलों (WAV/MP3) को टेक्स्ट में कैसे ट्रांसक्राइब करें
WebSockets के माध्यम से त्वरित ट्रांसक्रिप्ट के लिए लाइव ऑडियो कैसे स्ट्रीम करें
टाइमस्टैम्प, स्पीकर डायराइजेशन और भावना पहचान जैसी उन्नत सुविधाओं का लाभ कैसे उठाएं
आवाज क्षमताओं को एकीकृत करने के लिए 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:
curl -H "Authorization: Bearer $SMALLEST_API_KEY" \
https:
curl -H "Authorization: Bearer $SMALLEST_API_KEY" \
https:
प्रमाणीकरण हेडर सभी अनुरोधों के लिए इस हेडर की आवश्यकता होती है:
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) => {
reader .on ( "data" , ( chunk ) => chunks.push(chunk));
reader.on("end", () => {
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 () => {
console .log ( "✅ Connected to Pulse STT WebSocket" ) ;
for (let i = 0; i < 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) => setTimeout(r, chunkDuration * 1000));
}
ws.send(JSON.stringify({ type : "end" }));
console.log("📤 Sent end signal");
});
ws.on("message", (data) => {
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) => {
reader .on ( "data" , ( chunk ) => chunks.push(chunk));
reader.on("end", () => {
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 () => {
console .log ( "✅ Connected to Pulse STT WebSocket" ) ;
for (let i = 0; i < 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) => setTimeout(r, chunkDuration * 1000));
}
ws.send(JSON.stringify({ type : "end" }));
console.log("📤 Sent end signal");
});
ws.on("message", (data) => {
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) => {
reader .on ( "data" , ( chunk ) => chunks.push(chunk));
reader.on("end", () => {
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 () => {
console .log ( "✅ Connected to Pulse STT WebSocket" ) ;
for (let i = 0; i < 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) => setTimeout(r, chunkDuration * 1000));
}
ws.send(JSON.stringify({ type : "end" }));
console.log("📤 Sent end signal");
});
ws.on("message", (data) => {
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 खोलें (माइक्रोफ़ोन पहुंच के लिए)।
यह कैसे काम करता है डेमो दो सर्वर चलाता है:
Next.js (पोर्ट 3000) — React UI परोसता है और /api/transcribe के माध्यम से फ़ाइल अपलोड संभालता है
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 स्ट्रीमिंग जोड़ें।
संसाधन Smallest AI कंसोल — API कुंजी प्रबंधन
Waves दस्तावेज़ीकरण — पूर्ण API संदर्भ
Discord समुदाय — डेवलपर सहायता