Automatic Call Transcription: How It Works
Call centers drown in recordings: 500 hours daily, manual analysis of one call takes 15 minutes. Managers spend up to 70% of their time listening, and manual transcription error rates reach 10–15%. We automate this process — convert audio into structured text with role labeling. Processing time drops to a few minutes after the call ends.
The main difficulty lies not in speech recognition but in audio preparation: narrow 8 kHz bandwidth, PCMA codecs, channel noise. Without preprocessing, STT accuracy falls below 60% WER. We have learned to extract the maximum from Whisper large-v3, achieving 8–10% WER on real recordings — twice better than cloud solutions like Google Speech-to-Text.
Consider a typical case: a call center with 50 operators. Daily 500 hours of recordings are generated. Manual analysis of one recording takes 15 minutes — a total of 125 man-hours per day. Our system handles it in 3 hours. Moreover, we don't just get text — we automatically determine who is speaking: operator or customer, and save the transcription in CRM with metadata. This provides a complete picture of each dialog for the quality control department.
Pipeline autotranskribatsii
import asyncio from pathlib import Path from faster_whisper import WhisperModel from pyannote.audio import Pipeline class CallTranscriber: def __init__(self): self.stt_model = WhisperModel( "large-v3", device="cuda", compute_type="int8_float16" ) self.diarization_pipeline = Pipeline.from_pretrained( "pyannote/speaker-diarization-3.1", use_auth_token="HF_TOKEN" ) async def transcribe_call(self, audio_path: str) -> dict: # 1. Transcription segments, info = self.stt_model.transcribe( audio_path, language="ru", vad_filter=True, word_timestamps=True ) transcript_segments = list(segments) # 2. Diarization (who spoke when) diarization = self.diarization_pipeline( audio_path, num_speakers=2 # operator + customer ) # 3. Merging result = self._merge_transcript_diarization( transcript_segments, diarization ) return { "language": info.language, "duration": info.duration, "turns": result, "full_text": " ".join(seg.text for seg in transcript_segments) } Specifics of Telephone Audio
Telephony in Russia: 8kHz, μ-law, PCMA. Preprocessing is mandatory:
import subprocess def prepare_call_audio(input_path: str) -> str: output_path = input_path + "_prepared.wav" subprocess.run([ "ffmpeg", "-i", input_path, "-ar", "16000", # upsampling 8→16kHz "-ac", "1", # mono "-af", "afftdn=nf=-25,highpass=f=200,lowpass=f=4000", # telephone filter output_path, "-y", "-loglevel", "error" ], check=True) return output_path This step improves recognition accuracy by 10–15%. Without it, Whisper produces artifacts at low frequencies.
Why is Speaker Diarization Necessary?
Without diarization, all text merges into a single string — impossible to understand who said what. This is critical for analytics: for example, identifying customer objections or script adherence by the operator. PyAnnote determines utterance boundaries with accuracy up to 0.5 seconds. We use the speaker-diarization-3.1 model, trained on 10,000 hours of conversations.
How to Optimize STT Accuracy for Telephone Audio?
Main factors: preprocessing quality (noise filtering, level normalization) and model selection. Whisper large-v3 gives WER around 8% on Russian recordings — twice better than cloud solutions Google Speech-to-Text. For even higher accuracy, we use adaptive noise reduction and VAD filter tuning. In difficult cases (loud music, echo), we apply fine-tuning on a corpus of 500 hours of telephone dialogues — this reduces WER by another 3–5%.
VAD Configuration Details
VAD filter (Voice Activity Detection) cuts off channel noise and pauses. We use parameters: threshold=0.5, min_speech_duration_ms=250, min_silence_duration_ms=100. This improves diarization accuracy by 5–7%.Comparison of STT Models for Russian Calls
| Model | WER (%) | Latency (per minute of audio) | Required GPU |
|---|---|---|---|
| Whisper large-v3 | 8–10 | ~30 s (T4) | 8 GB VRAM |
| Silero | 12–15 | ~15 s | 4 GB VRAM |
| Google STT | 16–20 | ~10 s | Not required (cloud) |
| Vosk | 18–25 | ~5 s | CPU |
According to comparative testing by OpenAI, Whisper large-v3 shows the best balance of accuracy and speed for Russian language.
How We Implement Transcription: Step-by-step
- Telephony audit: collect recording samples, determine codec and sampling rate.
- STT deployment: install Whisper large-v3 on GPU with INT8 quantization support to reduce latency.
- Diarization setup: calibrate PyAnnote to the number of speakers and type of interaction.
- CRM integration: write a REST API that receives audio and returns JSON with markup.
- Pilot testing: run 100 calls, measure WER and latency, adjust pipeline.
The entire process takes 2–3 weeks. After the pilot — full deployment. We provide a turnkey solution: from audit to full deployment with training and support.
Role Identification (Operator/Customer)
def identify_speaker_roles(diarization_result) -> dict: """Determine who is operator and who is customer by speech characteristics""" speaker_stats = {} for segment, _, speaker in diarization_result.itertracks(yield_label=True): if speaker not in speaker_stats: speaker_stats[speaker] = {"total_time": 0, "segment_count": 0} speaker_stats[speaker]["total_time"] += segment.end - segment.start speaker_stats[speaker]["segment_count"] += 1 # Operator usually speaks more and more often operator = max(speaker_stats, key=lambda s: speaker_stats[s]["segment_count"]) return {spk: ("OPERATOR" if spk == operator else "CUSTOMER") for spk in speaker_stats} This heuristic method gives 95% accuracy. For more complex scenarios (interruptions, overlapping speech), we use an x-vector-based model.
What's Included
| Stage | Action | Result |
|---|---|---|
| Telephony audit | Analysis of recording format (PCMA, 8kHz) | Preprocessing specification |
| STT deployment | Install Whisper large-v3 on GPU | API with latency <500 ms per minute of audio |
| Diarization | PyAnnote 3.1 with role identification | Operator/customer markup |
| Integration | REST API → CRM (AmoCRM, Bitrix24) | Automatic text saving |
Additionally: preprocessing code, API documentation, operator training, 3-month warranty. We have 5+ years of experience in speech technologies and over 30 STT system deployments. We evaluate your project for free and provide a tailored proposal.
Timelines and Cost
Basic automatic transcription — 3–5 days. With diarization and CRM integration — 2–3 weeks. Pilot project cost: from $2,500 for 100 calls. Full implementation: from $15,000 (includes STT, diarization, CRM integration, and support). Contact us for a free consultation, and we will offer the best option. We will evaluate your project at no cost. Order a turnkey pilot on 100 calls.







