Kokil Thapa - Professional Web Developer in Nepal
Freelancer Web Developer in Nepal with 15+ Years of Experience

Kokil Thapa is an experienced full-stack web developer focused on building fast, secure, and scalable web applications. He helps businesses and individuals create SEO-friendly, user-focused digital platforms designed for long-term growth.

AI Voice to Text with Whisper for Meetings

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 Meeting Transcription PipelineCaptureZoom / mic / fileConvertffmpeg to WAVChunk10–15 min splitsWhisperAPI or localMergesegments + offsetsStoreDB + searchSummariseoptional LLMOutput: timestamped transcript linked to client or projectReviewed by staff before external sharing
End-to-end AI Voice to Text with Whisper for Meetings: capture, convert, chunk, transcribe, merge, and store.

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.

  1. Split WAV into 10–15 minute segments with ffmpeg.
  2. Transcribe each segment with the same parameters.
  3. Add each segment's start offset to returned timestamps.
  4. 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.

Whisper Deployment DecisionAudio leaves network?NoSelf-host whisper.cppPrivate client dataYesWhisper APIFastest to shipVolume > 50 hr/mo?Compare GPU costMove to self-hosted GPU
Choose Whisper API or self-hosted transcription based on data residency, volume, and ops capacity.

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.

ModelBest forRAM (approx.)Accuracy on noisy callsCost profile
tiny / baseQuick internal drafts, clear single speaker1–2 GBLow–moderateCheapest self-host; API same rate
smallStandard team stand-ups2–3 GBModerateGood balance on VPS
mediumClient calls, mixed accents5 GBGoodSweet spot for self-host
large / API whisper-1Legal, medical, technical jargon10 GB+BestAPI ~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.

Laravel Whisper Job FlowHTTP UploadForm RequestStoragelocal / S3 diskRedis QueueShouldQueue jobWorkerPHP 8.5Whisper API Callverbose_json segmentsMySQL 9.7 + notificationmeeting_transcripts row
Production Laravel pattern: upload to disk, queue Whisper transcription, persist segments, notify staff.

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.

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 silenceremove filters.
  • 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

  1. Encrypt files at rest on S3-compatible storage or encrypted disks.
  2. Restrict API keys to transcription scopes; rotate quarterly.
  3. Run queue workers on private networks without public ingress.
  4. Audit download events for compliance reporting.
  5. Document processing in your AI governance policy.

Validate JSON segment payloads with a JSON formatter during development. Broken segment arrays break search indexing downstream.

Transcript Quality ControlsBefore WhisperConsent + mono WAVSilence trim + chunkEncrypted uploadAfter WhisperHuman review gateRBAC on storageRetention scheduleCommon failure modesHallucinated text on silenceJargon misheard without custom glossaryNo speaker labels without diarisation
Privacy and quality gates for AI Voice to Text with Whisper for Meetings in regulated workflows.

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 medium or 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

It records or uploads meeting audio, runs it through OpenAI Whisper, and stores searchable timestamped transcripts you can summarise and attach to CRM or project records.

No. Whisper does not join Zoom or any meeting platform on its own. You still need a capture step: native recorder, OBS, or a platform cloud export. Once the file exists, you upload it and process asynchronously. On production systems I maintain, a webhook from recording storage to a Laravel queue job automates the handoff without a bot sitting in the call. That separation gives you control over which files enter your system and when processing runs.

Start with the OpenAI Audio API for the fastest path. Normalise exports to mono 16 kHz WAV using ffmpeg on Ubuntu before upload. Call the whisper-1 model via the transcriptions endpoint with verbose_json so you get segment timestamps. For files over 25 MB, split into 10 to 15 minute chunks with ffmpeg, transcribe each segment, offset timestamps, and merge. If compliance blocks cloud upload, compile whisper.cpp locally, download a GGML quantised medium model, and run transcription on your own server.

The hosted API exposes whisper-1, mapped to a large-v2-class model and priced at roughly USD 0.006 per minute. Self-hosted setups offer tiny through large; medium is the sweet spot for client calls with mixed accents at about 5 GB RAM. Bigger models help on jargon and cross-talk but need more time and hardware. For most agency and SMB workflows, prototype on the API first. Switch to self-hosted medium only after you measure monthly minutes and confirm data residency requirements. Post-processing attendee names beats re-running large on every file.

OpenAI prices Whisper at roughly USD 0.006 per audio minute. Ten hours per month is about USD 3.60 (~Rs 480); one hundred hours is USD 36 (~Rs 4,800).

Laravel 12 or 13 fits this pattern well. Accept an upload, store the file on disk, create a meeting_transcripts row with pending status, and dispatch a queue job. The job calls the OpenAI transcriptions endpoint with the file attached, then persists full_text, segments JSON, language, and duration_seconds. Run workers on Redis via Horizon or Supervisor on Ubuntu, never inside the HTTP request. A 60-minute file can take several minutes. Keep API keys in .env. Validate MIME type and size server-side. Optional: chain a separate LLM job for action items so Whisper failure does not block raw transcript delivery.

Whisper lists Nepali among its supported languages and often produces usable first drafts for internal notes when English and Nepali mix in the same session. Accuracy drops with microphone noise and rapid code-switching. Dedicated Nepali ASR tools exist, but Whisper is practical when you lack a specialised stack. For client-facing Nepali transcripts, treat output as a draft and have a bilingual staff member review before publication. Pair output with a Nepali Unicode converter if staff paste Romanised notes into CMS fields to avoid broken search indexing.

Whisper wins on simple integration and strong open-weight self-hosting when audio cannot leave your network. One API call or local whisper.cpp inference covers most post-meeting workflows. Google Cloud Speech excels at streaming diarisation and enterprise SLAs when you need real-time speaker labels at scale. Pick Whisper when you want predictable async processing with minimal ops. Pick Google when live attribution and managed enterprise guarantees matter more than self-host flexibility. Many teams start on Whisper API and only evaluate Google after volume or diarisation requirements grow.

Via the OpenAI API, expect roughly one to four minutes depending on load and file size. Self-hosted medium on CPU takes much longer.

On production systems I maintain, Whisper sits behind upload-and-queue rather than live captioning because that trade-off keeps costs predictable and quality high. Async processing lets you normalise audio, chunk long files, and retry failed segments without blocking the meeting itself. You control when transcription runs and who sees output before anything goes client-facing. Live captioning adds streaming infrastructure, diarisation complexity, and harder cost forecasting. For intake notes, follow-up tasks, and searchable archives, post-meeting transcription is the practical default unless real-time display is a hard requirement.

The OpenAI API accepts files up to 25 MB per request, so a 90-minute stereo call exceeds that quickly. Split the normalised WAV into 10 to 15 minute segments using ffmpeg segment mode. Transcribe each chunk with the same whisper-1 parameters and verbose_json format. Add each segment start offset to returned timestamps before merging text and segments into one meeting record. Validate the first and last 30 seconds of each chunk once manually. Boundary cuts mid-word cause minor garbling at joins, which is acceptable for internal notes but worth checking on legal or client calls.

Self-host with whisper.cpp when compliance blocks audio leaving your network or when monthly volume crosses a cost threshold where fixed infrastructure beats per-minute billing. A CPU VPS common on Nepal hosting at Rs 2,000 to 5,000 per month (~USD 15 to 37) handles a nightly queue for a few meetings weekly. GPU instances at Rs 15,000 to 40,000 per month (~USD 110 to 300) pay off above roughly 50 to 80 hours monthly depending on model size. A hybrid works well: sensitive calls stay local, internal stand-ups go through the API.

Treat transcripts like any document containing personal or commercial information. Inform participants before recording and define retention in client contracts. Delete source audio after successful transcription unless regulation requires otherwise. Gate access with role-based controls such as Spatie Laravel Permission on legal-tech portals. Never expose raw transcripts on public URLs. Encrypt files at rest, restrict API keys to transcription scopes and rotate quarterly, and run queue workers on private networks. Require human review before client delivery because Whisper hallucinates on silence, music, and heavy crosstalk. Keep original audio for dispute resolution.

Whisper accepts common formats including MP4, M4A, WebM, and Opus, but mono 16 kHz WAV reduces surprises across both API and self-hosted paths. Convert stereo meeting exports with ffmpeg using pcm_s16le codec, 16000 Hz sample rate, and single channel before upload. Strip silence with ffmpeg silenceremove filters to reduce hallucinated phrases during long pauses. Normalising upfront avoids codec mismatches from browser capture, Zoom exports, and OBS recordings. The same normalised file feeds either the OpenAI transcriptions endpoint or whisper.cpp locally without re-encoding mid-pipeline.

Speaker diarisation, meaning attribution of which person said which line, is not Whisper core strength. Whisper returns plain text with segment timestamps but does not reliably label speakers in multi-person calls. For attributed quotes in legal, HR, or client-facing workflows, add pyannote or a dedicated diarisation service downstream of transcription. That two-step pipeline costs more engineering effort but produces usable who-said-what output. For internal stand-up notes where speaker identity matters less, timestamped segments alone are often enough for navigation and search without diarisation overhead.

Share this article

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.

Quick Contact Options
Choose how you want to connect me: