BeginnerStart here. No prior knowledge assumed.
How to use this page
This page walks you through one product: taking a recorded call — a video KYC session, a
collections call, a support call — and turning it into a written record you can search, prove and
hand to an auditor three years later.
How to read it. Every step opens with a short story in plain words: what is actually
happening, and why anyone needs this step at all. Read those ten stories top to bottom and you will
understand the whole product in about ten minutes, without knowing a single tool name.
Underneath each story are the technical details, and below those, the ways of doing it folded
away behind a +. Open one only when you are building that step. Everything collapsed is
a choice; everything already open is the workflow.
Prices only where the company publishes them. Licences stated for every open-source tool, because
“free” and “usable by a regulated business” are not the same thing and
this page names three popular tools where they come apart.
NoteThis guide is the second half of a pair. Guide 20 ends by telling you to record the call and keep it for five years. This guide is what you do with that recording. If you have not read that one, you do not need to — but its Step 6 is where this page begins.
What you are actually building
You have an audio file. A person is talking in it. You need six things from it that the audio alone
cannot give you:
- Words you can read, so nobody has to listen to 40 minutes to find one sentence.
- Times, so you can jump to the moment a thing was said.
- Who said it, because “the customer agreed” and “the agent said
she agreed” are different facts.
- Numbers in the form people write them, so a search for “25,000” finds a
call where someone said “twenty-five thousand”.
- A flag on anything sensitive, because an Aadhaar number read aloud is now sitting in
your database in plain text.
- Proof it has not been tampered with, because the whole point is that somebody may
one day question it.
Ten steps. Each one produces something the next one needs.
The whole pipeline, in one table
Read this table once and the rest of the page is detail.
Watch outSteps 4, 5 and 6 may not apply to you. If you use one of OpenAI’s own Whisper checkpoints, step 6 is already done — it writes punctuation itself, though check the output if you are running an Indian-language fine-tune. If you record each person on their own audio channel, step 5 disappears entirely, and that is the single best engineering decision on this page. Each step says plainly when you can skip it. A shorter pipeline is a better pipeline.
IntermediateBuild it. Pipelines, tools and working code.
Step 1 — ingest
Step 1
Ingest — open it, check it, standardise it, fingerprint it
A file lands in your system. You did not make it, and you do not actually know what is inside it.
It might be a video call from a browser, or a phone call recorded by a telecom system, or something an agent uploaded from a laptop. The sound inside could be in any of a dozen formats, at different qualities, with the customer and the agent mixed together or kept apart. Some files have video attached that you do not need.
Every later step expects one exact shape of sound. So the first job is to look inside the file, convert what you find into that one shape, and take a fingerprint — a short code that proves, years later, that the file you are holding is the file you were given and nobody has quietly changed it.
- What it does
- inspects the container, extracts the audio, converts it to one standard format, and records a hash of what arrived and what you produced.
- The standard shape
- 16,000 samples per second, single channel, uncompressed. Not a convention — the speech models require it.
- Why it is not trivial
- the default behaviour of every tool here silently picks one audio track. On a two-track recording that means you just threw away the customer.
- Pick by
- nothing. There is one real answer.
The tool — FFmpeg, and the licence question that matters to a regulated business
What it is: the universal tool for reading, converting and inspecting audio and video. Its inspection command, ffprobe, “gathers information from multimedia streams and prints it in human- and machine-readable fashion” [1].
The licence has two modes and the difference is decided when the binary is built, not when you use it. FFmpeg is “licensed under the GNU Lesser General Public License (LGPL) version 2.1 or later”, but “incorporates several optional parts and optimizations that are covered by the GNU General Public License (GPL) version 2 or later. If those parts get used the GPL applies to all of FFmpeg” [2].
Building with --enable-gpl — required by libx264, libx265 and others — makes the whole thing GPL. Building with --enable-nonfree produces a binary that is, in the project’s own words, unredistributable [3].
What this means for you: an audio-only pipeline needs none of the GPL-only libraries, so a stock LGPL build is enough. But most Linux distributions ship a GPL build. If you ship a container image to anyone, run ffmpeg -version and read what your base image actually compiled in. This site did not verify how the common Debian, Ubuntu or Alpine packages are built — check yours.
The three commands, and the default that will bite you
Look inside first: ffprobe -v error -show_format -show_streams -of json input.webm [1].
Convert to the standard shape: ffmpeg -i input.webm -ac 1 -ar 16000 -c:a pcm_s16le output.wav — -ar sets the sampling frequency, -ac the number of channels [4].
Strip the video: add -vn, which “disables video recording” [4].
Now the trap. With no -map, FFmpeg picks “the stream with the most channels” [4]. On a call recorded with the agent on one track and the customer on another, that default silently selects one of them and discards the other — with no error. Always name the track: -map 0:a:0 and -map 0:a:1.
What arrives, and why 8kHz phone audio must not be "upgraded"
Browser calls: WebRTC requires Opus and G.711 as mandatory codecs [5], and browser recording typically produces Opus in a WebM container at 48kHz [6].
Phone calls: usually G.711 at 8kHz. These are two genuinely different quality regimes and you should not treat them as one input.
Google’s own guidance, which contradicts the usual advice: “If possible, set the sampling rate of the audio source to 16000 Hz. Otherwise, set the sample_rate_hertz to match the original sample rate of the audio source (instead of re-sampling)” [7].
Converting 8kHz phone audio up to 16kHz adds no information — everything above 4kHz was gone at capture. You do it only because a model demands that input, never to improve accuracy. Expect worse results on phone calls and do not be surprised by them.
And convert only once. A published study of Opus compression found relative word-error degradation of 202% at 8kbps, 12.6% at 16kbps and 2.4% at 128kbps [8] — on far-field English with a proprietary dataset, so treat the shape of that curve as the lesson, not the numbers. Google’s own advice is to “use a lossless codec to record and transmit audio” [7].
Fingerprinting — take two hashes, not one
Hash the original file bytes. This is what an auditor wants: proof the artefact you hold is the artefact you received.
Also hash the decoded audio. FFmpeg has a built-in hash output that “computes and prints a cryptographic hash of all the input audio and video frames”, supporting MD5, SHA160, SHA256, SHA512, CRC32 and adler32 [9].
Why both? A file hash changes if anyone remuxes the container, even when the sound is bit-identical — metadata, timestamps and internal ordering all differ. So a file hash answers “is this the same upload” and cannot answer “is this the same call”. The decoded hash answers the second.
Two practical warnings. Pass -hash sha256 explicitly; this site could not verify what the default is. And store the exact command and FFmpeg version alongside the hash, because changing the sample rate or the resampler changes the hash for the same audio.
Feeds into: everything. If it breaks: quietly, and you find out much later — a dropped second channel or a double re-encode produces a working pipeline with a worse answer, not an error.
Step 2 — find the speech
Step 2
Find the speech — a safety control, not an optimisation
Most of a real call is not talking.
It is ringing, hold music, the customer walking to another room, the long pause while somebody finds their card. If you hand the whole recording to a transcription model, it will dutifully try to transcribe the silence too.
And here is the part that should worry you: it does not return nothing. It makes something up. Fed silence and background noise, these models have a strong documented tendency to write plausible-sounding sentences that nobody said — most often "thank you" or "thanks for watching", learned from the internet videos they were trained on.
So this step finds the parts where someone is actually speaking and passes on only those. It makes the pipeline faster and cheaper, but that is not why it is here. It is here to stop invented sentences entering a financial record you must keep for five years.
- What it does
- marks the regions of the audio that contain speech, and discards the rest before transcription.
- Why it is a control, not a tweak
- see the evidence below. On non-speech audio, a leading model hallucinated in 40.3% of cases.
- Bonus
- it also makes transcription several times faster and, measurably, slightly more accurate.
- Pick by
- whether you need it to work on noisy phone audio, which eliminates one popular option.
The evidence — read this before deciding it is optional
On 301,317 non-speech audio files fed to Whisper large-v3, “hallucinations appeared 121,378 times (40.3%)”. They are strikingly repetitive — the top 30 account for 67% of all output, led by “thank you” at 24.76% and “thanks for watching” at 10.32%. The authors’ recommended mitigation is a filter combined with voice activity detection [10].
In a peer-reviewed study of real transcripts, roughly 1% contained “entire hallucinated phrases or sentences which did not exist in any form in the underlying audio”, and 38% of those contained explicit harms — violence, fabricated personal associations, invented claims of authority. Critically, speakers with longer non-vocal pauses were hallucinated against at disproportionately higher rates [11].
That last finding is the mechanism. Silence induces hallucination. A collections call with long dead air is exactly the worst case.
And it improves accuracy, not just safety: WhisperX reports word error falling from 10.52% to 9.70% with voice-detection preprocessing, with a 2.7× speed-up at batch size 1 rising to 11.8× batched [12].
Option A — Silero VAD (the default recommendation)
Licence: MIT, not gated [13]. The cleanest licence position of the three — no account, no terms to accept, no contact details surrendered.
Size and speed: the model is around two megabytes; the project states one 30ms chunk takes under 1ms on a single CPU thread, with published measurements from 189µs to 830µs per chunk depending on version and runtime [14].
Handles 8kHz natively as well as 16kHz — which matters, because that is what phone calls are.
Published accuracy on a 17-hour multi-domain set: ROC-AUC 0.97 and accuracy 0.92, against WebRTC’s 0.73 and 0.74 [15]. Caveat stated honestly: this is Silero benchmarking its own model against a competitor. The datasets are named and public, which is more than most vendors offer, but it is not independent, and none of them is Indian-language telephony.
Option B — WebRTC VAD, and why the free default disappoints
Licence: BSD 3-Clause for the underlying code, MIT for the common Python wrapper [16]. Permissive, ungated.
How it works: not a neural network. It is a Gaussian Mixture Model comparing log energy across six frequency bands and running a likelihood-ratio test between “noise” and “speech” [17]. Fast, tiny, and old.
The failure that matters: in the comparison above it scored 0.00 accuracy on environmental-noise-only audio [15] — it classifies most background noise as speech. On a noisy Indian collections call with traffic, a television and background conversation, it will not remove any of it.
Note also that Google publishes no accuracy claim for it at all. Everything you will read about its quality is third-party.
Option C — pyannote, if you are already using it for Step 5
Licence: MIT for the toolkit; the segmentation model is MIT but gated — you must share contact information and accept conditions before downloading [18].
The gate is not a licence restriction, it is a contact-information wall, and MIT permits commercial use. But it has an operational consequence: your build pipeline now depends on a third party’s consent flow and a Hugging Face token. Mirror the weights into your own artifact store once accepted, and record the acceptance.
This site found no published standalone accuracy figure for pyannote as a speech detector — the project publishes diarization error rates, which is a different measurement. If you are not already using pyannote for Step 5, there is no evidence-backed reason to choose it here.
Feeds into: Step 3, which should only ever see speech. If it breaks: invented sentences enter an auditable record, and nothing downstream can tell they were invented.
Step 3 — transcribe
Step 3
Transcribe — and the finding that changes everything for India
This is the step everyone thinks is the whole product: sound goes in, words come out.
It is also where most of your accuracy is won or lost, and where the advice you will find online is most likely to be wrong for you. Almost every recommendation written in English assumes the call is in English, recorded on a decent microphone, with one person speaking clearly at a time.
Your calls are not that. They are in Hindi, or Hindi mixed with English, over a phone line, from someone in a market or on a bus, with an accent from one of twenty-odd language backgrounds. The gap between those two situations is not small — on published benchmarks it is the difference between getting about 3 words wrong in 100 and getting 32 wrong in 100.
So this step is mostly about choosing a model that has actually been measured on speech like yours.
- What it does
- converts the speech regions from Step 2 into text.
- The number that should frame your choice
- Whisper scores 2.7% word error on clean read English and 32.4% on accented Hindi. Benchmarks do not transfer.
- Batch, not live
- you are not in a hurry here. Unlike a live call, accuracy matters far more than speed — a completely different calculus from Guide 20.
- Pick by
- published accuracy on Indian speech specifically. Almost nothing else matters.
Option A — IndicWhisper / AI4Bharat, if your calls are in Indian languages
Licence: MIT for the fine-tuned models, stated in the project repository [19]. Built by AI4Bharat and IIT Madras, published at Interspeech 2023, covering 12 Indian languages. Hindi fine-tuning used 2,150 hours of Indian speech.
Published Hindi word error rate, averaged across seven benchmarks: 13.6%, against Google’s 23.9% and Azure’s 20.0% [20]. Across all 12 languages: 24.6 against Google’s 44.3.
Now look at the telephone column, because it is the honest one. On Gramvaani — spontaneous, telephone-quality, rural Hindi — every system roughly doubles or triples its error. Google goes from 19.4 to 59.9. IndicWhisper goes from 11.4 to 26.8 [20]. It is still the best of the group by a wide margin, and it is still getting one word in four wrong. Plan for that number, not the headline.
Also from AI4Bharat: a 600-million-parameter Conformer covering all 22 scheduled Indian languages, MIT licensed but gated on Hugging Face, with published Hindi accuracy of 13.2% word error on an independent benchmark [21].
Option B — OpenAI Whisper, the general-purpose default
Licence: permissive, with a discrepancy worth knowing. The repository says “Whisper’s code and model weights are released under the MIT License” [22], while the model card for large-v3 states Apache 2.0 [23]. Both permit commercial use; your compliance team will still ask, so have the answer ready.
What hardware you need, from the project’s own table: large needs about 10GB of video memory, turbo about 6GB, medium about 5GB, small about 2GB [22].
But use faster-whisper instead of the original. Also MIT [24], it is “a reimplementation of OpenAI’s Whisper model… up to 4 times faster… while using less memory”, and its published benchmark runs large-v2 in 2,926MB at int8 precision — which puts the largest model on an 8GB consumer card. It ships Silero VAD integration, covering Step 2 for you.
On Hindi: OpenAI publishes per-language accuracy only as an image, not as numbers. Independent measurement puts Whisper V3 at 32.4% word error on accented Hindi [25] — against the 2.7% its own paper reports on clean read English [55]. That order-of-magnitude gap is the single most useful fact on this page.
Option C — the cloud services, with published batch rates
All rates below are pre-recorded/batch, read from the vendors’ own pricing pages in September 2026.
Google: dynamic batch $0.003/min; standard on-demand tiers from $0.016 down to $0.004 [26]. Supports Hindi plus nine other Indian languages. Each channel is billed separately.
AssemblyAI: Universal-2 at $0.15/hour ($0.0025/min), Universal-3.5 Pro at $0.21/hour; speaker separation is a separately priced add-on at +$0.02/hour [27]. Hindi plus nine Indian languages.
Deepgram: Nova-3 monolingual $0.0043/min, multilingual $0.0052 [28]. Hindi plus nine Indian languages, and speaker separation is included for pre-recorded audio.
AWS Transcribe: $0.006/min batch [29]. Supports Hindi — but note that content redaction is not supported for Hindi [30], which matters for Step 8.
Azure: this site could not verify a single rate. The pricing page renders every figure as a placeholder and requires sign-in [31]. The billing units are published; the prices are not.
The option to cross off your list — and it is the one everyone recommends
NVIDIA’s open speech models, Parakeet and Canary, are excellent, cleanly licensed under CC-BY-4.0, ungated, and fast. They are also the models most confidently recommended in every technical blog post about self-hosted transcription.
They support zero Indian languages. Parakeet v3 and Canary-1b-v2 each cover 25 languages, all European [32][33]. Parakeet v2 is English only.
If your calls are in Hindi or any Indian language, the most-recommended open option on the internet is simply not available to you, and no amount of tuning changes that. Cross it off and move on.
Feeds into: Steps 4 through 8, all of which operate on this text. If it breaks: every downstream step confidently processes the wrong words — and Step 4 will pin them to precise timestamps, which makes them look more credible, not less.
Step 4 — align
Step 4
Align — pin every word to the exact moment it was said
Your transcription already came with rough timings. They are usually good enough to follow along, and usually wrong by a few tenths of a second.
That matters more than it sounds. If a dispute turns on whether the customer said "yes" before or after the agent explained the charges, a third of a second is the whole argument. And if you want a reviewer to click a word and hear it, the timings have to actually land on the word.
Alignment fixes this by going back over the audio with the words already known. It is a much easier problem than transcription — the model no longer has to work out what was said, only when.
But there is a trap here that you should understand before you build it, and it is the reverse of what you would expect. Alignment makes a transcript look more trustworthy without making it more correct. If Step 3 heard the wrong word, Step 4 will pin that wrong word to a precise millisecond, and it will look authoritative.
- What it does
- takes the audio plus the known words, and finds the exact start and end time of each one.
- Why it works better than transcription
- the word sequence is fixed; only the timing is being solved.
- The ceiling
- alignment quality is capped by transcript quality — 98.35% accurate with a correct transcript, 85.65% with a machine transcript.
- Pick by
- whether your language has a model. For Hindi this is a real constraint.
Option A — NeMo Forced Aligner
Licence: Apache 2.0 [34] — the cleanest of the group, and notably the toolkit licence genuinely applies here, unlike NVIDIA’s punctuation models in Step 6.
No pronunciation dictionary required, works with CTC models, handles hour-long files, supports 14+ languages, outputs word and segment-level timings [35].
Published accuracy, and it contains the number that should shape your expectations: on the AMI test set at a 200ms threshold, 98.35% precision and recall using a correct reference transcript — but 85.65% precision and 71.09% recall when fed a machine transcript [36].
Read that gap. Alignment cannot repair Step 3. It can only place whatever words it is given.
Option B — WhisperX, if you are already using Whisper
Licence: BSD 2-Clause [37].
What it does: replaces Whisper’s generated timings with measured ones, by running a phoneme-level model over the audio and applying dynamic time warping. Published word-segmentation precision and recall of 84.1/60.3 on meeting audio and 93.2/65.4 on telephone speech [12].
Note that recall of 65% figure. Even at its best, on telephone audio, roughly a third of words are not placed within 200ms of where they belong.
On languages: five languages use built-in alignment models — English, French, German, Spanish and Italian — and a further set, including Hindi, have default models pulled from Hugging Face automatically [37]. So Hindi word-level timings work without configuration, which is worth knowing given how much else on this page does not cover Indian languages.
Its own documented limits are worth quoting: words containing characters outside the alignment dictionary cannot be timed, and “overlapping speech is not handled particularly well” [37].
Option C — Montreal Forced Aligner, and why it probably is not for you
Licence: MIT [38]. Well-established, built on Kaldi, and measured as “comparable to human annotators on average” with mean word boundary error of 24ms on conversational speech [39].
But it needs a pronunciation dictionary as well as an acoustic model, which is the practical barrier — the other options here need neither.
And for Indian languages the models mostly do not exist. Among South Asian languages only Tamil has a published pretrained acoustic model; there is no Hindi model [40].
It also fails hard rather than degrading. In an independent evaluation it scored respectably on the files it processed — but only 5 of 16 files aligned at all [36].
One serious warning if you go looking for an Indian-language alternative. AI4Bharat publishes IndicMFA with models for Indian languages, but no licence is stated on the repository [41]. Under standard terms, code published without a licence is all-rights-reserved by default. Do not deploy it in a regulated business without written clarification.
What this step does NOT give you — read before showing anyone a timestamped transcript
There is one peer-reviewed study of using this technology for forensic transcription, and it is a warning rather than an endorsement.
On poor-quality audio, the researchers found the forced aligner incorrectly matched transcripts to non-speech sounds including drumming and laughter. Their conclusion is blunt: “computational methods are not suitable for solving the issue of transcription of indistinct forensic audio for a range of reasons.” They specifically flag that transcripts can be matched to audio through alignment, appearing correct despite being entirely inaccurate, and note that “injustices can, and have, occurred” where questionable transcripts were treated as evidence [42].
This site found no published source establishing forced alignment as a method for producing evidentiary transcripts. The one relevant paper argues the opposite.
So: use alignment to make a transcript navigable and reviewable by a human. Do not present the precision of the timestamps as evidence of the accuracy of the words.
Feeds into: Step 5, which needs word timings to attach speakers, and Step 9. If it breaks: the record still reads correctly but nobody can jump to the moment — annoying, not dangerous. Unlike most steps here, this one fails safely.
Step 5 — separate the speakers
Step 5
Separate the speakers — or, better, never need to
A transcript that says "yes, I agree to the charges" is worth very little if you cannot prove who said it.
When both people are recorded onto one mixed track, working out who spoke when is a genuinely hard computing problem with a name — diarization — and it is wrong more often than you would guess. On standard telephone benchmarks across all speaker counts the published error rate runs around 28%. For a two-party call like yours the best published figure is far better, around 6–7%, because two speakers is genuinely the easy end of the problem — but that is still one word in fifteen attributed to the wrong person.
But there is a way to make the entire problem disappear, and it costs nothing. If you record each person onto their own separate audio track at the time of the call — which your calling system can almost certainly already do — then you never have to guess. Track one is the agent. Track two is the customer. It is correct by construction, permanently, with no model involved.
This is the single best decision available on this page, and it is made in Step 1, not here.
- What it does
- labels each segment of speech with which speaker produced it.
- The honest recommendation
- do not do this. Record each party on their own channel and skip the step entirely.
- If you must
- around 6–7% error on a two-party telephone call at best; roughly 28% on mixed telephone audio generally.
- Pick by
- whether you control the recording. If you do, you do not need any option below.
The recommendation first — separate channels, and the vendors agree
Every major vendor treats per-channel audio as the superior path, and several say so outright.
AssemblyAI: “Multichannel is more accurate since each speaker’s audio is processed independently” [43]. AssemblyAI states separately that the two features cannot be enabled together and that doing so returns an error [44] — so this is a choice between them, not a combination.
Azure: “Diarization is only supported on single-channel (mono) audio” [45]. Stereo and diarization are alternatives by design.
Deepgram returns a separate transcript per channel, noting that diarization only becomes necessary when multiple speakers share a channel [46].
AWS transcribes each channel separately with channel labels and handles the case where both talk at once, to a maximum of two channels [47]. AWS states elsewhere that channel identification is available at no additional cost [29], but this site could not find a billing sentence on the channel-identification page itself — confirm the charging model for your region before assuming stereo is free.
Google supports up to eight channels with a channel tag per result — but bills the sum of all channels, so stereo costs double [48].
Two honest caveats: it only works if each channel genuinely holds one party, and AWS caps at two channels. For a KYC or support call where you control the recording stack, neither is a problem.
Option A — pyannote, if you are stuck with mixed audio
Licence: MIT for the toolkit; the pipeline models are MIT or CC-BY-4.0, all gated — contact details required [49][50]. Commercial use is permitted by both licences.
Published accuracy — and note which benchmark you should care about. The flattering numbers are broadcast and meeting audio: 7.9% on REPERE, 11.2% on VoxConverse. On CALLHOME, which is actual telephone conversation, it is 28.5% for the open 3.1 model and 26.7% for the community model [50].
The paid pipeline is materially better on telephone audio (16.6%), which tells you something about where the open model sits.
No published accuracy exists for Hindi or any Indian language, from this or any other diarization system this site could find. If your calls are in Indian languages, you are operating without a benchmark.
Option B — NVIDIA Sortformer, and a licence trap that will catch you
Read this before copying any tutorial. There are three Sortformer models with three different licences:
diar_sortformer_4spk-v1 — CC-BY-NC-4.0. Non-commercial. Unusable by a business. [51]diar_streaming_sortformer_4spk-v2 — CC-BY-4.0, commercial use permitted with attribution [52]diar_streaming_sortformer_4spk-v2.1 — NVIDIA Open Model License [53]
Version 1 is the one most tutorials and blog posts reference, and it is the one you may not use. That is the trap.
Published accuracy shows how much speaker count dominates: on CALLHOME, 6.57% error with 2 speakers rising to 28.74% with 6 [52]. Maximum 4 speakers by design, and NVIDIA states performance “may degrade on non-English speech”.
What goes wrong, with numbers
Telephone audio is the hard case, and it is your case: 28.5% error on telephone benchmarks against 7.9% on broadcast [50].
Speaker count is the dominant variable. 2 speakers 6.57%, 6 speakers 28.74% [52]. Your two-party call is genuinely the easy end.
Boundaries are systematically clipped. An independent benchmark across 196 hours and five systems found the dominant failure is missed speech at segment edges, with roughly 350ms average missed duration across all models [54] — every speaker turn trimmed by about a third of a second.
Overlapping speech breaks everything. Every source says so; WhisperX states plainly that “overlapping speech is not handled particularly well” [37]. People interrupt each other constantly on collections calls.
And none of the cloud vendors publishes an error rate at all — their accuracy claims cannot be checked against any stated benchmark.
Feeds into: Step 9, where speaker attribution becomes a field in the record. If it breaks: you attribute a commitment to the wrong person — the single most damaging error this pipeline can make, and the reason separate channels are worth the plumbing.
Step 6 — punctuate
Step 6
Punctuate — probably already done for you
Some transcription systems hand you a bare stream of lowercase words with no full stops. It is exhausting to read and hard to search.
Restoring the capitals and punctuation is its own small prediction problem: the model has to work out, from the words alone, where the sentences end and which words are names.
The good news is that you may have nothing to do here. Whisper was deliberately trained to produce written-form text, punctuation and capitals included, so a Whisper-based pipeline gets this free. Most cloud services include it too — though two of them have it switched off by default, which is the most common reason a transcript comes back looking unreadable.
Read this step only if your transcriber does not punctuate. Otherwise skip to Step 7.
- What it does
- adds full stops, commas, question marks and capital letters to a bare text stream.
- You can probably skip this
- Whisper produces punctuated, cased text natively. So do AssemblyAI and AWS, by default.
- Check this first
- Deepgram and Google both default to OFF. If your transcript looks unreadable, check a boolean before you build anything.
- Pick by
- language. The English options do not cover Indian languages at all.
First — check whether you need it
OpenAI’s Whisper checkpoints do this natively. From the paper: models are trained “to predict the raw text of transcripts without any significant standardization”, and the training data was deliberately filtered to remove transcripts that had normalised away “complex punctuation… or stylistic aspects such as capitalization” [55].
The cloud services, and their defaults:
- AssemblyAI — ON by default [56]
- AWS Transcribe — ON, automatic [57]
- Deepgram — OFF. Set
punctuate=true [58] - Google — OFF. “By default, Cloud STT does not include punctuation marks” [59]
None of them charges extra for it.
One caveat that applies to this page’s own recommendation. The native-punctuation property belongs to OpenAI’s released checkpoints. This site found nothing establishing that the Indian-language fine-tunes recommended in Step 3 preserve it — fine-tuning on unpunctuated Indian speech corpora is exactly what would remove it. Transcribe one call and look at the output before deciding you can skip this step.
Option A — for Indian languages, indic-punct
Licence: MIT [60]. Published at scale, covering 11 Indic languages, restoring sentence ends, commas and question marks.
Published accuracy: Hindi F1 of 0.81, with Marathi and Punjabi at 0.86, Gujarati 0.85, Tamil 0.77 [61].
This is the clean choice for a regulated business — genuinely MIT, no derivative obligations, no gate.
Option B — Cadence, more accurate, and a licence that is not what it says
AI4Bharat’s Cadence covers English plus all 22 scheduled Indian languages with around 30 punctuation labels including the Devanagari danda, and outperforms the alternatives: Hindi 0.82 on written text [62].
Its model card says MIT. Treat that with care. Cadence is built on Google’s Gemma, which makes it a model derivative under the Gemma Terms of Use — and a downstream publisher cannot licence away Google’s terms. Gemma does permit commercial use, but it attaches obligations MIT does not: you must pass the terms through to recipients, include a specific notice, mark modified files, and enforce Google’s prohibited-use policy contractually [63].
So it is usable, but it is not MIT in substance, and a compliance review will find that.
And if you choose indic-punct for licence cleanliness, know what you are giving up. The two Hindi figures above come from different papers and different test sets, so they are not comparable. The one direct head-to-head, in Cadence’s own paper, puts Cadence at 0.76 against indic-punct at 0.54 on a shared benchmark [62] — a gap of roughly twenty points, not one.
One number worth carrying: Cadence scores 0.79 on written text but 0.62 on actual speech transcripts [62]. Punctuation restoration is measurably harder on the thing you actually want to use it for.
Option C — the English-only options, and why their headline score misleads
deepmultilingualpunctuation: MIT licensed, English/German/French/Italian only, no Indian language support [64].
Look at the shape of its published results rather than the average. English F1 by mark: full stops 0.948, question marks 0.890, commas 0.819, colons 0.575, hyphens 0.425 [64]. The macro average of 0.775 hides a five-fold spread — full stops are close to solved, while hyphens land below a coin flip and colons are not far above one.
It was also evaluated on European Parliament speeches — prepared political oratory. An Indian collections call is a different distribution and those numbers will not transfer.
NVIDIA NeMo’s punctuation model predicts only commas, periods and question marks [65], with a published 77% F1 on an internal, unpublished dataset and no per-mark breakdown [66]. And its licence is a trap: the NeMo framework is Apache 2.0, but the pretrained weights are governed by NVIDIA’s NGC Terms of Use, not the framework licence [66]. Read the model page, not the repository.
Feeds into: Step 7, which needs sentence structure to spot numbers and dates. If it breaks: the transcript is ugly and harder to search, but nothing is factually wrong. Low stakes.
Step 7 — rewrite the numbers
Step 7
Rewrite the numbers — the step that makes search actually work
Somebody says, out loud: "two lakh fifty thousand rupees".
Your transcript now contains those words. Six months later a compliance officer searches your archive for 2,50,000 and gets nothing. The call is there. The search cannot see it, because a computer matching text has no idea those two things are the same.
This step rewrites spoken numbers into the written forms people actually search for: amounts, dates, phone numbers, account numbers. It is unglamorous and it is the difference between an archive you can use and an archive you merely have.
For India there is a specific wrinkle worth knowing. We group digits differently — 2,50,000 rather than 250,000 — and we count in lakhs and crores rather than millions. Most tools built elsewhere get this wrong. One published Indian tool gets it right.
- What it does
- converts spoken-form numbers, dates and amounts into the written form a person would type.
- Why it matters
- search is string matching. "twenty five thousand" and "25,000" are different strings.
- You may be able to skip it
- Whisper produces written-form output natively; so does Deepgram with one flag.
- Pick by
- whether you need lakh, crore and Indian digit grouping. That narrows the field to one.
Option A — indic-punct, the one with published Indian number handling
Licence: MIT [60]. Covers 12 languages including Hindi, English, Tamil, Bengali, Telugu, Marathi and Gujarati.
Worked examples, taken verbatim from the project’s own documentation [60]:
- “दस लाख एक हज़ार चार सौ बीस” → 10,01,420
- “चार करोड़ चार लाख” → 4,04,00,000
Look carefully at those commas. 10,01,420 and 4,04,00,000 use Indian grouping — two, two, three from the right. Western grouping would give 1,001,420 and 40,400,000. So this handles both the lakh/crore vocabulary and the correct comma placement, which is exactly what you need and what most tools miss.
One honest caution: the paper dates from 2022 and this site could not confirm recent maintenance activity. For a regulated business that is a supply-chain question worth checking before you depend on it.
Option B — NVIDIA NeMo Text Processing
Licence: Apache 2.0 [67] — and unlike the NeMo punctuation model in Step 6, this one genuinely is permissive. The distinction matters; do not blur them.
Hindi is supported, for both directions of normalisation, along with Marathi [68]. This contradicts the common assumption that the toolkit is European-only.
Published accuracy: 97.43% sentence accuracy for English on a public benchmark [69]. No Hindi accuracy figure is published.
And a gap you should verify yourself before choosing this: Hindi support exists in the matrix, but this site found no published example, test case or documentation demonstrating that NeMo’s Hindi grammar handles lakh, crore or Indian digit grouping. Do not assume it does. indic-punct is the one with published evidence.
Option C — let the transcriber do it
Whisper does this natively. From OpenAI’s paper, training on raw written-form text “removes the need for a separate inverse text normalization step in order to produce naturalistic transcriptions” [55].
Deepgram offers it via a smart_format flag covering numerals, dates, times, currency, phone numbers and email addresses — but the documentation states it has “the broadest support for English-language models” and is primarily for English [70]. No Indian number format support is documented.
AWS Transcribe does number and currency conversion only for languages with that support, and Indian numbering is not mentioned in its documentation [57].
So the free option works for English and leaves Indian formats unhandled.
The gap nobody has filled — Indian dates
This site searched for published grammars, test sets or documented examples handling Indian date conventions in any inverse-normalisation toolkit, in either NeMo or indic-punct, and found none. The indic-punct documentation describes its component as focusing on number conversion.
So if your calls contain spoken dates that must be searchable — EMI due dates, appointment dates, dates of birth in a KYC call — expect to write and test that rule yourself, and budget for it rather than discovering it late.
A note on evidence. The argument that unnormalised numbers break search is mechanically obvious, but this site could not find published research measuring it. Treat it as a consequence of how string matching works, not as a cited finding — the distinction matters on a site that cites everything else.
Feeds into: Step 8, which looks for identifier patterns, and Step 10, where search runs. If it breaks: the archive quietly fails to answer the questions you built it to answer.
Step 8 — flag the sensitive parts
Step 8
Flag the sensitive parts — and understand why it will partly fail
Somewhere in the call, the customer read out their Aadhaar number. Twelve digits, aloud, to an agent. Those digits are now sitting in your transcript in plain text, in a database, and they will be there for five years.
So you run a detector over the transcript to find identifiers and personal details, and mask them. Reasonable. There are good tools for it, including ones that know about Aadhaar, PAN and voter ID specifically.
Here is the problem, and it is genuinely uncomfortable. These detectors work partly by checking the maths: a real Aadhaar number has a built-in check digit that only fits if every other digit is right. That check is what makes the detector confident rather than flagging every twelve-digit string in your database.
But speech recognition misheard a digit. It usually does. And a number with one digit wrong fails the check — so the detector concludes it is not an Aadhaar number at all, and leaves it exactly where it is. Unmasked. With no error shown to anyone.
The very thing that makes the detector precise on clean text is what makes it fail silently on yours.
- What it does
- finds names, account numbers, Aadhaar, PAN and other identifiers in the transcript so they can be masked or access-controlled.
- Why it partly fails
- checksum-based detection rejects exactly the corrupted strings that speech recognition produces.
- What follows from that
- this can never be your only control. Access control, encryption and retention limits have to carry the weight.
- And it is a legal duty, not a nicety
- Aadhaar redaction before making a database public is required by regulation. See below.
Option A — Microsoft Presidio, and it knows about Indian identifiers
Licence: MIT [71]. Works by combining regular-expression patterns, surrounding context words, checksum validation and name recognition.
Six Indian entity types are supported [72]: Aadhaar (pattern, context and checksum), PAN, passport, voter ID, vehicle registration (with checksum) and GSTIN. That covers every identifier you are likely to hear on an Indian fintech call.
Quote Microsoft’s own disclaimer to anyone who thinks this solves the problem: “because it is using automated detection mechanisms, there is no guarantee that Presidio will find all sensitive information. Consequently, additional systems and protections should be employed” [73].
Option B — the cloud detectors, with published prices
AWS Comprehend: $0.0001 per 100 characters for PII detection, roughly $1 per million characters, with 5 million characters free monthly for the first 12 months [74]. Four Indian types: Aadhaar, PAN, NREGA and voter number [75].
But there is a constraint that probably rules it out for you: Amazon Comprehend detects PII in English or Spanish only [75]. For a Hindi or Hinglish transcript — the normal case in Indian fintech — it does not apply at all.
Google Sensitive Data Protection: free up to 1 GiB monthly, then $3.00 per GiB, falling to $2.00 above 1 TiB [76]. Four Indian types: Aadhaar, PAN, GST and passport [77]. Note the unit — billing per gigabyte makes the free tier very generous for text, since a million-character transcript corpus is about a megabyte.
Azure AI Language: only two Indian types, PAN and Aadhaar [78] — the weakest coverage. And this site could not verify its prices; the page renders placeholders.
The evidence that this step degrades on transcripts — stronger than you might expect
Name and entity detection measured on machine transcripts versus clean text: F1 dropped from 0.631 to 0.237 on one dataset and 0.964 to 0.564 on another [79].
And the point that should change how you read vendor claims: the same paper, summarising the prior literature it builds on, notes that transcription performance does not correlate with downstream performance on language tasks [79]. A good transcription accuracy number is not evidence that your PII detection will work.
It is worse than just misheard words. A second study found that entity recognition models “fail spectacularly even if no word errors are introduced by the ASR” [80] — the loss of sentence structure in spontaneous speech is by itself enough to break detection.
On the specific checksum argument in the story above: this site found no published study of checksum-validated identifier detection over machine transcripts. It follows from two things that are documented — Presidio validates the Aadhaar checksum, and a check digit exists precisely to reject single-digit corruption — but it is deduction, not a citation, and this page says so rather than dressing it up.
The Indian legal position — this is a regulation, not best practice
The Aadhaar (Sharing of Information) Regulations, 2016, Regulation 6(3): no entity holding an Aadhaar number “shall make public any database or record containing the Aadhaar numbers of individuals, unless the Aadhaar numbers have been redacted or blacked out through appropriate means, both in print and electronic form” [81].
Read that precisely, because it is commonly overstated: it is a redaction-before-publication duty, not a blanket ban on holding Aadhaar numbers internally. But Regulation 6(5) does bind retention — entities shall not retain Aadhaar numbers “for longer than is necessary for the purpose specified” [81]. An indefinitely-retained transcript archive is hard to square with that.
The RBI adds a redaction duty in the KYC context: where a customer submits proof of possession of Aadhaar, the regulated entity shall ensure the customer “redacts or blacks out his Aadhaar number… where the authentication of Aadhaar number is not required” [82], repeated specifically for video KYC.
On the checksum itself: Aadhaar is universally implemented as using the Verhoeff algorithm and Presidio validates it as such, but this site found no UIDAI publication stating it. Treat it as de facto rather than officially specified. Note also that a failed check means “not valid or mistranscribed” — your pipeline cannot tell which.
Feeds into: Step 9, where flags become fields, and Step 10, where they drive access control. If it breaks: an unmasked Aadhaar number sits in your archive and nothing in the system knows.
AdvancedShip it. Failure modes, thresholds and evidence.
Step 9 — assemble the record
Step 9
Assemble the record — and the certificate that defines its shape
You now have words, times, speakers, tidy numbers and flags on the sensitive parts. They are in several different shapes from several different tools.
This step puts them into one structured document. That sounds like tidying-up. It is actually the step where you decide whether this thing is a record or just a convenient text file.
Here is the question that should design your format. If this transcript is ever produced in a proceeding in India, somebody from your company has to sign a certificate saying what device produced it, how it was produced, and that the system was working properly at the time. That certificate is a legal requirement, and it is only signable if your system wrote those facts down when it made the record.
So do not design the format around what is convenient to display. Design it around what that certificate has to say.
- What it does
- merges every previous step into one structured document with the metadata needed to defend it.
- Is there a standard to follow?
- No. This site checked the four candidates and none carries timings, speakers and confidence together.
- So what defines the shape?
- In India, Section 63 of the Bharatiya Sakshya Adhiniyam — the electronic-evidence certificate.
- Pick by
- nothing to pick. You are writing your own schema; the question is what goes in it.
Why there is no standard to adopt
This site checked the four formats people reach for. None is a record format:
- WebVTT (W3C) — carries speaker labels as a presentation string, has no confidence field at all, and word-level timing only by abusing a karaoke feature [83]. Hand an auditor a .vtt and you have handed them captions.
- SRT — no standards body, no specification, no speaker field, no confidence, no metadata. A display artefact.
- TTML2 (a full W3C Recommendation) — has proper speaker metadata and arbitrary timing nesting, but no confidence vocabulary; it is an XML format for authored captions, with no notion that the text was machine-generated [84].
- CTM (NIST) — the only word-native one, but it has no speaker field, only a channel, and its confidence column is documented as aspirational: “it is proposed that this score will be used in the future” [85]. A research scoring format.
And the vendors do not agree either. All four of Deepgram, AssemblyAI, AWS and Google express the same atom — token, start, end, confidence, speaker — and disagree on the name of every field, the type of every field, the unit of time, and whether the speaker lives on the word or in a side table that you must join on timestamps [86][87][88][89].
So writing your own canonical schema plus a per-vendor adapter is not a workaround. It is a design requirement. State it as one.
What the record must carry — derived from the certificate, not from a standard
Under Section 63 of the Bharatiya Sakshya Adhiniyam, 2023, an electronic record is admissible on conditions including that the computer was operating properly, or that any malfunction did not affect the accuracy of the contents — and sub-section (4) requires a certificate identifying the record, describing the manner of its production, and giving particulars of the device [90].
That is your schema requirement. Working backwards from what a truthful certificate needs:
- the hash of the file as received, and of the decoded audio (Step 1)
- the exact conversion command and tool version used
- which model transcribed it, at which version, with what settings
- per-word confidence, and separately the speaker confidence where it exists — Deepgram is the only vendor of the four exposing that as its own field [86], and it is the one an auditor is most likely to contest
- whether speakers came from separate channels or from a model, because those have completely different reliability
- what was flagged in Step 8, and what was masked
- timestamps, and for video KYC the GPS coordinates the RBI requires [82]
Design the record so the certificate can be signed truthfully. That single sentence is the most useful thing on this page for an Indian builder.
What adjacent standards do and do not give you
ISO 15489-1:2016 covers records management concepts and metadata “regardless of structure or form” [91] — it tells you a record needs metadata and controls, not what a transcript must contain. It is a paid standard (CHF 155).
ISO/IEC 27037:2012 covers handling of digital evidence [92], not transcript structure.
NIST’s forensic standards registry carries forensic audio standards, but this site found no registry standard governing transcription output [93].
There is even an open issue on the W3C timed-text list about exactly this gap for public-sector meeting transcripts [94]. The gap is acknowledged, not closed.
Feeds into: Step 10. If it breaks: you have a transcript you cannot defend — readable, searchable, and missing the one thing that would let you produce it.
Step 10 — store and index it
Step 10
Store and index it — searchable, in India, for exactly long enough
Last step, and the one with the longest tail: where does this live, and for how long?
Three forces pull in different directions. The regulator says keep KYC records for five years, stored in India, retrievable quickly. The privacy law says delete personal data once the purpose is served. And your compliance team needs to search years of calls and be confident they found every one that matters.
The good news is that the law resolves the first two itself — the privacy law has a carve-out for anything you are legally required to keep, and it was written with exactly this banking case in mind.
The hard part is the technology. If you lock everything into storage that nobody can delete, you have solved the regulator and created a privacy problem for every recording that was never legally required. And the strongest immutable storage available has, in the vendor's own words, one way out: delete the entire cloud account.
- What it does
- persists the record somewhere durable, searchable, tamper-evident and correctly located.
- Where
- for video KYC, India. Not a preference — the RBI requires it.
- How long
- five years, from two different starting points that most implementations conflate.
- Pick by
- whether you can search it exhaustively and prove you did. That rules out one popular option.
Search — and the surprising Hindi finding
PostgreSQL full-text search gives you indexed matching, boolean and phrase operators, and ranking [95]. And it ships a Hindi stemmer — inherited from Snowball, registered in the source alongside Nepali and Tamil, UTF-8 only [96]. That contradicts the usual assumption. Bengali is absent.
But read Postgres’s own warning on ranking: “the concept of relevancy is vague and very application-specific… The built-in ranking functions are only examples”, and ranking “can be expensive since it requires consulting the tsvector of each matching document” [97].
OpenSearch is Apache 2.0 under a Linux Foundation project [98] — the least legally complicated option if you must self-host in India. It ships Hindi and Bengali analyzers with Indic Unicode normalisation, which genuinely helps when transcripts come from different vendors. Elasticsearch is now tri-licensed, and its default distribution remains under the Elastic License. Read what that actually restricts, because it is commonly stated backwards: Elastic’s own FAQ says you “may freely use Elasticsearch inside your SaaS or self-managed application, and redistribute it with your application” subject to three limitations [99]. The restriction bites when your customers get direct access to substantial portions of the Elasticsearch APIs or the Kibana interface — that is, when you are effectively reselling Elasticsearch itself rather than building on it.
The catch nobody mentions: none of this handles Hinglish. A customer saying “mera chargeback abhi tak nahi aaya” in Roman script is not Hindi to a Devanagari stemmer and not English to an English one. Plan for trigram and literal-phrase matching alongside language analysis, not instead of thinking about it.
Why semantic search must not be your compliance search
Vector search finds calls where someone said “the money came back” when you searched “chargeback”. Genuinely useful. But not as your system of record, for a reason its own documentation states plainly.
From pgvector: “By default, pgvector performs exact nearest neighbor search, which provides perfect recall”; adding an index “trades some recall for speed”; and — the sentence to remember — “Unlike typical indexes, you will see different results for queries after adding an approximate index” [100].
An index is normally a pure speed optimisation. Here it changes the answers. A system that returned 14 calls last month and 12 this month, with identical data, because someone tuned a search parameter, is not one you want to explain to a regulator. OpenSearch documents the same trade-off [101].
And a sobering benchmark: exhaustive retrieval is a named research problem with a NIST evaluation track behind it, and even the best automated systems reached recall “on the order of 0.95” — not 1.0 [102]. So “prove you found everything” is not achievable by any method. What is achievable is a deterministic, reproducible, documented process — which is why lexical search should be your production path and semantic search a discovery aid on top.
Retention — two clocks, and most people run only one
The RBI requires transaction records “for at least five years from the date of transaction”, and identification records “for at least five years after the business relationship is ended” [82].
Those are two different clocks. A call recording that evidences both a transaction and an identity check is governed by whichever expires later. Most implementations apply one policy and get this wrong.
Records may be kept “in hard or soft format” [82] — so the RBI does not mandate immutable storage. That is your evidentiary choice, not a regulatory requirement.
For video KYC specifically, the data and recordings “shall be stored in a system / systems located in India”, with a date and time stamp that “affords easy historical data search”, and the activity log with the official’s credentials preserved [82].
SEBI advisers must keep records five years, and where a dispute is raised, “till resolution of the dispute” or “till further intimation from SEBI” [103]. That open-ended clause is why legal hold must be a separate mechanism from your retention clock — it cannot be expressed as a duration.
Immutability — and the escape hatch that does not exist
AWS S3 Object Lock in compliance mode is assessed by an independent firm as meeting SEC 17a-4(f) and FINRA 4511(c) requirements [104]. It is also absolute: “a protected object version can’t be overwritten or deleted by any user, including the root user”, and “the only way to delete an object under the compliance mode before its retention date expires is to delete the associated AWS account” [105].
Azure immutable blob storage is equivalent in shape and has the same independent assessment; a policy “must be locked” to be compliant, and a locked policy cannot be deleted or shortened [106]. Google Bucket Lock is likewise irreversible once locked [107].
Test in governance mode first. A classification mistake under compliance mode has no remedy short of destroying the account.
The conflict everyone asks about — and the answer, which is cleaner than expected
Legally, there is no conflict. The DPDP Act’s erasure duty opens with a carve-out: a Data Fiduciary shall erase personal data on withdrawal of consent “unless retention is necessary for compliance with any law for the time being in force” [108], and the same words qualify the erasure right. The Act is “in addition to and not in derogation of” other law.
The legislature saw this case coming — the Act’s own illustration to that section is a banking record-keeping example. A regulated lender declining an erasure request for KYC records inside the five-year window is acting under the statute, not against it.
Operationally the problem is real, and it is at the edges:
- Over-retention is not protected. The carve-out covers what the law requires. A marketing call, a support call unconnected to any transaction, or any record past its clock is not covered — and if you locked it under a blanket five-year policy it is now both unerasable and unlawfully retained. Decide retention per record at ingestion, based on what the record is. Never per bucket.
- The RBI’s own outsourcing rules pull the other way, requiring that records be purged at the provider on exit [109] — which compliance-mode locks prevent until every object matures.
The design that resolves it: encrypt each record with its own key held outside the immutable store. Retain the ciphertext to satisfy the regulator; destroy the key when erasure is genuinely due. But state the caveat honestly: this site found no publication from MeitY, the Data Protection Board or the RBI confirming that key destruction constitutes “erasure” under the Act. It is the standard engineering answer to an open legal question, not a settled one.
Feeds into: whatever an auditor asks you for in 2031. If it breaks: you find out at the worst possible moment, which is the entire reason this pipeline exists.
Three versions you could build
The two-week version
Record each party on a separate channel. Run faster-whisper with its built-in voice detection. Store
the JSON in Postgres with a full-text index. That is Steps 1, 2, 3, 9 and 10 — and by recording
separate channels you have skipped Step 5, the least reliable step on this page.
What you are deliberately not building: alignment, identifier flagging, and any
retention policy. Do not point it at regulated KYC recordings yet.
The proper version — start here if this is going anywhere near a regulator
Separate channels throughout. IndicWhisper or IndicConformer if calls are in Indian languages,
faster-whisper otherwise. Voice detection before transcription, always. NeMo Forced Aligner for word
timings. indic-punct for Indian number formats. Presidio for identifier flagging — with access
control and encryption doing the real work, because Step 8 explains why the detector alone is not a
control. Records written with hashes, model versions and settings from the start, so the certificate in
Step 9 can be signed. Storage in India, classified per record at ingestion, governance-mode
immutability, legal hold as a separate axis.
Budget your time for Steps 8, 9 and 10. Steps 1 through 7 are a week of plumbing
that mostly works first time. The last three are where the judgement is, and where a mistake is
expensive and slow to surface.
The enterprise version
Everything above, plus per-record encryption keys held outside the immutable store, a documented
retention basis on every record, reproducible lexical search as the production path with semantic search
clearly marked as a discovery aid, and a written answer to the question of what you do when a customer
requests erasure of a record you are legally required to keep.
That last one is a policy document, not a feature. Step 10 gives you the legal answer; you still need
to write down who decides and how it is recorded.
What goes wrong
Silence writes sentences into your record
The single most dangerous failure here, and the least obvious. 40.3% hallucination on non-speech
audio; “thank you” and “thanks for watching” accounting for a third of it
[10]. Voice detection before transcription is not optional in a regulated pipeline.
Benchmarks that do not transfer
Whisper: 2.7% word error on clean read English [55], 32.4% on accented Hindi
[25]. Google speech: 19.4% on read Hindi, 59.9% on telephone Hindi [20]. Never accept a vendor
accuracy figure without asking which dataset. Measure on a sample of your own calls before
committing.
Licences that are not what the label says
Three live traps on this page. NVIDIA’s most-referenced diarization model is
non-commercial [51]. NeMo’s punctuation weights follow NGC terms,
not the framework’s Apache licence [66]. Cadence is labelled MIT but is a Gemma
derivative carrying Google’s terms [63]. And IndicMFA states no licence at
all [41] — which defaults to all rights reserved.
Good transcription accuracy is not evidence of good PII detection
These two come apart. Entity detection fell from 0.631 to 0.237 F1 on machine transcripts, and the
same paper notes that transcription quality does not correlate with downstream task performance
[79]. Do not let a good accuracy number reassure you about Step 8.
Search that silently changes its answers
“You will see different results for queries after adding an approximate index”
[100]. If compliance search runs on approximate vector search, the same question asked twice can
return different sets. Keep lexical search as the system of record.
One retention policy for everything
Two RBI clocks run from different dates [82], and locking non-mandated recordings into
compliance-mode immutability creates a privacy exposure you cannot undo without deleting the cloud
account [105]. Classify at ingestion.
And the gaps this page could not close
No published accuracy for speaker separation in any Indian language. No published Indian date
handling in any normalisation toolkit. No confirmation that key destruction satisfies the DPDP erasure
duty. No published study of checksum-based PII detection over machine transcripts. These are real holes,
and a guide that pretended otherwise would be less useful.
Where to go next
Read next:
Sources
Every figure, licence and quote on this page traces to one of these. Prices only where the company publishes them; licences read from the repository or model card, not assumed from the project they belong to.
- officialFFmpeg — ffprobe documentation — the inspection tool and its output options. https://ffmpeg.org/ffprobe.html
- officialFFmpeg — legal / licensing page — the LGPL base licence and the condition under which GPL applies to all of FFmpeg. https://www.ffmpeg.org/legal.html
- officialFFmpeg — LICENSE.md — the list of GPL-only external libraries, and that --enable-nonfree produces an unredistributable binary. https://github.com/FFmpeg/FFmpeg/blob/master/LICENSE.md
- officialFFmpeg — command documentation — the -ar, -ac, -vn and -map options, and the default stream-selection rule. https://ffmpeg.org/ffmpeg.html
- officialIETF RFC 7874 — WebRTC audio codec requirements — Opus and G.711 as mandatory-to-implement codecs. https://datatracker.ietf.org/doc/html/rfc7874
- officialMDN — MediaRecorder — browser recording typically producing Opus in a WebM container. https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder/isTypeSupported_static
- officialGoogle Cloud Speech-to-Text — best practices — the guidance not to resample away from the source rate, and to use a lossless codec. https://docs.cloud.google.com/speech-to-text/docs/v1/best-practices
- researchMulti-channel acoustic modeling using mixed bitrate Opus compression (Amazon) — relative word-error degradation by Opus bitrate. Far-field English on a proprietary 620-hour dataset; the shape of the curve transfers, the numbers do not. https://arxiv.org/abs/2002.00122
- officialFFmpeg — hash muxer documentation — the built-in cryptographic hash output and its supported algorithms. https://ffmpeg.org/ffmpeg-formats.html
- researchBarański et al. — Whisper hallucinations induced by non-speech audio — 40.3% hallucination across 301,317 non-speech files on large-v3, and the distribution of hallucinated phrases. https://arxiv.org/abs/2501.11378
- researchKoenecke, Choi, Mei, Schellmann & Sloane — Careless Whisper, FACCT 2024 — roughly 1% of transcriptions containing wholly hallucinated content, 38% of those harmful, and the association with longer non-vocal pauses. https://arxiv.org/abs/2402.08021
- researchBain, Huh, Han & Zisserman — WhisperX, Interspeech 2023 — word error improving with voice-detection preprocessing, the speed-ups, and the word-segmentation precision and recall figures. https://arxiv.org/html/2303.00747
- vendorSilero VAD repository — MIT licence, model size, sample-rate support and the stated per-chunk processing time. https://github.com/snakers4/silero-vad
- vendorSilero VAD — performance metrics — published per-chunk timings and real-time factors by version and runtime. https://github.com/snakers4/silero-vad/wiki/Performance-Metrics
- vendorSilero VAD — quality metrics — the multi-domain ROC-AUC and accuracy comparison against WebRTC and other detectors. Self-published; datasets named. https://github.com/snakers4/silero-vad/wiki/Quality-Metrics
- vendorpy-webrtcvad repository — the dual MIT and BSD 3-Clause licensing, input constraints and aggressiveness modes. https://github.com/wiseman/py-webrtcvad
- vendorWebRTC VAD source — vad_core.c — the Gaussian Mixture Model approach and the likelihood-ratio test. https://github.com/wiseman/py-webrtcvad/blob/master/cbits/webrtc/common_audio/vad/vad_core.c
- vendorpyannote segmentation-3.0 model card — the MIT licence, the gating requirement and the model input format. https://huggingface.co/pyannote/segmentation-3.0
- vendorAI4Bharat Vistaar repository — the MIT licence statement covering all the fine-tuned language models. https://github.com/AI4Bharat/vistaar
- researchBhogale et al. — Vistaar / IndicWhisper, Interspeech 2023 — the MIT licence, the 12 languages, and the per-benchmark Hindi word error rates including the Gramvaani telephone column. https://arxiv.org/pdf/2305.15386
- vendorAI4Bharat IndicConformer 600M model card — MIT licence, gating, 22 scheduled languages and published Hindi word error rate. https://huggingface.co/ai4bharat/indic-conformer-600m-multilingual
- vendorOpenAI Whisper repository — the MIT statement for code and weights, the model size table and required video memory. https://github.com/openai/whisper
- vendorOpenAI whisper-large-v3 model card — the Apache 2.0 licence statement, which differs from the repository. https://huggingface.co/openai/whisper-large-v3
- vendorfaster-whisper repository — MIT licence, the speed claim, and the published benchmark including int8 memory use. https://github.com/SYSTRAN/faster-whisper
- researchJaved, Nawale, Joshi et al. — LAHAJA, accented Hindi benchmark — Whisper V3 at 32.4% word error on accented Hindi, and the named-entity degradation. https://arxiv.org/pdf/2408.11440
- vendorGoogle Cloud Speech-to-Text pricing — batch and on-demand per-minute rates, and per-channel billing. https://cloud.google.com/speech-to-text/pricing
- vendorAssemblyAI pricing — per-hour batch rates and the separately-priced speaker-separation add-on. https://www.assemblyai.com/pricing
- vendorDeepgram pricing — pre-recorded per-minute rates for monolingual and multilingual models. https://deepgram.com/pricing
- vendorAWS Transcribe pricing — the published batch per-minute rate. https://aws.amazon.com/transcribe/pricing/
- vendorAWS Transcribe supported languages — Hindi support, and that content redaction is not available for Hindi. https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html
- vendorMicrosoft Azure Speech pricing — free-tier allowances and billing units; per-unit rates do not render without sign-in. https://azure.microsoft.com/en-us/pricing/details/speech/
- vendorNVIDIA Parakeet TDT 0.6B v3 model card — CC-BY-4.0 licence and the 25 supported languages, all European. https://huggingface.co/nvidia/parakeet-tdt-0.6b-v3
- vendorNVIDIA Canary 1B v2 model card — CC-BY-4.0 licence and the 25 supported languages, all European. https://huggingface.co/nvidia/canary-1b-v2
- vendorNVIDIA NeMo Speech repository — the Apache 2.0 licence for the speech toolkit. https://github.com/NVIDIA-NeMo/Speech
- vendorNeMo Forced Aligner documentation — no pronunciation dictionary required, supported model types and outputs. https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/tools/nemo_forced_aligner.html
- researchRastorgueva et al. — NeMo Forced Aligner, Interspeech 2023 — alignment precision and recall with ground-truth versus machine transcripts, and the comparison against other aligners. https://www.isca-archive.org/interspeech_2023/rastorgueva23_interspeech.pdf
- vendorWhisperX repository — the BSD 2-Clause licence, the alignment language coverage, and the stated limitations on overlapping speech and unalignable characters. https://github.com/m-bain/whisperX
- vendorMontreal Forced Aligner repository — the MIT licence and the pronunciation-dictionary requirement. https://github.com/MontrealCorpusTools/Montreal-Forced-Aligner
- researchMcAuliffe et al. — Montreal Forced Aligner, Interspeech 2017 — published word and phone boundary errors on conversational and laboratory speech. https://montrealcorpustools.github.io/Montreal-Forced-Aligner/images/MFA_paper_Interspeech2017.pdf
- vendorMontreal Forced Aligner — model index — the published acoustic models by language; Tamil is the only South Asian entry and there is no Hindi model. https://mfa-models.readthedocs.io/en/latest/acoustic/index.html
- vendorAI4Bharat IndicMFA repository — Indian-language aligner models published with no licence stated on the repository. https://github.com/AI4Bharat/IndicMFA
- researchHarrison et al. — ASR and the transcription of indistinct covert recordings, Frontiers in Communication 2022 — the forced aligner matching transcripts to drumming and laughter, and the conclusion that computational methods are not suitable for indistinct forensic audio. https://www.frontiersin.org/journals/communication/articles/10.3389/fcomm.2022.803452/full
- vendorAssemblyAI — speaker labels or multi-channel — that multichannel is more accurate because each speaker is processed independently, and that the two features are mutually exclusive. https://www.assemblyai.com/docs/faq/should-i-use-speaker-labels-or-multi-channel
- vendorAssemblyAI — using multichannel and speaker diarization — that the two features cannot be enabled together and that doing so returns an error. https://www.assemblyai.com/blog/multichannel-speaker-diarization
- vendorMicrosoft Azure — fast transcription — that diarization is only supported on single-channel audio. https://learn.microsoft.com/en-us/azure/ai-services/Speech-Service/fast-transcription-create
- vendorDeepgram — multichannel versus diarization — per-channel transcripts, and when diarization becomes necessary. https://developers.deepgram.com/docs/multichannel-vs-diarization
- vendorAWS Transcribe — channel identification — per-channel transcription, the two-channel maximum, and that channels are not billed separately. https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html
- vendorGoogle Cloud Speech-to-Text — multi-channel — per-channel tagging and support for up to eight channels. https://docs.cloud.google.com/speech-to-text/docs/multi-channel
- vendorpyannote.audio repository — the MIT licence for the toolkit. https://github.com/pyannote/pyannote-audio
- vendorpyannote speaker-diarization-community-1 model card — the CC-BY-4.0 licence, the gating, and the published diarization error rates by benchmark including CALLHOME. https://huggingface.co/pyannote/speaker-diarization-community-1
- vendorNVIDIA diar_sortformer_4spk-v1 model card — the CC-BY-NC-4.0 non-commercial licence. https://huggingface.co/nvidia/diar_sortformer_4spk-v1
- vendorNVIDIA diar_streaming_sortformer_4spk-v2 model card — the CC-BY-4.0 licence and the published error rates by speaker count. https://huggingface.co/nvidia/diar_streaming_sortformer_4spk-v2
- vendorNVIDIA diar_streaming_sortformer_4spk-v2.1 model card — the NVIDIA Open Model License. https://huggingface.co/nvidia/diar_streaming_sortformer_4spk-v2.1
- researchBenchmarking diarization models (2025) — 196 hours across five systems; the missed-speech failure mode and the roughly 350ms average missed segment duration. https://arxiv.org/html/2509.26177v1
- researchOpenAI — Robust Speech Recognition via Large-Scale Weak Supervision — that Whisper is trained to predict raw written-form text, removing the need for a separate normalisation step. https://cdn.openai.com/papers/whisper.pdf
- vendorAssemblyAI — automatic punctuation and casing — punctuation on by default for all languages. https://www.assemblyai.com/docs/speech-to-text/pre-recorded-audio/automatic-punctuation-and-casing
- vendorAWS Transcribe — numbers and punctuation — automatic punctuation and capitalisation, and the scope of number conversion. https://docs.aws.amazon.com/transcribe/latest/dg/how-numbers.html
- vendorDeepgram — punctuation — that punctuation defaults to off and must be enabled. https://developers.deepgram.com/docs/punctuation
- vendorGoogle Cloud Speech-to-Text — automatic punctuation — that punctuation is not included by default. https://docs.cloud.google.com/speech-to-text/docs/v1/automatic-punctuation
- vendorindic-punct repository — the MIT licence, the supported languages, and the worked lakh/crore examples with Indian digit grouping. https://github.com/Open-Speech-EkStep/indic-punct
- researchindic-punct paper (2022) — published punctuation F1 by Indian language. https://arxiv.org/abs/2203.16825
- researchAI4Bharat Cadence (2025) — coverage of 22 scheduled languages, the punctuation label set, and the written-text versus speech-transcript score gap. https://arxiv.org/html/2506.03793v1
- officialGoogle — Gemma Terms of Use — the pass-through, notice, modification-marking and prohibited-use obligations attaching to Gemma model derivatives. https://ai.google.dev/gemma/terms
- vendordeepmultilingualpunctuation model card — the MIT licence, the four supported languages, and the per-mark F1 breakdown on Europarl. https://huggingface.co/oliverguhr/fullstop-punctuation-multilang-large
- vendorNVIDIA NeMo punctuation and capitalization documentation — the punctuation marks the model predicts. https://docs.nvidia.com/nemo-framework/user-guide/24.12/nemotoolkit/nlp/punctuation_and_capitalization.html
- vendorNVIDIA NGC — punctuation model page — the 77% F1 on an internal dataset, and that the pretrained weights are governed by NGC Terms of Use rather than the framework licence. https://catalog.ngc.nvidia.com/orgs/nvidia/nemo/models/punctuation_en_bert/-
- vendorNVIDIA NeMo Text Processing repository — the Apache 2.0 licence for the normalisation toolkit. https://github.com/NVIDIA/NeMo-text-processing
- vendorNeMo text normalization documentation — the language support matrix showing Hindi with both normalisation directions. https://docs.nvidia.com/nemo-framework/user-guide/25.09/nemotoolkit/nlp/text_normalization/wfst/wfst_text_normalization.html
- vendorNVIDIA developer blog — text and inverse text normalization — the published sentence accuracy for English and Russian on a public benchmark. https://developer.nvidia.com/blog/text-normalization-and-inverse-text-normalization-with-nvidia-nemo/
- vendorDeepgram — smart format — the formatting features covered, and that support is primarily for English. https://developers.deepgram.com/docs/smart-format
- vendorMicrosoft Presidio repository — the MIT licence. https://github.com/microsoft/presidio
- vendorPresidio — supported entities — the six Indian entity types including Aadhaar with checksum validation, PAN, passport, voter ID, vehicle registration and GSTIN. https://github.com/microsoft/presidio/blob/main/docs/supported_entities.md
- vendorPresidio — FAQ — the detection methods used, and the statement that there is no guarantee all sensitive information will be found. https://microsoft.github.io/presidio/faq/
- vendorAWS Comprehend pricing — the per-unit rate for PII detection and the free-tier allowance. https://aws.amazon.com/comprehend/pricing/
- vendorAWS Comprehend — PII detection — the four Indian entity types, and that detection is available in English or Spanish only. https://docs.aws.amazon.com/comprehend/latest/dg/how-pii.html
- vendorGoogle Sensitive Data Protection pricing — the per-GiB inspection rates and the free allowance. https://cloud.google.com/sensitive-data-protection/pricing
- vendorGoogle Sensitive Data Protection — infoType reference — the four India-specific detector types. https://docs.cloud.google.com/sensitive-data-protection/docs/infotypes-reference
- vendorAzure AI Language — PII entity categories — the two India-specific entity types. https://learn.microsoft.com/en-us/azure/ai-services/language-service/personally-identifiable-information/concepts/entity-categories-list
- researchExtracting biomedical entities from noisy audio transcripts — entity-detection F1 falling from 0.631 to 0.237 on machine transcripts, and that word error rate does not strongly correlate with downstream performance. https://arxiv.org/html/2403.17363v1
- researchWhy aren’t we NER yet? ACL 2023 — that entity models fail even when the transcription introduces no word errors, because sentence structure is lost. https://aclanthology.org/2023.acl-long.98/
- officialThe Aadhaar (Sharing of Information) Regulations, 2016 — Regulation 6(3) requiring redaction before any database containing Aadhaar numbers is made public, and 6(5) limiting retention. https://uidai.gov.in/images/The_Aadhaar_Sharing_of_information_regulation_2016.pdf
- officialRBI Master Direction — Know Your Customer — the Aadhaar redaction requirement, the five-year retention clocks, the hard-or-soft format provision, and the V-CIP storage, time-stamp and activity-log requirements. https://www.rbi.org.in/Scripts/BS_ViewMasDirections.aspx?id=11566
- officialW3C — WebVTT — the specification status and the voice-span mechanism for speaker attribution. https://github.com/w3c/webvtt/blob/main/index.bs
- officialW3C — Timed Text Markup Language 2 (TTML2) — the Recommendation status and the agent/actor metadata for speaker attribution. https://www.w3.org/TR/ttml2/
- officialNIST SCTK — input format documentation — the CTM record structure, its channel rather than speaker field, and the aspirational confidence column. https://github.com/usnistgov/SCTK/blob/master/doc/infmts.htm
- vendorDeepgram — diarization response format — the word object fields including a separate speaker-confidence value. https://developers.deepgram.com/docs/diarization
- vendorAssemblyAI — transcript API reference — the word and utterance structures and their field types. https://www.assemblyai.com/docs/api-reference/transcripts/get
- vendorAWS Transcribe — output format — the item structure, string-typed times and confidences, and the separate speaker-label side table. https://docs.aws.amazon.com/transcribe/latest/dg/how-input.html
- vendorGoogle Cloud Speech-to-Text v2 — WordInfo reference — the word-level fields and their protobuf types. https://docs.cloud.google.com/speech-to-text/docs/reference/rpc/google.cloud.speech.v2
- officialBharatiya Sakshya Adhiniyam, 2023 — Section 63 — the conditions for admissibility of electronic records and the certificate requirement for their production. https://indiankanoon.org/doc/125020475/
- officialISO 15489-1:2016 — records management — the scope covering records concepts, principles and metadata regardless of structure or form. https://www.iso.org/standard/62542.html
- officialISO/IEC 27037:2012 — guidelines for identification, collection, acquisition and preservation of digital evidence. https://www.iso.org/standard/44381.html
- officialNIST OSAC Registry — the forensic standards registry; no standard governing transcription output was found in it. https://www.nist.gov/osac/registry
- officialW3C public-tt list — TTML2 issue on public-sector meeting transcripts — the acknowledged gap between caption formats and transcript records. https://lists.w3.org/Archives/Public/public-tt/2024Jul/0003.html
- officialPostgreSQL — full text search introduction — the tsvector and tsquery types, operators and index support. https://www.postgresql.org/docs/current/textsearch-intro.html
- officialPostgreSQL — Snowball stemmer registration (dict_snowball.c) — the compiled-in stemmer list including Hindi, Nepali and Tamil under UTF-8, and the absence of Bengali. https://github.com/postgres/postgres/blob/master/src/backend/snowball/dict_snowball.c
- officialPostgreSQL — controlling text search — the documented caveats on ranking cost, application-specificity and the absence of global normalisation. https://www.postgresql.org/docs/current/textsearch-controls.html
- officialOpenSearch — the Apache 2.0 licence and the Linux Foundation governance. https://opensearch.org/
- vendorElastic — licensing FAQ — the three source licences, and that the default distribution remains under the Elastic License. https://www.elastic.co/pricing/faq/licensing
- vendorpgvector repository — that exact search provides perfect recall, that an approximate index trades recall for speed, and that results change after adding one. https://github.com/pgvector/pgvector
- officialOpenSearch — k-NN documentation — the documented trade-off between approximate methods and search accuracy. https://docs.opensearch.org/2.12/search-plugins/knn/index/
- researchGrossman, Cormack & Roegiest — TREC Total Recall Track overview — the high-recall retrieval task, its e-discovery motivation, and reported recall on the order of 0.95 for automated runs. https://trec.nist.gov/pubs/trec25/papers/Overview-TR.pdf
- officialSEBI — Guidelines for Investment Advisers (September 2020) — the five-year record retention requirement and the open-ended preservation obligation where a dispute is raised. https://www.sebi.gov.in/legal/circulars/sep-2020/guidelines-for-investment-advisers_47640.html
- officialCohasset Associates — Amazon S3 compliance assessment — the independent finding that S3 Object Lock in compliance mode meets SEC 17a-4(f) and FINRA 4511(c) requirements. https://d1.awsstatic.com/r2018/b/S3-Object-Lock/Amazon-S3-Compliance-Assessment.pdf
- officialAWS — S3 Object Lock documentation — compliance-mode immutability against all users including root, and that deleting the AWS account is the only way to remove a locked object early. https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html
- officialMicrosoft — immutable storage for blobs — that locked policies cannot be deleted or shortened, and that locking is required for regulatory compliance. https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview
- officialGoogle Cloud — Bucket Lock — that locking a retention policy is irreversible. https://docs.cloud.google.com/storage/docs/bucket-lock
- officialDigital Personal Data Protection Act, 2023 — the erasure duty and the erasure right, each subject to a carve-out for retention necessary for compliance with any law in force, and the provision that the Act is in addition to other law. https://prsindia.org/files/bills_acts/bills_parliament/2023/Digital%20Personal%20Data%20Protection%20Bill,%202023.pdf
- officialRBI Master Direction on Outsourcing of Information Technology Services — the India-only storage requirement and the exit provisions requiring safe removal and purging of records at the service provider. https://www.rbi.org.in/scripts/BS_ViewMasDirections.aspx?id=12486
Checked September 2026. Model availability, licences and prices in this field change monthly; the date is part of the claim.