Gemini 3.5 Transcribe में मीटिंग ट्रांसक्रिप्शन: व्यवहार में स्पीकर्स, टाइमस्टैम्प्स और शब्दावली
Gemini 3.5 Transcribe का उपयोग करके 45-मिनट की मीटिंग रिकॉर्डिंग को एक सत्यापित ट्रांसक्रिप्ट या सबटाइटल बेसलाइन में बदलने के लिए एक व्यावहारिक गाइड: कॉन्फ़िगरेशन फ़्लैग का चयन करना, लंबी ऑडियो फ़ाइलों को सही तरीके से विभाजित करना, Python SDK के माध्यम से वर्ड-लेवल टाइमस्टैम्प को असेंबल करना और मैन्युअल गुणवत्ता आश्वासन का संचालन करना।
विषय-सूची

किसी व्यावसायिक मीटिंग (business meeting) की ऑडियो रिकॉर्डिंग को एक विश्वसनीय कार्य दस्तावेज़ में बदलने के लिए स्पीच रिकग्निशन पैरामीटर्स को कॉन्फ़िगर करते समय सुविचारित आर्किटेक्चरल निर्णयों की आवश्यकता होती है। Gemini 3.5 Transcribe में कोई सार्वभौमिक “ऑल-इन-वन” मोड नहीं है: डीप एडिटोरियल नॉर्मलाइज़ेशन (smart), वक्ताओं का पृथक्करण (diarization_mode), वर्ड-लेवल टाइम ग्रिड (timestamp_granularities), और डोमेन-विशिष्ट शब्दावली (custom_vocabulary) परस्पर पृथक API क्षमताओं का प्रतिनिधित्व करते हैं।
प्रत्येक प्रोसेसिंग पाइपलाइन को अपना अंतिम उद्देश्य निर्धारित करके शुरू करना चाहिए: क्या आपको त्वरित पठन के लिए एक संक्षिप्त, पठनीय टेक्स्ट ब्लॉक की आवश्यकता है, डाउनस्ट्रीम विश्लेषण के लिए एक संरचित आधार चाहिए, या वीडियो संपादन (वीडियो एडिटिंग) के लिए सटीक टाइमस्टैम्प्स का एक ऐरे चाहिए? परस्पर अनन्य (mutually exclusive) पैरामीटर्स को संयोजित करने का प्रयास करने पर अनुरोध प्रोसेस होने से पहले ही स्कीमा वैलिडेशन एरर (schema validation errors) आ जाती हैं।
नीचे एक एंड-टू-एंड व्यावहारिक वॉकथ्रू दिया गया है: तकनीकी शब्दावली से भरी दो वक्ताओं की 45-मिनट की रिकॉर्डिंग कैसे तैयार करें, प्रलेखित API सीमाओं को कैसे नेविगेट करें, आधिकारिक Python SDK का उपयोग करके दोनों भागों को कैसे प्रोसेस करें, प्रारंभिक ड्राफ्ट डेटा संरचनाओं को कैसे असेंबल करें, ऑडियो रिकॉर्डिंग के साथ उनका सत्यापन और सुधार कैसे करें, और मीटिंग नोट-टेकर या सबटाइटल एडिटर को सत्यापित प्रतियां कैसे सौंपें।
आर्किटेक्चरल सीमाएं और पैरामीटर टकराव
इस पाइपलाइन को समझाने के लिए, एक सामान्य कार्य सत्र पर विचार करें: अलेक्सी (Alexey - Tech Lead) और मिखाइल (Mikhail - Product Manager) 45 मिनट तक माइग्रेशन आर्किटेक्चर और आंतरिक प्रोजेक्ट नामों DataPulse तथा CloudForge के तहत सेवाओं की तैनाती पर चर्चा करते हैं। इस बातचीत में तकनीकी शब्दावली, विदेशी शब्द (loanwords), तेज रुकावटें और गलत शुरुआतें (false starts) शामिल हैं।
Gemini 3.5 Transcribe के साथ इंटीग्रेशन डिजाइन करते समय, आपको तीन सख्त नियमों को ध्यान में रखना चाहिए:
- कस्टम वोकैबुलरी और स्ट्रक्चरल मेटाडेटा के बीच असंगति:
custom_vocabularyपैरामीटर (जो 1,000 शब्दों तक का समर्थन करता है, जिसमें व्यावहारिक सिफारिश 100 तक की है) कोdiarization_modeयाtimestamp_granularitiesके साथ पास नहीं किया जा सकता है। आपको एक डिज़ाइन समझौता करना होगा: या तो विशेष ब्रांड नामों को सटीक रूप से ट्रांसक्राइब करने के लिए मॉडल पर निर्भर रहें (स्वचालित स्पीकर लेबल और टाइमस्टैम्प छोड़ते हुए), या पोस्ट-प्रोसेसिंग के दौरान विशेष शब्दावली को सत्यापित करते हुए विस्तृत स्पीकर और समय संरेखण का अनुरोध करें। - स्मार्ट मोड और टाइमलाइन अलाइनमेंट के बीच असंगति:
smartमोड स्पीच नॉर्मलाइज़ेशन लागू करता है: यह व्याकरणिक सिंटैक्स का पुनर्गठन करते हुए बोलचाल के भराव शब्दों (filler words), हकलाहट और गलत शुरुआत को हटा देता है। चूँकि टोकन हटा दिए जाते हैं, मर्ज कर दिए जाते हैं, या पुनर्व्यवस्थित कर दिए जाते हैं, मॉडल परिणामी टेक्स्ट को अंतर्निहित ऑडियो स्ट्रीम की समयरेखा (temporal timeline) पर वापस मैप नहीं कर सकता है। नतीजतन,smartमोड में स्पीकर एट्रिब्यूशन और वर्ड-लेवल टाइमस्टैम्प अनुपलब्ध होते हैं। इसके अलावा, यह मोड केवल एनोटेशन-रहित निरंतर टेक्स्ट (output_text) लौटाता है और स्वचालित रूप से एक्शन आइटम नहीं निकालता है। - उन्नत मेटाडेटा के लिए 30-मिनट की सीमा: विस्तृत एनोटेशन के बिना मानक ट्रांसक्रिप्शन अनुरोध 60 मिनट तक की ऑडियो फ़ाइलों को स्वीकार करते हैं। हालाँकि, एक बार जब आप
diarization_modeयाtimestamp_granularitiesको सक्रिय करते हैं, तो प्रलेखित अधिकतम फ़ाइल अवधि घटकर 30 मिनट हो जाती है। इस सीमा से अधिक की फ़ाइलें सबमिट करना समर्थित API विनिर्देश से बाहर आता है और इसका प्रयास नहीं किया जाना चाहिए; लंबी ऑडियो को सबमिशन से पहले क्लाइंट-साइड पर विभाजित किया जाना चाहिए।
45-मिनट की रिकॉर्डिंग की तैयारी और विभाजन
45-मिनट की रिकॉर्डिंग से डायराइजेशन और वर्ड-लेवल टाइमस्टैम्प निकालने के लिए, स्रोत फ़ाइल को 30 मिनट से कम के खंडों में विभाजित किया जाना चाहिए। हमारे काल्पनिक परिदृश्य में, हम रिकॉर्डिंग को दो खंडों में विभाजित करते हैं:
- भाग 1 (Part 1): 00:00–25:00 (सटीक रूप से 1500.0 सेकंड माना गया);
- भाग 2 (Part 2): 25:00–45:00 (शेष 20 मिनट, या 1200.0 सेकंड)।
इस उदाहरण के लिए गणित को सरल बनाने के लिए यहाँ 1500.0-सेकंड की सीमा चुनी गई है। प्रोडक्शन वातावरण में, कट बोले गए टर्न के बीच प्राकृतिक बातचीत के ठहराव के दौरान लगाए जाने चाहिए, और पहले खंड की सटीक भौतिक अवधि को ffprobe जैसे निरीक्षण टूल का उपयोग करके सीधे मीडिया फ़ाइल मेटाडेटा से निकाला जाना चाहिए।
ऑडियो को विभाजित करने से निरंतरता (continuity) की दो महत्वपूर्ण चुनौतियाँ सामने आती हैं:
- दूसरे खंड में टाइमस्टैम्प रीसेट: API दूसरे खंड को पूरी तरह से स्वतंत्र फ़ाइल के रूप में प्रोसेस करता है, जिससे इसके आंतरिक वर्ड-लेवल ऑफ़सेट
0.000sसे शुरू होने के लिए रीसेट हो जाते हैं। पूरी मीटिंग के लिए एक सतत समयरेखा (continuous timeline) के पुनर्निर्माण के लिए, दूसरे खंड से निकाले गए प्रत्येक शब्द टाइमस्टैम्प में पहले खंड की वास्तविक अवधि को प्रोग्रामेटिक रूप से जोड़ा जाना चाहिए। - स्पीकर लेबल की स्थानीयता (Locality of Speaker Labels): मॉडल प्रत्येक अलग API कॉल के दायरे में स्वतंत्र रूप से
spk_1औरspk_2जैसे स्पीकर पहचानकर्ता निर्दिष्ट करता है। पहले खंड मेंspk_1के रूप में नामित वक्ता को दूसरे खंड मेंspk_2सौंपा जा सकता है। बिना सत्यापन के अलग-अलग अनुरोधों के समान तकनीकी लेबलों को मर्ज करने से स्पीकर एट्रिब्यूशन गड़बड़ा जाएगा। श्रवण स्पॉट-चेकिंग (auditory spot-checking) के माध्यम से वास्तविक प्रतिभागियों के साथ मैप की गई प्रत्येक खंड के लिए एक स्वतंत्र लुकअप टेबल की आवश्यकता होती है।
विभिन्न कार्यों के लिए कॉन्फ़िगरेशन वेरिएंट
ट्रांसक्रिप्शन पैरामीटर्स generation_config डिक्शनरी के transcription_config फ़ील्ड के अंदर कॉन्फ़िगर किए जाते हैं। नीचे विभिन्न परिचालन आवश्यकताओं के अनुरूप बेसलाइन कॉन्फ़िगरेशन दिए गए हैं।
स्पीकर लेबल या टाइमस्टैम्प के बिना सुसंगत, सामान्यीकृत मीटिंग नोट्स के लिए (60 मिनट से कम की पूरी फ़ाइलों के लिए उपयुक्त):
generation_config = {
"transcription_config": {
"mode": "smart"
}
}
विशिष्ट उत्पाद नामों या मालिकाना शब्दावली पर केंद्रित चर्चाओं के लिए जहां सटीक वर्तनी को प्राथमिकता दी जाती है:
generation_config = {
"transcription_config": {
"custom_vocabulary": ["DataPulse", "CloudForge", "ClickHouse", "gRPC"]
}
}
मीटिंग प्रोटोकॉल और सबटाइटल टाइमिंग ग्रिड जनरेट करने के लिए (30-मिनट की ऑडियो सीमा के अधीन):
generation_config = {
"transcription_config": {
"mode": {
"type": "verbatim",
"diarization_mode": "speaker",
"timestamp_granularities": ["word"],
}
}
}
Python SDK के साथ संपूर्ण वर्किंग पाइपलाइन: दोनों भागों को प्रोसेस करना
यह स्क्रिप्ट ऑडियो सुनने या मैन्युअल सत्यापन करने से पहले निष्पादित की जाती है। यह Files API के माध्यम से दोनों खंडों को अपलोड करती है, Interactions API को अनुरोध भेजती है, वर्ड-लेवल एनोटेशन निकालती है, टाइमस्टैम्प और स्पीकर पहचानकर्ताओं को मान्य करती है, दूसरे भाग की समयरेखा को 1500.0 सेकंड शिफ्ट करती है, और प्रारंभिक ड्राफ्ट फ़ाइलें लिखती है:
meeting_transcript.txt— स्पीकर टर्न द्वारा व्यवस्थित एक ड्राफ्ट UTF-8 संवाद ट्रांसक्रिप्ट;word_timestamps.json— सबटाइटल विभाजन के लिए निरंतर वर्ड-लेवल टाइमस्टैम्प का एक ड्राफ्ट ऐरे।
इस स्क्रिप्ट द्वारा निर्मित फ़ाइलें स्पष्ट रूप से असत्यापित ड्राफ्ट हैं, अंतिम रिकॉर्ड नहीं। प्रैक्टिशनर को रिकॉर्डिंग सुननी चाहिए, वास्तविक आवाज़ों के साथ तकनीकी स्पीकर टोकन को मैप करना चाहिए (speaker mapping), तकनीकी शब्दावली को सत्यापित करना चाहिए (terms), और समय ऑफ़सेट का ऑडिट करना चाहिए (time offsets)। इस ऑडिट को पूरा करने के बाद, कोड में कॉन्फ़िगरेशन पैरामीटर्स को अपडेट करें और पाइपलाइन को फिर से चलाएँ या जनरेट की गई टेक्स्ट फ़ाइलों को सीधे संपादित करें। केवल इस सत्यापन प्रोटोकॉल के बाद ही अंतिम प्रतियां नोट-टेकर या कैप्शन एडिटर को सौंपी जानी चाहिए।
यह स्क्रिप्ट विश्लेषकों और वीडियो संपादकों के लिए मध्यवर्ती डेटा संरचनाएं बनाती है; यह स्वचालित रूप से एक्शन आइटम या स्वरूपित .srt सबटाइटल फ़ाइलें उत्पन्न नहीं करती है। इस काल्पनिक परिदृश्य के भीतर प्रदर्शन उद्देश्यों के लिए स्पीकर के नाम और 1500.0-सेकंड की सीमा निर्दिष्ट की गई है।
import json
from google import genai
client = genai.Client()
audio_part1 = client.files.upload(file="meeting_part1.mp3")
audio_part2 = client.files.upload(file="meeting_part2.mp3")
transcription_mode_config = {
"transcription_config": {
"mode": {
"type": "verbatim",
"diarization_mode": "speaker",
"timestamp_granularities": ["word"],
}
}
}
interaction_part1 = client.interactions.create(
model="gemini-3.5-transcribe",
input=[
{
"type": "audio",
"uri": audio_part1.uri,
"mime_type": audio_part1.mime_type,
}
],
generation_config=transcription_mode_config,
)
interaction_part2 = client.interactions.create(
model="gemini-3.5-transcribe",
input=[
{
"type": "audio",
"uri": audio_part2.uri,
"mime_type": audio_part2.mime_type,
}
],
generation_config=transcription_mode_config,
)
def extract_word_annotations(interaction):
words = []
for step in getattr(interaction, "steps", []) or []:
for content in getattr(step, "content", []) or []:
for annotation in getattr(content, "annotations", []) or []:
if getattr(annotation, "type", None) == "word_info":
words.append(annotation)
return words
def parse_offset_seconds(offset_val, word_text):
if offset_val is None or offset_val == "":
raise ValueError(f"Отсутствует таймкод для слова '{word_text}'. Требуется проверка аудиозаписи.")
val_str = str(offset_val)
if val_str.endswith("s"):
val_str = val_str[:-1]
try:
return float(val_str)
except ValueError:
raise ValueError(f"Некорректный формат таймкода '{offset_val}' для слова '{word_text}'. Требуется проверка аудиозаписи.")
words_part1 = extract_word_annotations(interaction_part1)
words_part2 = extract_word_annotations(interaction_part2)
if not words_part1 or not words_part2:
raise ValueError("Один из аудиосегментов не содержит пословных аннотаций. Пустой результат не может считаться успешным.")
part1_offset_seconds = 0.0
part2_offset_seconds = 1500.0
manual_mapping_part1 = {
"spk_1": "Алексей",
"spk_2": "Михаил",
}
manual_mapping_part2 = {
"spk_1": "Михаил",
"spk_2": "Алексей",
}
unified_word_stream = []
for word in words_part1:
text = getattr(word, "text", "")
raw_speaker = getattr(word, "speaker", None)
if not raw_speaker or raw_speaker not in manual_mapping_part1:
raise ValueError(f"Неизвестный спикер '{raw_speaker}' в части 1. Требуется ручная верификация по аудио.")
resolved_speaker = manual_mapping_part1[raw_speaker]
word_start = parse_offset_seconds(getattr(word, "start_offset", None), text) + part1_offset_seconds
word_end = parse_offset_seconds(getattr(word, "end_offset", None), text) + part1_offset_seconds
unified_word_stream.append({
"text": text,
"speaker": resolved_speaker,
"start_seconds": word_start,
"end_seconds": word_end,
"part": 1,
})
for word in words_part2:
text = getattr(word, "text", "")
raw_speaker = getattr(word, "speaker", None)
if not raw_speaker or raw_speaker not in manual_mapping_part2:
raise ValueError(f"Неизвестный спикер '{raw_speaker}' в части 2. Требуется ручная верификация по аудио.")
resolved_speaker = manual_mapping_part2[raw_speaker]
word_start = parse_offset_seconds(getattr(word, "start_offset", None), text) + part2_offset_seconds
word_end = parse_offset_seconds(getattr(word, "end_offset", None), text) + part2_offset_seconds
unified_word_stream.append({
"text": text,
"speaker": resolved_speaker,
"start_seconds": word_start,
"end_seconds": word_end,
"part": 2,
})
dialogue_turns = []
current_turn = None
for item in unified_word_stream:
if current_turn is None or current_turn["speaker"] != item["speaker"] or current_turn["part"] != item["part"]:
if current_turn is not None:
dialogue_turns.append(current_turn)
current_turn = {
"part": item["part"],
"speaker": item["speaker"],
"start_seconds": item["start_seconds"],
"end_seconds": item["end_seconds"],
"words": [item["text"]],
}
else:
current_turn["end_seconds"] = item["end_seconds"]
current_turn["words"].append(item["text"])
if current_turn is not None:
dialogue_turns.append(current_turn)
def format_timestamp(seconds):
minutes = int(seconds // 60)
remaining_seconds = seconds % 60
return f"{minutes:02d}:{remaining_seconds:06.3f}"
with open("meeting_transcript.txt", "w", encoding="utf-8") as f_transcript:
for turn in dialogue_turns:
start_str = format_timestamp(turn["start_seconds"])
end_str = format_timestamp(turn["end_seconds"])
speech_text = " ".join(turn["words"])
f_transcript.write(f"[{start_str} - {end_str}] {turn['speaker']}: {speech_text}\n")
with open("word_timestamps.json", "w", encoding="utf-8") as f_json:
json.dump(unified_word_stream, f_json, ensure_ascii=False, indent=2)
वर्ड-लेवल संरचना और निरीक्षण क्षेत्रों का उदाहरणात्मक विवरण
नीचे वक्ताओं के टर्न ट्रांज़िशन (speaker transition) के दौरान निकाले गए डेटा स्ट्रीम का एक सिंथेटिक निरूपण दिया गया है।
नोट: यह स्निपेट केवल लौटाए गए ऑब्जेक्ट्स की संरचना को दर्शाने के लिए एक उदाहरण के रूप में है, न कि एक वास्तविक API कॉल लॉग के रूप में। वास्तविक ट्रांसक्रिप्शन गुणवत्ता ध्वनिकी, माइक्रोफ़ोन और बोलने की स्पष्टता पर निर्भर करती है, और पहचान गुणवत्ता की जांच अवश्य की जानी चाहिए।
[Строка 1] [spk_1] (0.100s -> 0.420s) Мы
[Строка 2] [spk_1] (0.450s -> 0.810s) переносим
[Строка 3] [spk_1] (0.830s -> 1.250s) ДатаПульс
[Строка 4] [spk_1] (1.300s -> 1.550s) на
[Строка 5] [spk_1] (1.600s -> 2.100s) CloudForge.
[Строка 6] [spk_1] (2.300s -> 2.600s) Да,
[Строка 7] [spk_2] (2.650s -> 2.900s) согласен,
[Строка 8] [spk_2] (2.950s -> 3.400s) э-э-э,
[Строка 9] [spk_2] (3.420s -> 3.900s) логично.
मैन्युअल समीक्षा के लिए महत्वपूर्ण चेकलिस्ट:
- लेबलों को वास्तविक प्रतिभागियों से मैप करना (पंक्तियाँ 1–5 और 7–9): पहचानकर्ता
spk_1औरspk_2मनमाने स्थितीय वॉइस टोकन हैं। वास्तविक पहचान स्थापित करने के लिए एक संपादक को प्रत्येक खंड के शुरुआती क्षणों को अवश्य सुनना चाहिए: उदाहरण के लिए, यह सत्यापित करना कि भाग 1 में,spk_1अलेक्सी (Alexey) से मेल खाता है औरspk_2मिखाइल (Mikhail) से। - टर्न हैंडऑफ़ और संक्षिप्त अंतर्विक्षेपण (पंक्ति 6): शब्द “Да,” को
spk_1के टर्न में समूहीकृत किया गया है। सक्रिय बातचीत में, यह वास्तव में श्रोता (spk_2) की ओर से एक ओवरलैपिंग सकारात्मक सहमति (affirmative nod) या बैकचैनल प्रतिक्रिया हो सकती है। स्पीकर हैंडऑफ़ सीमाओं के लिए लक्षित श्रवण क्रॉस-चेक की आवश्यकता होती है। - अपरिचित ब्रांडों की ध्वन्यात्मक वर्तनी (पंक्ति 3):
custom_vocabularyअक्षम होने पर, अंग्रेज़ी के तकनीकी नामों को सिरिलिक (Cyrillic) में ध्वन्यात्मक रूप से ट्रांसक्राइब किया जा सकता है (जैसे,ДатаПульс)। एक संपादक को इन प्रविष्टियों को उनके प्रामाणिक प्रारूपDataPulseमें समायोजित करना चाहिए। - अंधाधुंध वैश्विक प्रतिस्थापन का निषेध (Prohibition of Blind Global Replacement): शब्दावली संपादन हमेशा संदर्भ के अनुसार चुनिंदा रूप से लागू किए जाने चाहिए। पूरे दस्तावेज़ में व्यापक “फ़ाइंड-एंड-रिप्लेस” (find-and-replace) ऑपरेशन से सामान्य शब्दों, मुहावरों या शाब्दिक उद्धरणों के भ्रष्ट होने का जोखिम होता है जो ध्वन्यात्मक समानताएं साझा करते हैं।
- बातचीत में झिझक और भराव शब्द (पंक्ति 8):
verbatimमोड में, “э-э-э” जैसे संकोच चिह्नों को स्पष्ट रूप से कैप्चर किया जाता है। एक परिष्कृत मीटिंग प्रोटोकॉल में, इन्हें हटा दिया जाता है। हालाँकि, वीडियो सबटाइटल ट्रैक के लिए, उनका समय संरक्षित किया जाना चाहिए यदि सबटाइटल की गति को स्क्रीन पर दृश्य अभिव्यक्ति (articulation) के साथ संरेखित करने की आवश्यकता हो।
सामग्री सौंपने से पहले स्पॉट-चेकिंग का प्रोटोकॉल
प्रोग्रामेटिक संयोजन द्वारा उत्पन्न कच्चे डेटा को तीन सत्यापन चौकियों (checkpoints) पर केंद्रित गुणवत्ता ऑडिट पास करना होगा:
- स्पीकर्स और संवादात्मक सीमाओं को सत्यापित करें: 2–3 स्पीकर टर्न ट्रांज़िशन में 15–20 सेकंड का ऑडियो सुनें। पुष्टि करें कि अलग-अलग आवाज़ें एक ही वक्ता में विलीन नहीं हुई हैं और निरंतर एकालाप प्रेत लेबलों (phantom labels) में खंडित नहीं हुए हैं। आधिकारिक दस्तावेज़ीकरण के अनुसार, तीन या अधिक प्रतिभागियों वाली बैठकों के लिए डायराइजेशन प्रयोगात्मक है और इसके लिए काफी सख्त जांच की आवश्यकता होती है।
- शब्दावली, संख्यात्मक मानों और नामित संस्थाओं (Named Entities) को सत्यापित करें:
प्रमुख प्रोजेक्ट नामों (
DataPulse,CloudForge, संस्करण संख्या, बजट आवंटन) की एक लक्षित चेकलिस्ट संकलित करें। टेक्स्ट में इन वस्तुओं को खोजें और ऑडियो के साथ अनिश्चित खंडों को सीधे क्रॉस-रेफ़रेंस करें, अंधाधुंध बड़े पैमाने पर प्रतिस्थापन से बचें। - खंड सीमाओं के पार समयरेखा निरंतरता सत्यापित करें: भाग 1 के पहले मिनट की तुलना भाग 2 के ब्रिज से करें (25:00 / 1500.0-सेकंड की सीमा के ठीक बाद)। सुनिश्चित करें कि दूसरे खंड के टाइमस्टैम्प शून्य पर रीसेट होने के बजाय समयरेखा को निर्बाध रूप से जारी रखते हैं।
डाउनस्ट्रीम हैंडऑफ़ और प्रक्रिया रोकने की शर्तें
स्क्रिप्ट द्वारा जनरेट की गई meeting_transcript.txt और word_timestamps.json फ़ाइलें श्रवण समीक्षा से पहले बनाई जाती हैं और इन्हें कड़ाई से प्रारंभिक ड्राफ्ट के रूप में माना जाना चाहिए। इन्हें कभी भी उनकी कच्ची स्थिति में न सौंपें। पहले मैन्युअल सत्यापन प्रोटोकॉल निष्पादित करें, ऑडियो के साथ स्पीकर पहचान, शब्दावली और समयरेखा ऑफ़सेट का मिलान करें, आउटपुट को सही करें (कोड पैरामीटर्स को अपडेट करके और फिर से चलाकर या सीधे फ़ाइलों को संपादित करके), और उसके बाद ही डाउनस्ट्रीम में सत्यापित प्रतियां जारी करें:
- नोट-टेकर्स या सारांश मॉडल के लिए (Note Taker / LLM Summarization): मीटिंग ट्रांसक्रिप्ट की एक सत्यापित प्रति प्रदान करें—पुष्ट स्पीकर एट्रिब्यूशन और सामान्यीकृत तकनीकी शब्दों के साथ एक समीक्षित दस्तावेज़। यह कार्यकारी सारांशों और निर्णय लॉग के लिए आधार के रूप में कार्य करता है, हालाँकि यह अपने आप में एक स्वचालित एक्शन आइटम सूची का गठन नहीं करता है।
- वीडियो संपादकों या कैप्शन विशेषज्ञों के लिए (Caption Editor): वर्ड टाइमस्टैम्प ऐरे की एक सत्यापित प्रति प्रदान करें—निरंतर टाइमस्टैम्प्स पर पिन किए गए शब्दों का एक मान्य अनुक्रम। डाउनस्ट्रीम स्टाइलिंग नियम (स्क्रीन अवधि सीमाएं, लाइन लंबाई सीमाएं, पढ़ने की गति) लक्ष्य वीडियो प्लेयर और भाषा पर निर्भर करते हैं, जिसके बाद एक समर्पित स्वरूपण टूल अंतिम
.srtया.vttकैप्शन फ़ाइलें जनरेट करता है।
प्रक्रिया रोकने की शर्तें (Process Stop Conditions)
वर्कफ़्लो को रोकें और डाउनस्ट्रीम टीमों को फ़ाइलें न सौंपें यदि निम्न में से कोई भी शर्त पूरी होती है:
- पूर्व विभाजन के बिना 30 मिनट से अधिक की ऑडियो डायराइजेशन या वर्ड टाइमस्टैम्प के लिए सबमिट की गई थी (यह प्रलेखित API सीमाओं से अधिक है और इसे नहीं भेजा जाना चाहिए)।
- श्रवण स्पॉट-चेकिंग और मैन्युअल समीक्षा के बिना स्क्रिप्ट निष्पादन के तुरंत बाद डाउनस्ट्रीम उपयोगकर्ताओं को कच्ची ड्राफ्ट फ़ाइलें (
meeting_transcript.txtयाword_timestamps.json) जारी की गईं। - ऑडियो सुने बिना पहले खंड के लेबल नंबरों के आधार पर दूसरे खंड में स्पीकर लेबलों को आँख मूंदकर मैप किया गया था, या डेटासेट में अनसुलझे स्पीकर पहचानकर्ता बने रहे।
- पहले खंड की भौतिक अवधि दूसरे खंड की समयरेखा में नहीं जोड़ी गई थी, या छूटे हुए शब्द टाइमस्टैम्प का पता चला है।
- प्रासंगिक सत्यापन के बिना शब्दावली पर अंधाधुंध वैश्विक फ़ाइंड-एंड-रिप्लेस नियम लागू किए गए थे, या महत्वपूर्ण कॉन्फ़िगरेशन पैरामीटर्स और संख्यात्मक आंकड़ों को रिकॉर्डिंग के खिलाफ असत्यापित छोड़ दिया गया था।