<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Amiya Pani</title><link href="https://amiyapani.com/" rel="alternate"/><link href="https://amiyapani.com/feeds/all.atom.xml" rel="self"/><id>https://amiyapani.com/</id><updated>2026-11-08T00:00:00+05:30</updated><subtitle>VP of Technology · Data Engineering &amp; AI Leader</subtitle><entry><title>Speech-to-Text Models: Pros, Cons, and How to Fine-Tune One for Your Domain (Like Movies)</title><link href="https://amiyapani.com/blog/speech-to-text-foundation-models.html" rel="alternate"/><published>2026-11-08T00:00:00+05:30</published><updated>2026-11-08T00:00:00+05:30</updated><author><name>Amiya Pani</name></author><id>tag:amiyapani.com,2026-11-08:/blog/speech-to-text-foundation-models.html</id><summary type="html">&lt;p&gt;Not all speech-to-text models are equal, and none of them know your domain out of the box. A practical guide to choosing an STT model, handling Indian and regional languages, and fine-tuning a foundation model on domain data, using movie dialogue as the running example.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Speech-to-text (STT) has quietly become one of the most useful building blocks in AI. Meeting notes, call-centre analytics, subtitles, voice assistants, dubbing and translation pipelines all start with the same step: turn audio into accurate text.&lt;/p&gt;
&lt;p&gt;The good news is that modern foundation models are remarkably good at this. The bad news is that "remarkably good" on a benchmark often turns into "frustratingly wrong" on &lt;em&gt;your&lt;/em&gt; audio: the character names, the accents, the background music, the jargon.&lt;/p&gt;
&lt;p&gt;In this post I'll cover:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The main types of STT models, with their pros and cons&lt;/li&gt;
&lt;li&gt;Why general models struggle with domain-specific audio&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Indian and regional languages&lt;/strong&gt;: what works today and where the gaps are&lt;/li&gt;
&lt;li&gt;A practical ladder of fixes, from zero-training tricks to full fine-tuning&lt;/li&gt;
&lt;li&gt;A worked example: adapting a foundation model to &lt;strong&gt;movie dialogue&lt;/strong&gt;, including Indian cinema&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;The Three Families of STT Models&lt;/h2&gt;
&lt;p&gt;Almost every STT option today falls into one of three buckets.&lt;/p&gt;
&lt;h3&gt;1. Managed cloud APIs&lt;/h3&gt;
&lt;p&gt;Examples: Google Cloud Speech-to-Text, AWS Transcribe, Azure AI Speech, Deepgram, AssemblyAI, and the transcription endpoints from OpenAI and ElevenLabs.&lt;/p&gt;
&lt;h3&gt;2. Open-weight foundation models (self-hosted)&lt;/h3&gt;
&lt;p&gt;Examples: OpenAI &lt;strong&gt;Whisper&lt;/strong&gt; (and faster variants such as Whisper Turbo and faster-whisper), NVIDIA &lt;strong&gt;Parakeet&lt;/strong&gt; and &lt;strong&gt;Canary&lt;/strong&gt; (NeMo), and Meta's &lt;strong&gt;wav2vec 2.0&lt;/strong&gt; and &lt;strong&gt;MMS&lt;/strong&gt; family.&lt;/p&gt;
&lt;h3&gt;3. On-device / edge models&lt;/h3&gt;
&lt;p&gt;Examples: whisper.cpp, small quantised Whisper or Parakeet models, Vosk, and the speech engines built into iOS and Android.&lt;/p&gt;
&lt;h3&gt;Pros and cons at a glance&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Cloud APIs&lt;/th&gt;
&lt;th&gt;Open-weight (self-hosted)&lt;/th&gt;
&lt;th&gt;On-device&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accuracy out of the box&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very high on general audio&lt;/td&gt;
&lt;td&gt;High; the best models rival the cloud&lt;/td&gt;
&lt;td&gt;Lower; smaller models trade accuracy for size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain customisation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited: custom vocabulary or phrase boosting at best&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Full control&lt;/strong&gt;: prompt, fine-tune, or retrain&lt;/td&gt;
&lt;td&gt;Possible, but you train elsewhere and shrink the model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost at scale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pay per minute; adds up fast&lt;/td&gt;
&lt;td&gt;GPU cost only; cheap at high volume&lt;/td&gt;
&lt;td&gt;Free per use once shipped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Audio leaves your network&lt;/td&gt;
&lt;td&gt;Stays in your infrastructure&lt;/td&gt;
&lt;td&gt;Never leaves the device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency / streaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Good, real-time options available&lt;/td&gt;
&lt;td&gt;Depends on your setup; Whisper is batch-first&lt;/td&gt;
&lt;td&gt;Excellent, no network hop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operational effort&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;You own GPUs, scaling, and monitoring&lt;/td&gt;
&lt;td&gt;You own app integration and model updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Languages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Broad&lt;/td&gt;
&lt;td&gt;Broad (Whisper covers ~100 languages)&lt;/td&gt;
&lt;td&gt;Usually narrower&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;My rule of thumb:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start with a cloud API&lt;/strong&gt; when you need to prove value quickly and your audio is "normal" (clear speech, common vocabulary).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move to an open-weight model&lt;/strong&gt; when cost, privacy, or domain accuracy starts to hurt. This is the only family where you can truly &lt;em&gt;teach&lt;/em&gt; the model your domain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go on-device&lt;/strong&gt; when latency or privacy is non-negotiable, such as live captions or offline apps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Known weak spots (whatever model you pick)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hallucinations on silence and music.&lt;/strong&gt; Generative models like Whisper sometimes "invent" text during long pauses or music, a well-known issue that matters a lot for movies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proper nouns.&lt;/strong&gt; Character names, product names, and place names get spelled phonetically or replaced with common words.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overlapping speech.&lt;/strong&gt; Two people talking at once usually becomes one garbled sentence. Speaker diarisation (who spoke when) is a separate problem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accents and code-switching.&lt;/strong&gt; Mixed-language speech (for example, Hindi–English "Hinglish") is still hard for most general models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise and effects.&lt;/strong&gt; Explosions, crowd noise, and background scores drown out dialogue.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Why a General Model Isn't Enough for Your Domain&lt;/h2&gt;
&lt;p&gt;Foundation models are trained on huge amounts of &lt;em&gt;general&lt;/em&gt; audio. That gives them broad ability but no knowledge of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your vocabulary&lt;/strong&gt;: the names of characters, franchises, actors, or internal products&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your acoustic conditions&lt;/strong&gt;: film mixes, call-centre lines, factory floors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your style rules&lt;/strong&gt;: whether you want "gonna" or "going to", numbers as digits or words, and tags like &lt;code&gt;[laughs]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Movies are a great example because they combine almost every weak spot at once: music, effects, whispers, shouting, accents, overlapping dialogue, and invented names.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Indian and Regional Languages: The Real Test&lt;/h2&gt;
&lt;p&gt;India has 22 scheduled languages, hundreds of dialects, and a habit of mixing them mid-sentence. For speech AI, that makes it one of the hardest and most interesting markets in the world. If your users are in India, an STT model that only shines in English is not enough.&lt;/p&gt;
&lt;h3&gt;What's available today&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Indian language support&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Whisper&lt;/strong&gt; (OpenAI, open-weight)&lt;/td&gt;
&lt;td&gt;Hindi, Bengali, Tamil, Telugu, Marathi, Gujarati, Kannada, Malayalam, Punjabi, Urdu and a few others, but accuracy drops sharply outside Hindi&lt;/td&gt;
&lt;td&gt;A quick multilingual baseline and a strong starting point for fine-tuning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI4Bharat models&lt;/strong&gt; (IIT Madras, open-source)&lt;/td&gt;
&lt;td&gt;Built specifically for Indian languages, e.g. IndicWhisper and IndicConformer, trained on large Indian speech datasets&lt;/td&gt;
&lt;td&gt;Best open starting point for most Indic languages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Indian AI companies&lt;/strong&gt; (e.g. Sarvam AI)&lt;/td&gt;
&lt;td&gt;STT APIs focused on Indian languages and code-mixed speech, some with speech-to-English translation&lt;/td&gt;
&lt;td&gt;Production use when you want a managed, India-focused service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bhashini&lt;/strong&gt; (Government of India)&lt;/td&gt;
&lt;td&gt;National language platform offering speech, translation and transliteration services across Indian languages&lt;/td&gt;
&lt;td&gt;Public-sector and citizen-facing apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global cloud APIs&lt;/strong&gt; (Google, Azure, AWS)&lt;/td&gt;
&lt;td&gt;Cover the major Indian languages; depth varies by language and provider&lt;/td&gt;
&lt;td&gt;Teams already on that cloud; always test per language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Meta MMS&lt;/strong&gt; (open-weight)&lt;/td&gt;
&lt;td&gt;Covers 1,000+ languages, including many low-resource Indian ones&lt;/td&gt;
&lt;td&gt;Languages nobody else supports, as a starting point&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Language lists and accuracy change quickly in this space, so treat this as a map, not a scorecard. &lt;strong&gt;Always benchmark on your own audio, in each language you need.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;What makes Indian languages hard&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Code-mixing is the norm.&lt;/strong&gt; "Kal meeting reschedule kar dena" is one sentence in two languages. Hinglish, Tanglish (Tamil–English), Benglish and others need models trained on mixed speech, not on clean monolingual text.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script choice.&lt;/strong&gt; Should Hinglish be written in Devanagari (कल मीटिंग), Roman script (kal meeting), or a mix? There is no single right answer, but your training data and output &lt;strong&gt;must follow one consistent rule&lt;/strong&gt;, or accuracy numbers become meaningless.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Low-resource languages.&lt;/strong&gt; Hindi has plenty of training data. Languages like Odia, Assamese, Konkani, Manipuri, or tribal languages have far less, and general models show it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dialects and accents.&lt;/strong&gt; Bhojpuri-influenced Hindi, Kongu Tamil, and Vidarbha Marathi can all trip up a model trained on "standard" speech.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inefficient tokenisation.&lt;/strong&gt; Many multilingual models split Indic scripts into many more tokens than English. That makes transcription slower and more expensive, and it is one reason India-specific models often outperform global ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Telephony audio.&lt;/strong&gt; A lot of Indian voice data comes from 8 kHz phone calls (support lines, IVRs), which sounds very different from the clean 16 kHz audio most models are trained on.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Open datasets worth knowing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI4Bharat:&lt;/strong&gt; IndicVoices, Kathbath, Shrutilipi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google and IISc:&lt;/strong&gt; Project Vaani, which collects speech from districts across India&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mozilla Common Voice&lt;/strong&gt; and &lt;strong&gt;Google FLEURS:&lt;/strong&gt; multilingual sets with several Indian languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check each dataset's licence before using it commercially.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Customisation Ladder: Cheapest Fix First&lt;/h2&gt;
&lt;p&gt;Don't jump straight to fine-tuning. Climb this ladder and stop as soon as accuracy is good enough.&lt;/p&gt;
&lt;h3&gt;Step 1: Clean up the audio&lt;/h3&gt;
&lt;p&gt;Often the cheapest win. Run a &lt;strong&gt;voice activity detector (VAD)&lt;/strong&gt; to skip silence and music (this alone cuts many hallucinations). If you have access to the stems, use the &lt;strong&gt;dialogue track&lt;/strong&gt;; otherwise a source-separation model such as Demucs can isolate vocals.&lt;/p&gt;
&lt;h3&gt;Step 2: Prompt the model with context&lt;/h3&gt;
&lt;p&gt;Whisper accepts an &lt;code&gt;initial_prompt&lt;/code&gt;. Feeding it the character names and a sample of the expected style nudges spelling without any training:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;whisper&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"large-v3"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"scene_042.wav"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;initial_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Characters: Kaveri, Rudransh, Inspector Malhotra. Setting: Mumbai docks."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cloud APIs offer a similar feature called &lt;em&gt;custom vocabulary&lt;/em&gt; or &lt;em&gt;phrase hints&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Step 3: Fix the text afterwards with an LLM&lt;/h3&gt;
&lt;p&gt;Pass the raw transcript, plus a glossary of names and terms, to an LLM and ask it to correct spellings &lt;strong&gt;without changing the meaning&lt;/strong&gt;. This works well for proper nouns, but be careful: an over-eager LLM can "improve" dialogue that was supposed to be ungrammatical.&lt;/p&gt;
&lt;h3&gt;Step 4: Parameter-efficient fine-tuning (LoRA)&lt;/h3&gt;
&lt;p&gt;When steps 1–3 aren't enough, &lt;strong&gt;fine-tune&lt;/strong&gt; the model on your own labelled audio. With &lt;strong&gt;LoRA&lt;/strong&gt; (Low-Rank Adaptation) you freeze the original model and train small adapter layers, often under 1% of the parameters. Benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fits on a single modern GPU&lt;/li&gt;
&lt;li&gt;Much lower risk of the model "forgetting" its general skills&lt;/li&gt;
&lt;li&gt;Adapters are small files, so you can keep one per domain (movies, sports, medical) on top of the same base model&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Step 5: Full fine-tuning&lt;/h3&gt;
&lt;p&gt;Update every weight in the model. It needs more data, more GPU, and more care, but it gives the biggest gains when your domain is very different from general speech (for example, a low-resource language or heavily accented audio).&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Worked Example: Teaching Whisper to Understand Movies&lt;/h2&gt;
&lt;p&gt;Let's fine-tune Whisper with LoRA on movie dialogue.&lt;/p&gt;
&lt;h3&gt;1. Get legally usable data&lt;/h3&gt;
&lt;p&gt;This is the step people skip, and it's the one that matters most. Only use films and subtitles you have the &lt;strong&gt;rights&lt;/strong&gt; to use for training: your own productions, licensed catalogues, or openly licensed content. Studio audio scraped from the internet is a legal risk, not a dataset.&lt;/p&gt;
&lt;h3&gt;2. Build audio–text pairs from subtitles&lt;/h3&gt;
&lt;p&gt;Subtitle files (&lt;code&gt;.srt&lt;/code&gt;) already contain timestamps and text, which makes them a natural starting point:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Extract audio&lt;/strong&gt; as 16 kHz mono, the format Whisper expects:
   &lt;code&gt;ffmpeg -i movie.mkv -ac 1 -ar 16000 movie.wav&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cut clips&lt;/strong&gt; using each subtitle's start and end time. Merge neighbouring lines so clips stay under Whisper's 30-second window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean the text.&lt;/strong&gt; Remove &lt;code&gt;[MUSIC]&lt;/code&gt;, &lt;code&gt;♪&lt;/code&gt;, speaker labels like &lt;code&gt;JOHN:&lt;/code&gt;, HTML tags, and line breaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix timing drift.&lt;/strong&gt; Subtitles are often a few hundred milliseconds off. A forced-alignment tool (for example, WhisperX) can re-align them.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; subtitles are &lt;em&gt;not&lt;/em&gt; verbatim transcripts. They are shortened for reading speed and often drop filler words. For the best results, hand-correct a few hours of clips into true verbatim text, at least for your test set.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Organise the clips like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;movie_clips/
  train/  metadata.csv   clip_0001.wav ...
  test/   metadata.csv   clip_9001.wav ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;where each &lt;code&gt;metadata.csv&lt;/code&gt; has the columns &lt;code&gt;file_name,transcription&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Split by movie, not by clip.&lt;/strong&gt; If clips from the same film appear in both train and test, your accuracy numbers will look far better than they really are.&lt;/p&gt;
&lt;h4&gt;Doing this for Indian cinema&lt;/h4&gt;
&lt;p&gt;Indian films are a goldmine for multilingual speech data, with a few extra wrinkles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Songs are a large share of runtime.&lt;/strong&gt; Detect and exclude song sequences from dialogue training, or build a separate lyrics model. Music is the biggest source of hallucinations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dubbed versions give you parallel audio.&lt;/strong&gt; Many films release in Hindi, Tamil, Telugu, Kannada and Malayalam with the same scenes and timing. With the rights, that's a ready-made multilingual dataset, aligned by scene.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dialogue is often code-mixed.&lt;/strong&gt; Decide your script convention for mixed lines before labelling, and write it down for every annotator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start from an Indic model.&lt;/strong&gt; For Tamil or Malayalam, an AI4Bharat checkpoint usually beats vanilla Whisper as a base. The fine-tuning approach below works the same way; you change the base model and the &lt;code&gt;language&lt;/code&gt; setting.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Fine-tune with Hugging Face and PEFT&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;dataclasses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datasets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Audio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;load_dataset&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;peft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LoraConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_peft_model&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;transformers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Seq2SeqTrainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Seq2SeqTrainingArguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;WhisperForConditionalGeneration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;WhisperProcessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"openai/whisper-small"&lt;/span&gt;   &lt;span class="c1"&gt;# start small; move up once the pipeline works&lt;/span&gt;
&lt;span class="n"&gt;LANGUAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"english"&lt;/span&gt;            &lt;span class="c1"&gt;# e.g. "hindi", "tamil", "telugu" for Indian-language films&lt;/span&gt;

&lt;span class="n"&gt;processor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WhisperProcessor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LANGUAGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"transcribe"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WhisperForConditionalGeneration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Load and prepare the data&lt;/span&gt;
&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"audiofolder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"movie_clips"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"audio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16_000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"audio"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"input_features"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feature_extractor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"array"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16_000&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"transcription"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;

&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove_columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"train"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;column_names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Pad audio features and labels separately&lt;/span&gt;
&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;SpeechCollator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WhisperProcessor&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"input_features"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"input_features"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feature_extractor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"pt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"input_ids"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"pt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"input_ids"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;masked_fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attention_mask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decoder_start_token_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
        &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Add LoRA adapters: only these small layers are trained&lt;/span&gt;
&lt;span class="n"&gt;lora&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoraConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lora_alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_modules&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"q_proj"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"v_proj"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;lora_dropout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_peft_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lora&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_trainable_parameters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# typically well under 1% of the model&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Train&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Seq2SeqTrainingArguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;output_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"whisper-movies-lora"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;per_device_train_batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1e-3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c1"&gt;# LoRA tolerates a higher LR than full fine-tuning&lt;/span&gt;
    &lt;span class="n"&gt;warmup_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fp16&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;eval_strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;eval_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;save_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logging_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;remove_unused_columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# required with PEFT&lt;/span&gt;
    &lt;span class="n"&gt;label_names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"labels"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;trainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Seq2SeqTrainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;train_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"train"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;eval_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;data_collator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SpeechCollator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"whisper-movies-lora"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# saves only the small adapter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;4. Measure: word error rate (WER)&lt;/h3&gt;
&lt;p&gt;The standard metric is &lt;strong&gt;word error rate&lt;/strong&gt;: the share of words the model got wrong (substituted, deleted, or inserted). Lower is better. Compare the base model and your fine-tuned model on the &lt;strong&gt;same held-out movies&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;evaluate&lt;/span&gt;

&lt;span class="n"&gt;wer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"wer"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model_outputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;references&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ground_truth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"WER: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Beyond the overall number, check the things you actually care about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name accuracy:&lt;/strong&gt; are the character names now spelled correctly?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hallucination rate:&lt;/strong&gt; does the model still invent text during music-only scenes?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No regressions:&lt;/strong&gt; run a slice of &lt;em&gt;general&lt;/em&gt; audio too, to make sure the model hasn't forgotten everyday speech.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-language scores:&lt;/strong&gt; for multilingual or code-mixed content, report WER separately for each language. One overall number can hide a model that is great at Hindi and poor at Malayalam. For languages like Tamil and Malayalam, where one long word can carry a whole phrase, a single wrong letter fails the entire word, so also look at &lt;strong&gt;character error rate (CER)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. Deploy&lt;/h3&gt;
&lt;p&gt;Load the base model, attach the adapter, and optionally &lt;strong&gt;merge&lt;/strong&gt; them into a single model for faster inference. Then serve it with an optimised runtime such as faster-whisper (CTranslate2) or behind a GPU inference server.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Beyond Transcription: Where This Goes Next&lt;/h2&gt;
&lt;p&gt;Once you have a domain-tuned STT model, it becomes the first stage of bigger pipelines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subtitles and captioning&lt;/strong&gt;: transcription plus timing plus line-length rules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Translation and dubbing&lt;/strong&gt;: STT → machine translation → text-to-speech&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search and analytics&lt;/strong&gt;: making a whole film catalogue searchable by dialogue&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content moderation and compliance&lt;/strong&gt;: flagging language for age ratings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each stage benefits from the same lesson: &lt;strong&gt;general models give you a strong start, and your domain data is what makes them truly useful.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;h3&gt;What is the best speech-to-text model?&lt;/h3&gt;
&lt;p&gt;There is no single best model. Cloud APIs are the fastest way to get high accuracy on clear, general audio. Open-weight models such as Whisper are best when you need privacy, lower cost at scale, or the ability to fine-tune on your own data. On-device models are best for real-time or offline use. Always benchmark on your own audio.&lt;/p&gt;
&lt;h3&gt;Which speech-to-text model works best for Hindi and other Indian languages?&lt;/h3&gt;
&lt;p&gt;Models built for India, such as AI4Bharat's IndicWhisper and IndicConformer or India-focused services like Sarvam AI and Bhashini, usually outperform global models on Indian languages and code-mixed speech like Hinglish. Whisper works reasonably well for Hindi but drops off for languages with less training data.&lt;/p&gt;
&lt;h3&gt;Can I fine-tune Whisper on my own data?&lt;/h3&gt;
&lt;p&gt;Yes. Using LoRA (Low-Rank Adaptation), you train small adapter layers on top of a frozen Whisper model. It fits on a single modern GPU and keeps the model's general skills. A few hours of clean, accurately transcribed domain audio is a practical starting point.&lt;/p&gt;
&lt;h3&gt;Why does Whisper make up text during music or silence?&lt;/h3&gt;
&lt;p&gt;Whisper is a generative model, so it can produce plausible-sounding text even when no one is speaking. Running a voice activity detector (VAD) to skip non-speech segments, and isolating the dialogue track, removes most of these hallucinations.&lt;/p&gt;
&lt;h3&gt;How do you measure speech-to-text accuracy?&lt;/h3&gt;
&lt;p&gt;The standard metric is word error rate (WER): the share of words substituted, deleted or inserted compared with a correct transcript. For Indian languages with long compound words, such as Tamil and Malayalam, also track character error rate (CER).&lt;/p&gt;
&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the best speech-to-text model?",
      "acceptedAnswer": { "@type": "Answer", "text": "There is no single best model. Cloud APIs are the fastest way to get high accuracy on clear, general audio. Open-weight models such as Whisper are best when you need privacy, lower cost at scale, or the ability to fine-tune on your own data. On-device models are best for real-time or offline use. Always benchmark on your own audio." }
    },
    {
      "@type": "Question",
      "name": "Which speech-to-text model works best for Hindi and other Indian languages?",
      "acceptedAnswer": { "@type": "Answer", "text": "Models built for India, such as AI4Bharat's IndicWhisper and IndicConformer or India-focused services like Sarvam AI and Bhashini, usually outperform global models on Indian languages and code-mixed speech like Hinglish. Whisper works reasonably well for Hindi but drops off for languages with less training data." }
    },
    {
      "@type": "Question",
      "name": "Can I fine-tune Whisper on my own data?",
      "acceptedAnswer": { "@type": "Answer", "text": "Yes. Using LoRA (Low-Rank Adaptation), you train small adapter layers on top of a frozen Whisper model. It fits on a single modern GPU and keeps the model's general skills. A few hours of clean, accurately transcribed domain audio is a practical starting point." }
    },
    {
      "@type": "Question",
      "name": "Why does Whisper make up text during music or silence?",
      "acceptedAnswer": { "@type": "Answer", "text": "Whisper is a generative model, so it can produce plausible-sounding text even when no one is speaking. Running a voice activity detector (VAD) to skip non-speech segments, and isolating the dialogue track, removes most of these hallucinations." }
    },
    {
      "@type": "Question",
      "name": "How do you measure speech-to-text accuracy?",
      "acceptedAnswer": { "@type": "Answer", "text": "The standard metric is word error rate (WER): the share of words substituted, deleted or inserted compared with a correct transcript. For Indian languages with long compound words, such as Tamil and Malayalam, also track character error rate (CER)." }
    }
  ]
}
&lt;/script&gt;

&lt;hr&gt;
&lt;h2&gt;Key Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pick the model family for your constraints:&lt;/strong&gt; cloud for speed to market, open-weight for control and cost at scale, on-device for latency and privacy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For India, test language by language:&lt;/strong&gt; India-focused models (AI4Bharat, Sarvam, Bhashini) often beat global ones on Indic and code-mixed speech. Pick a script convention early and stick to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Climb the customisation ladder:&lt;/strong&gt; audio clean-up → prompting → LLM post-correction → LoRA → full fine-tune.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data quality beats data quantity:&lt;/strong&gt; clean, correctly licensed, verbatim transcripts matter more than raw hours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluate honestly:&lt;/strong&gt; split by movie, track WER &lt;em&gt;and&lt;/em&gt; the errors your users notice, and watch for regressions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're working on speech AI, whether transcription, translation, or voice, I'd love to compare notes. Reach out on &lt;a href="https://www.linkedin.com/in/amiya-pani/"&gt;LinkedIn&lt;/a&gt; or by &lt;a href="mailto:contact@amiyapani.com"&gt;email&lt;/a&gt;.&lt;/p&gt;</content><category term="AI"/><category term="speech ai"/><category term="stt"/><category term="whisper"/><category term="fine-tuning"/><category term="foundation models"/><category term="lora"/><category term="genai"/><category term="indian languages"/></entry><entry><title>How to Use Windows Apps Like Power BI and Notepad++ on a Mac</title><link href="https://amiyapani.com/blog/windows-apps-on-mac.html" rel="alternate"/><published>2026-05-18T18:00:00+05:30</published><updated>2026-05-18T18:00:00+05:30</updated><author><name>Amiya Pani</name></author><id>tag:amiyapani.com,2026-05-18:/blog/windows-apps-on-mac.html</id><summary type="html">&lt;p&gt;Got a Mac but need to use Windows-only apps like Power BI or Notepad++? Here are the simplest ways to make it work - explained in plain English, no tech background needed.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Got a Mac but your work needs you to use Power BI or Notepad++? You're not alone. Many popular tools were originally built only for Windows, which leaves Mac users a bit stuck.&lt;/p&gt;
&lt;p&gt;The good news - there are several easy ways around this. Let me walk you through each one, starting with the simplest.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Option 1: Just Use the Website (No Setup Needed)&lt;/h2&gt;
&lt;p&gt;Before doing anything else, check if the app has a website version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Power BI&lt;/strong&gt; has a free website version at &lt;a href="https://app.powerbi.com"&gt;app.powerbi.com&lt;/a&gt;. Just open it in your browser - Chrome, Safari, Firefox, any of them work. You can view reports, make edits, and share dashboards without installing anything on your Mac.&lt;/p&gt;
&lt;p&gt;Think of it like using Google Docs instead of Microsoft Word - same idea, works in the browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; People who mostly need to view or share Power BI reports rather than build them from scratch.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Option 2: Notepad++ - Switch to a Free Mac App Instead&lt;/h2&gt;
&lt;p&gt;Notepad++ is just a text editor - a tool for opening and editing files. On Mac, there are free apps that do the exact same thing (and honestly do it better).&lt;/p&gt;
&lt;p&gt;The most popular one is &lt;strong&gt;Visual Studio Code&lt;/strong&gt; (everyone just calls it VS Code). It's completely free, easy to use, and works just like Notepad++ - you open a file, edit it, save it. That's it.&lt;/p&gt;
&lt;p&gt;To install VS Code:
1. Go to &lt;a href="https://code.visualstudio.com"&gt;code.visualstudio.com&lt;/a&gt;
2. Click the big download button
3. Open the downloaded file and drag it into your Applications folder
4. Done&lt;/p&gt;
&lt;p&gt;Another option is &lt;strong&gt;Sublime Text&lt;/strong&gt; - also free to try, very fast and simple, great if you just want something lightweight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Anyone using Notepad++ to read, write, or edit text files. VS Code is a direct swap - no learning curve.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Option 3: CrossOver - Run Windows Apps on Your Mac Directly&lt;/h2&gt;
&lt;p&gt;CrossOver is an app for Mac that lets you install and run many Windows applications &lt;strong&gt;without needing Windows itself&lt;/strong&gt;. It basically tricks your Mac into thinking it's running Windows, just enough for the app to work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to use it:&lt;/strong&gt;
1. Go to &lt;a href="https://www.codeweavers.com/crossover"&gt;codeweavers.com/crossover&lt;/a&gt; and download it (there's a free 14-day trial)
2. Open CrossOver and search for the app you want (e.g. "Notepad++")
3. Click Install
4. The app opens on your Mac just like any other app&lt;/p&gt;
&lt;p&gt;It works well for simpler apps like Notepad++. For heavier apps like Power BI Desktop, it can be a bit unreliable - sometimes it works, sometimes it doesn't.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Free trial for 14 days, then around ₹6,000/year (or ~$74/year)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Occasional use of lighter Windows apps. Not ideal for Power BI.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Option 4: Parallels Desktop - The Best Way to Run Power BI on Mac&lt;/h2&gt;
&lt;p&gt;This is the most reliable solution, especially for Power BI Desktop.&lt;/p&gt;
&lt;p&gt;Parallels Desktop creates a "Windows room" inside your Mac. Imagine your Mac as a house - Parallels adds a separate room inside it that runs Windows. You can switch between your normal Mac and this Windows room anytime.&lt;/p&gt;
&lt;p&gt;Once Windows is running inside Parallels, you install Power BI Desktop (or any Windows app) exactly as you normally would on a Windows computer. It works perfectly because it literally is Windows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The cool part - Coherence Mode:&lt;/strong&gt;
There's a setting called Coherence Mode where Power BI Desktop appears as a regular window on your Mac screen - no "Windows room" visible at all. It just sits alongside your other Mac apps like it belongs there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to get started:&lt;/strong&gt;
1. Go to &lt;a href="https://www.parallels.com"&gt;parallels.com&lt;/a&gt; and download Parallels Desktop (free 14-day trial)
2. It will guide you to download Windows automatically - just follow the steps
3. Once Windows is set up, open it and install Power BI Desktop from Microsoft's website
4. Turn on Coherence Mode and use Power BI just like any Mac app&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Around ₹7,500/year (or ~$99/year). A one-time purchase option is also available.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Anyone who regularly needs Power BI Desktop or other heavy Windows-only apps.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Option 5: VMware Fusion - Same as Parallels but Free&lt;/h2&gt;
&lt;p&gt;VMware Fusion does the same thing as Parallels - it creates a Windows environment inside your Mac. The great news is that &lt;strong&gt;it's completely free for personal use&lt;/strong&gt; as of 2024.&lt;/p&gt;
&lt;p&gt;It's slightly more steps to set up than Parallels, but once it's running, it works just as well.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://www.vmware.com/products/fusion.html"&gt;vmware.com/products/fusion&lt;/a&gt; and download Fusion&lt;/li&gt;
&lt;li&gt;Create a new Windows setup inside it&lt;/li&gt;
&lt;li&gt;Install your Windows apps as normal&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Free for personal use&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Anyone who wants the full Windows experience on their Mac without paying for Parallels.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Option 6: Connect to a Windows Computer Remotely&lt;/h2&gt;
&lt;p&gt;If you already have a Windows computer at home, or your workplace has Windows machines, you can control that computer from your Mac - even from a different room or a different city.&lt;/p&gt;
&lt;p&gt;Microsoft has a free app for this called &lt;strong&gt;Microsoft Remote Desktop&lt;/strong&gt;. You install it on your Mac, type in the address of your Windows computer, and your Mac screen shows the Windows desktop. You can open Power BI, use Notepad++, do anything - all remotely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to set it up:&lt;/strong&gt;
1. Search "Microsoft Remote Desktop" in the Mac App Store and install it (free)
2. Ask your IT team for your Windows computer's address, or set it up at home
3. Connect - your Windows desktop appears on your Mac screen&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Office workers whose company has Windows computers, or people who have a Windows PC at home.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;So Which One Should You Use?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you need&lt;/th&gt;
&lt;th&gt;Best option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Just view Power BI reports&lt;/td&gt;
&lt;td&gt;Power BI website (free)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build Power BI reports regularly&lt;/td&gt;
&lt;td&gt;Parallels or VMware Fusion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace Notepad++&lt;/td&gt;
&lt;td&gt;VS Code (free, works great)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run a Windows app occasionally&lt;/td&gt;
&lt;td&gt;CrossOver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Already have a Windows PC&lt;/td&gt;
&lt;td&gt;Microsoft Remote Desktop (free)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want everything Windows for free&lt;/td&gt;
&lt;td&gt;VMware Fusion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;Quick Summary&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;For Power BI&lt;/strong&gt; - use the website for viewing, or Parallels/VMware if you need the full desktop app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Notepad++&lt;/strong&gt; - just install VS Code, it does the same job and it's free&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For anything else Windows&lt;/strong&gt; - CrossOver for simple apps, Parallels/VMware for everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Mac is a brilliant computer for almost everything - and with these options, Windows-only apps don't need to slow you down anymore.&lt;/p&gt;
&lt;p&gt;Have a specific app you're trying to get working on your Mac? Feel free to reach out - happy to help.&lt;/p&gt;</content><category term="Productivity"/><category term="mac"/><category term="windows"/><category term="power bi"/><category term="notepad++"/><category term="parallels"/><category term="crossover"/><category term="tips"/></entry><entry><title>Welcome to My Blog - Thoughts on Data, AI &amp; Automation</title><link href="https://amiyapani.com/blog/welcome-to-my-blog.html" rel="alternate"/><published>2026-05-18T09:00:00+05:30</published><updated>2026-05-18T09:00:00+05:30</updated><author><name>Amiya Pani</name></author><id>tag:amiyapani.com,2026-05-18:/blog/welcome-to-my-blog.html</id><summary type="html">&lt;p&gt;Kicking off my blog with a quick introduction - what I plan to write about and why I built this space.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Welcome to my corner of the internet!&lt;/p&gt;
&lt;p&gt;I'm &lt;strong&gt;Amiya Pani&lt;/strong&gt; - a Data Engineer and AI Specialist based in Mumbai, India, with over 8 years of experience building data pipelines, intelligent automation systems, and AI-powered applications.&lt;/p&gt;
&lt;h2&gt;Why a Blog?&lt;/h2&gt;
&lt;p&gt;I've spent years solving complex data engineering challenges, designing automation frameworks, and deploying machine learning models in production. Along the way I've accumulated a lot of lessons - things I wish I'd known earlier, patterns that work, pitfalls to avoid.&lt;/p&gt;
&lt;p&gt;This blog is where I'll share that knowledge.&lt;/p&gt;
&lt;h2&gt;What to Expect&lt;/h2&gt;
&lt;p&gt;Here's what I plan to cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data Engineering&lt;/strong&gt; - ETL pipeline design, Databricks, Snowflake, AWS Glue, Apache Airflow tips and patterns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI &amp;amp; GenAI&lt;/strong&gt; - Practical applications of LLMs, RAG pipelines, prompt engineering, OpenAI API integration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python Automation&lt;/strong&gt; - Scripts, patterns, and real-world automation use cases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RPA &amp;amp; Intelligent Automation&lt;/strong&gt; - UiPath, Power Automate, Alteryx workflows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Career &amp;amp; Tools&lt;/strong&gt; - Tools I use, lessons from enterprise projects, and thoughts on the data landscape&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;A Bit About Me&lt;/h2&gt;
&lt;p&gt;Currently a &lt;strong&gt;Lead Analyst at Crisil Limited&lt;/strong&gt;, working with clients like Allianz Global Investors and Citi Bank on performance reporting automation, ETL pipelines, and risk analytics.&lt;/p&gt;
&lt;p&gt;Previously at JP Morgan, Capgemini, ACL Digital, and Healthmeter - building everything from HR chatbots and IVR systems to regulatory reporting automation and inventory management with computer vision.&lt;/p&gt;
&lt;p&gt;I hold certifications in AWS, Azure AI, Snowflake, Neo4j, UiPath, and more - and I'm currently pursuing an MBA in Business Analytics.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Stay tuned - first technical post coming soon. In the meantime, feel free to reach out on &lt;a href="https://www.linkedin.com/in/amiya-pani/"&gt;LinkedIn&lt;/a&gt; or drop me an &lt;a href="mailto:contact@amiyapani.com"&gt;email&lt;/a&gt;.&lt;/p&gt;</content><category term="General"/><category term="data engineering"/><category term="AI"/><category term="automation"/><category term="introduction"/></entry></feed>