Repository navigation
feat: transcribe on Intel integrated GPUs via OpenVINO (#131) - #132
Open
raphaelm22 wants to merge 2 commits into
Open
raphaelm22 wants to merge 2 commits into
raphaelm22 wants to merge 2 commits into
Conversation
…cure#131) faster-whisper (CTranslate2) only runs on the CPU or NVIDIA GPUs. A new "Intel GPU (OpenVINO)" compute device runs Whisper through OpenVINO GenAI's WhisperPipeline on Intel's int8 model builds. On a Core Ultra 7 265U, large-v3-turbo transcribed a 7.4 min meeting in ~45 s instead of 7.7 min on the CPU. - openvino_whisper.py (no Qt): model repos, pipeline cache with a compiled-model cache, faster-whisper's Silero VAD (WhisperPipeline has none and hallucinates over silence), 60 s speech batches as the only progress/cancel points, language detected once then pinned. - TranscriptionWorker._run_openvino: any OpenVINO failure, at load or mid-run, falls back to the CPU; unreadable audio still errors. - Settings: new device entry with inline status; openvino-genai is installed on demand, asked before any config write since Config.set() saves immediately. - System Status: Intel GPU row when selected, and the Whisper model check looks for the OpenVINO build. - openvino extra in pyproject (uv.lock: only the four new packages), commented line in requirements.txt, module in the CI import smoke.
This was referenced Oct 15, 2026
Author
|
Ready for review. Used daily since 15/10 on a Core Ultra 7 265U (Intel GPU selected, live transcription on): 7 real Teams meetings, 11 to 115 min, pt-BR, 4 to 6 speakers. No fallbacks or errors in the log. Whisper large-v3-turbo on the iGPU throughout, no CPU fallback needed. |
raphaelm22
marked this pull request as ready for review
October 22, 2026 13:27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements #131. A third Compute Device, Intel GPU (OpenVINO), runs Whisper on Intel integrated GPUs through OpenVINO GenAI's
WhisperPipeline. faster-whisper (CTranslate2) only supports the CPU and NVIDIA.On a Core Ultra 7 265U (Intel Graphics iGPU), the test was a real 7.4 min pt-BR meeting with large-v3-turbo:
On a 60 s excerpt the text matched faster-whisper's word for word, and segment start/end times are the same.
How it works
app/transcription/openvino_whisper.py(no Qt; OpenVINO and faster-whisper imported inside functions):OpenVINO/whisper-<size>-int8-ov, one per model size in Settings, downloaded to the normal HF cache._MODEL_CACHE. The compiled model is cached in~/.talktrack/openvino_cache.WhisperPipelinehas none, and Whisper invents text over silence: 20 s of silence came back as "E aí". faster-whisper's own Silero VAD picks the speech, only speech is decoded, and aTimeMapmaps times back to the recording.generate()blocks, and its streamer is not available with timestamps on long audio, so batches are the only progress and cancel points.max_speech_duration_s=60, which splits long speech at a short pause, as the batched pipeline does at 30 s.TranscriptionWorker._run_openvino: any OpenVINO failure falls back to the CPU, at load (package missing, no GPU) or mid-run (driver hang); the pipeline is evicted and the user sees the reason in the progress line. Unreadable audio still errors, since the CPU would fail too.openvino-genai(~90 MB download) is installed on demand through the existingpackage_installer, as the AI SDKs are.None.openvinoextra inpyproject.toml, plus a commented line inrequirements.txt. One test keeps the three pip specs equal.uv.lockadds only the four new packages. As in fix: cap PyAV below 19 so faster-whisper can decode audio (#127) #130, I hand-applied them over master's lock to avoid uv's marker reordering, anduv lock --checkpasses on uv 0.12.7 and 0.13.0._resolve_device("intel_gpu")→cpu). OpenVINO ships TBB rather than anotherlibiomp5md.dll, so App deadlocks at zero CPU when diarization follows transcription (duplicate libiomp5md.dll) #70's duplicate-OpenMP deadlock doesn't apply. pyannote ran normally in the same process after OpenVINO.Worth reviewing
Config.set()saves immediately. The OpenVINO install prompt therefore runs before anyconfig.set()in_save_and_close, so declining leaves settings.json untouched. The existing AI-SDK prompt sits after the sets, so itsreturn # User cancelled install, don't savedoes not actually prevent the save. I left that alone since it's out of scope here.confidencestays 0.0 for these segments. OpenVINO reports no per-segment log-probability, and nothing reads the field today.ZE_RESULT_ERROR_DEVICE_LOST, 2/2 runs), and onlysmallran (35 s for the same meeting).Tests
tests/test_openvino_whisper.py: model repos, batching, time mapping, the transcribe loop against a fake pipeline, language pinning, GPU detection, the pipeline cache and download, the pip-spec sync and the Settings prompt order.test_transcriber.py: GPU path, fallback at load and mid-run, cancel, unreadable audio.test_dependency_checker.py.QApplicationwith torch loaded first, asmain.pydoes, I ran the realTranscriptionWorkeron the meeting:openvino_genaiblockedDiarizationWorkerafterwards in the same processsavedisabled so nothing was written.Closes #131
🤖 Generated with Claude Code