
September 08, 2026
12 min read
By Kokil Thapa | Last reviewed: September 2026
Your team finishes a client call. Someone asks what was agreed. Nobody wrote it down. AI Voice to Text with Whisper for Meetings closes that gap by turning recorded audio into searchable text you can store, summarise, and action. OpenAI's Whisper models handle noisy rooms, mixed accents, and long sessions better than most lightweight dictation tools. On production systems I maintain, Whisper sits behind a simple upload-and-queue flow rather than live captioning. That trade-off keeps costs predictable and quality high. This guide covers model choice, self-hosted vs API deployment, and a Laravel integration pattern you can ship this week.
What is AI Voice to Text with Whisper for Meetings?
Whisper is an automatic speech recognition (ASR) model family published by OpenAI. It accepts audio files and returns plain text, often with segment timestamps. For meetings, you typically record the session, upload the file, and process it asynchronously.
Whisper is not a meeting bot that joins Zoom on its own. You still need a capture step: native recorder, OBS, or a platform export. Whisper handles transcription after capture. That separation is useful. You control when processing runs, which files enter your system, and who sees the output.
On legal-tech portals I've worked on, post-meeting transcripts support intake notes and follow-up tasks. A lawyer reviews the text before anything client-facing goes out. Whisper accelerates drafting; it does not replace professional judgement.
Whisper supports dozens of languages out of the box. For Nepal-based teams mixing English and Nepali, that matters. Dedicated Nepali ASR tools exist, but Whisper often produces usable first drafts for internal notes when you lack a specialised stack.
How do you set up Whisper for meeting transcription?
Start with the path of least resistance: the OpenAI Audio API. You send a file; you get JSON back. Self-hosting makes sense when audio cannot leave your network or when monthly volume crosses a cost threshold.
Step 1: Normalise audio with ffmpeg
Whisper accepts common formats, but mono 16 kHz WAV reduces surprises. Install ffmpeg on Ubuntu and convert exports before upload.
# Install ffmpeg on Ubuntu 24.04
sudo apt update && sudo apt install -y ffmpeg
# Convert stereo MP4 meeting export to mono 16 kHz WAV
ffmpeg -i meeting-recording.mp4 -ar 16000 -ac 1 -c:a pcm_s16le meeting.wav
The ffmpeg documentation covers codec flags if your source is M4A, WebM, or Opus from browser capture.
Step 2: Call the Whisper API
Create an API key in your OpenAI dashboard. Use the whisper-1 model via the transcriptions endpoint. The response format verbose_json includes segment timestamps — essential for meeting navigation.
curl https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F file="@meeting.wav" \
-F model="whisper-1" \
-F response_format="verbose_json" \
-F language="en"
Omit language when speakers mix languages. Whisper auto-detects, though accuracy drops on rapid code-switching.
Step 3: Chunk long recordings
The API accepts files up to 25 MB. A 90-minute stereo call exceeds that quickly. Split audio before upload and offset timestamps when merging.
- Split WAV into 10–15 minute segments with ffmpeg.
- Transcribe each segment with the same parameters.
- Add each segment's start offset to returned timestamps.
- Concatenate text and store one record per meeting.
# Split into 10-minute chunks (600 seconds)
ffmpeg -i meeting.wav -f segment -segment_time 600 -c copy chunks/chunk_%03d.wav
Validate the first and last 30 seconds of each chunk manually once. Boundary cuts mid-word cause minor garbling at joins.
Step 4: Self-host with whisper.cpp (optional)
When compliance blocks cloud upload, run whisper.cpp on a CPU server or a GPU box. Download a GGML quantised model, compile, and transcribe locally. Expect slower runs on CPU-only VPS plans common in Nepal hosting (Rs 2,000–5,000/month, ~USD 15–37).
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp && make
./models/download-ggml-model.sh medium
./main -m models/ggml-medium.bin -f meeting.wav -oj
GPU acceleration helps at scale. For a few meetings per week, a nightly queue on a modest server is enough.
Which Whisper model should you use for meeting recordings?
OpenAI's hosted API exposes whisper-1, mapped to a large-v2-class model. Self-hosted setups let you pick tiny, base, small, medium, or large. Bigger models improve accuracy on jargon and cross-talk. They also need more RAM and time.
| Model | Best for | RAM (approx.) | Accuracy on noisy calls | Cost profile |
|---|---|---|---|---|
tiny / base | Quick internal drafts, clear single speaker | 1–2 GB | Low–moderate | Cheapest self-host; API same rate |
small | Standard team stand-ups | 2–3 GB | Moderate | Good balance on VPS |
medium | Client calls, mixed accents | 5 GB | Good | Sweet spot for self-host |
large / API whisper-1 | Legal, medical, technical jargon | 10 GB+ | Best | API ~USD 0.006/min; GPU for volume |
For most agency and SMB meeting workflows, start with the API. Prototype in hours. Switch to self-hosted medium only after you measure monthly minutes and confirm data residency requirements. Read AI rate limits and cost optimisation before you queue hundreds of hours.
Post-processing helps more than chasing the largest model. A light pass that fixes product names and attendee spellings beats re-running large on every file.
How do you integrate Whisper transcription into a Laravel workflow?
Laravel 12 or 13 fits this job well. Upload the recording, dispatch a queue job, call Whisper, persist segments, and notify the organiser. Keep API keys in .env, never in the repo.
Database schema
Schema::create('meeting_transcripts', function (Blueprint $table) {
$table->id();
$table->foreignId('meeting_id')->constrained()->cascadeOnDelete();
$table->string('status')->default('pending');
$table->longText('full_text')->nullable();
$table->json('segments')->nullable();
$table->string('language')->nullable();
$table->unsignedInteger('duration_seconds')->nullable();
$table->timestamps();
});
Queue job calling the API
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
class TranscribeMeetingAudio implements ShouldQueue
{
use Queueable;
public function __construct(public int $meetingId, public string $diskPath) {}
public function handle(): void
{
$transcript = MeetingTranscript::where('meeting_id', $this->meetingId)->firstOrFail();
$transcript->update(['status' => 'processing']);
$response = Http::withToken(config('services.openai.key'))
->attach('file', Storage::get($this->diskPath), 'meeting.wav')
->post('https://api.openai.com/v1/audio/transcriptions', [
'model' => 'whisper-1',
'response_format' => 'verbose_json',
]);
if ($response->failed()) {
$transcript->update(['status' => 'failed']);
return;
}
$data = $response->json();
$transcript->update([
'status' => 'completed',
'full_text' => $data['text'],
'segments' => $data['segments'],
'language' => $data['language'],
'duration_seconds' => (int) $data['duration'],
]);
}
}
Run this on a Redis queue worker, not the web request. A 60-minute file can take several minutes. Horizon or Supervisor keeps workers alive on Ubuntu. See Linux system administration patterns if cron paths drift after deploy.
Controller upload endpoint
public function store(Request $request, Meeting $meeting)
{
$request->validate([
'recording' => ['required', 'file', 'mimetypes:audio/wav,audio/mpeg,video/mp4', 'max:51200'],
]);
$path = $request->file('recording')->store("meetings/{$meeting->id}", 'local');
MeetingTranscript::create(['meeting_id' => $meeting->id, 'status' => 'pending']);
TranscribeMeetingAudio::dispatch($meeting->id, $path);
return back()->with('status', 'Transcription queued.');
}
Validate file type and size on the server. Browser-only checks miss CLI uploads and forged MIME types. For a booking portal like Adventure Third Pole Trek, attach the transcript to the itinerary record staff already use.
Optional next step: send the completed text to an LLM for action items. Keep that as a separate job so Whisper failure does not block raw transcript delivery. The OpenAI speech-to-text guide documents response fields you'll map into Eloquent.
How much does Whisper meeting transcription cost?
OpenAI prices Whisper API transcription at roughly USD 0.006 per audio minute as of 2026. Ten hours of meetings per month lands near USD 3.60 (~Rs 480). One hundred hours hits USD 36 (~Rs 4,800). That is often cheaper than staff time spent on manual notes.
Self-hosted costs shift to infrastructure. A CPU VPS transcribes slowly. A GPU instance (Rs 15,000–40,000/month, ~USD 110–300) pays off above roughly 50–80 hours monthly depending on model size. Factor electricity and ops time if you self-manage bare metal.
- API: zero ops, pay per minute, 25 MB file limit per request.
- Self-host CPU: low cash cost, high latency, fine for overnight batches.
- Self-host GPU: higher fixed cost, best unit economics at scale.
- Hybrid: sensitive calls local, internal stand-ups via API.
Log minutes processed per client when you bill for custom software development. Transparency prevents margin surprises on retainer projects.
How do you handle privacy and quality for meeting transcripts?
Transcripts are data assets and liability surfaces. Treat them like any document containing personal or commercial information.
Consent and retention
Inform participants before recording. Nepal's privacy framework is evolving; client contracts should state how long you retain audio and text. Default to the shortest retention that meets business need. Delete source audio after successful transcription unless regulation requires otherwise.
On portals such as Mijar Law Associates, role-based access controls gate who reads intake transcripts. Spatie Laravel Permission works well for that pattern. Never expose raw transcripts on public URLs.
Accuracy limits
Whisper hallucinates on silence, music, and heavy crosstalk. It may invent phrases during long pauses. Mitigations:
- Strip silence before upload with ffmpeg
silenceremovefilters. - Flag low-confidence segments if your pipeline exposes logprob data.
- Require human review before client delivery.
- Keep original audio for dispute resolution.
Speaker diarisation — who said what — is not Whisper's core strength. Add pyannote or a dedicated diarisation service downstream if you need attributed quotes for legal or HR use.
Security checklist
- Encrypt files at rest on S3-compatible storage or encrypted disks.
- Restrict API keys to transcription scopes; rotate quarterly.
- Run queue workers on private networks without public ingress.
- Audit download events for compliance reporting.
- Document processing in your AI governance policy.
Validate JSON segment payloads with a JSON formatter during development. Broken segment arrays break search indexing downstream.
For Nepali-language meetings, pair Whisper output with a Nepali Unicode converter if staff paste Romanised notes into CMS fields. Unicode normalisation prevents broken search on legal document portals like Notary Nepal.
Full-text search over transcripts pairs naturally with Meilisearch or database FTS. See full-text search in Laravel with Meilisearch and Scout for indexing long text fields without choking MySQL.
Key Takeaways
- AI Voice to Text with Whisper for Meetings works best as async post-processing, not live captioning, for predictable cost and quality.
- Normalise audio to mono 16 kHz WAV, chunk files over 25 MB, and merge segment timestamps with offsets.
- Start on the Whisper API; move to self-hosted
mediumor GPU when data residency or volume demands it. - Queue transcription in Laravel with Redis workers; never block HTTP requests on multi-minute API calls.
- Require human review, RBAC, and retention policies before client-facing transcripts leave your system.
- Log audio minutes per project so API spend stays visible on retainer and agency work.
People Also Ask
Can Whisper transcribe Zoom meetings automatically?
Whisper does not join Zoom natively. Export the cloud recording or capture system audio, then feed the file to Whisper. Automate the handoff with a webhook from your recording storage to a Laravel queue job. That gives you near-hands-free processing without relying on a bot in the call.
Does Whisper support Nepali in meetings?
Whisper lists Nepali among supported languages. Quality varies with microphone noise and English mixing. For client-facing Nepali transcripts, treat Whisper output as a draft. Have a bilingual staff member review before publication.
Is Whisper better than Google Speech-to-Text for meetings?
Whisper wins on simple integration and strong open-weight self-hosting. Google Cloud Speech excels at streaming diarisation and enterprise SLAs. Pick Whisper when you want one API call or local inference; pick Google when you need real-time speaker labels at scale.
How long does it take to transcribe a one-hour meeting?
Via the OpenAI API, expect roughly one to four minutes depending on load and file size. Self-hosted medium on CPU can take twenty to forty minutes. GPU cuts that sharply. Queue jobs overnight if CPU is your only option.
Ship meeting transcription without overbuilding
AI Voice to Text with Whisper for Meetings solves a narrow, valuable problem: turning spoken decisions into text your team can search and act on. You do not need a custom model. Normalise audio, chunk long files, queue the API call, store segments, and add a review step. That pipeline fits Laravel apps, legal intake portals, and booking systems alike.
If you want this wired into an existing portal — upload form, queue workers, search, and access control — contact us or review our AI integration and automation service. For related patterns, read build an AI ChatOps bot for your team and automate DevOps tasks with an AI assistant. Browse the full portfolio for production examples, or explore API development if you need webhook-driven ingestion from your meeting platform.
Frequently Asked Questions
0 Comments
Leave a comment
Your email is not published. Comments appear once they have been read. Sign in to have your details filled in.

