WhisperLive

collaboraMIT活跃维护

把 OpenAI Whisper 做成近实时的语音转文字服务,支持 TensorRT、OpenVINO、ROCm 等硬件加速,适合直播字幕和听写场景。

A nearly-live implementation of OpenAI's Whisper.

v0.10.0发布于 2026-09-07 09:03 UTC4,355star +6 / 7 天609fork同步于 2026-11-10 17:39 UTC

怎么上手

由 README 提炼,执行前请确认
bash scripts/setup.sh
pip install whisper-live
python3 run_server.py --port 9090 --backend faster_whisper
硬件要求按 README 说明

README 未给出具体显存要求;TensorRT 后端需 NVIDIA GPU 并预先构建引擎,OpenVINO 后端面向 Intel CPU、iGPU 和 dGPU,faster_whisper 支持 AMD ROCm。

支持 ROCm / AMD有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

基于 OpenAI Whisper 的准实时语音转写服务,支持麦克风、音频文件与流媒体输入

把 OpenAI Whisper 做成近实时的语音转文字服务,支持 TensorRT、OpenVINO、ROCm 等硬件加速,适合直播字幕和听写场景。

核心能力

  • 服务端支持 faster_whisper、TensorRT、OpenVINO 三种后端
  • 通过 WebSocket 服务端加客户端实现近实时转写
  • 支持词级时间戳与置信度输出
  • 支持热词提升专有名词识别率
  • 可选 pyannote 说话人分离与批量推理

容易踩的坑

需先安装 PortAudio 系统依赖,否则麦克风输入不可用;TensorRT 后端须先按 TensorRT_whisper 文档构建引擎,且推荐用 Docker;说话人分离需额外 pip install pyannote.audio,未装则自动跳过;默认端口 9090,客户端需与服务端端口一致。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.10.0
  1. v0.10.0最新正式版2026-09-07 · 2026-09-07 09:03 UTC

    What's Changed

    New Contributors

    Full Changelog: https://github.com/collabora/WhisperLive/compare/v0.9.0...v0.10.0

  2. v0.9.02026-06-02 · 2026-06-02 06:25 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/collabora/WhisperLive/compare/v0.8.0...v0.9.0

  3. v0.8.02026-03-17 · 2026-03-17 09:38 UTC
    查看更新说明

    What's Changed

    New Contributors

    Full Changelog: https://github.com/collabora/WhisperLive/compare/v0.7.1...v0.8.0

  4. v0.7.12025-05-15 · 2025-05-15 04:56 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/collabora/WhisperLive/compare/v0.6.3...v0.7.1

  5. v0.6.32025-02-26 · 2025-02-26 14:12 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/collabora/WhisperLive/compare/v0.6.2...v0.6.3

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    WhisperLive

    This project is a real-time transcription application that uses the OpenAI Whisper model to convert speech input into text output. It can be used to transcribe both live audio input from microphone and pre-recorded audio files.

    Installation

    • Install PortAudio (required system dependency for microphone input via PyAudio)
     bash scripts/setup.sh
    

    On Debian/Ubuntu this installs portaudio19-dev, on Fedora portaudio-devel, on macOS it uses Homebrew (portaudio).

    • Install 3.12 venv (on Fedora sudo dnf install -y python3.12 python3.12-pip)
    python3.12 -m venv whisper_env
    source whisper_env/bin/activate
    
    • Install whisper-live from pip
     pip install whisper-live
    

    OpenAI REST interface

    Server
    python3 run_server.py --port 9090 --backend faster_whisper --max_clients 4 --max_connection_time 600 --enable_rest --cors-origins="http://localhost:8080,http://127.0.0.1:8080"
    
    Client
    python3 client_openai.py $AUDIO_FILE
    

    Setting up NVIDIA/TensorRT-LLM for TensorRT backend

    Getting Started

    The server supports 3 backends faster_whisper, tensorrt and openvino. If running tensorrt backend follow TensorRT_whisper readme

    Running the Server

    python3 run_server.py --port 9090 \
                          --backend faster_whisper \
                          --max_clients 4 \
                          --max_connection_time 600
      
    # running with custom model and cache_dir to save auto-converted ctranslate2 models
    python3 run_server.py --port 9090 \
                          --backend faster_whisper \
                          --max_clients 4 \
                          --max_connection_time 600 \
                          -fw "/path/to/custom/faster/whisper/model" \
                          -c ~/.cache/whisper-live/
    
    • TensorRT backend. Currently, we recommend to only use the docker setup for TensorRT. Follow TensorRT_whisper readme which works as expected. Make sure to build your TensorRT Engines before running the server with TensorRT backend.
    # Run English only model
    python3 run_server.py -p 9090 \
                          -b tensorrt \
                          -trt /home/TensorRT-LLM/examples/whisper/whisper_small_en \
                          --max_clients 4 \
                          --max_connection_time 600
    
    # Run Multilingual model
    python3 run_server.py -p 9090 \
                          -b tensorrt \
                          -trt /home/TensorRT-LLM/examples/whisper/whisper_small \
                          -m \
                          --max_clients 4 \
                          --max_connection_time 600
    

    Note: The TensorRT backend uses a C++ session by default. If you experience issues (e.g. repeated CrossAttentionMask warnings or crashes), add the --trt_py_session flag to use the Python session instead.

    • Use --max_clients option to restrict the number of clients the server should allow. Defaults to 4.
    • Use --max_connection_time options to limit connection time for a client in seconds. Defaults to 600.
    • WhisperLive now supports the OpenVINO backend for efficient inference on Intel CPUs, iGPU and dGPUs. Currently, we tested the models uploaded to huggingface by OpenVINO.
      • Docker Recommended: Running WhisperLive with OpenVINO inside Docker automatically enables GPU support (iGPU/dGPU) without requiring additional host setup.

      • Native (non-Docker) Use: If you prefer running outside Docker, ensure the Intel drivers and OpenVINO runtime are installed and properly configured on your system. Refer to the documentation for installing OpenVINO.

    python3 run_server.py -p 9090 -b openvino
    

    Setting up AMD ROCm for faster_whisper backend

    • Please follow ROCm_whisper readme for setup of AMD ROCm GPU support with the CTranslate2 ROCm wheel.
    Controlling OpenMP Threads

    To control the number of threads used by OpenMP, you can set the OMP_NUM_THREADS environment variable. This is useful for managing CPU resources and ensuring consistent performance. If not specified, OMP_NUM_THREADS is set to 1 by default. You can change this by using the --omp_num_threads argument:

    python3 run_server.py --port 9090 \
                          --backend faster_whisper \
                          --omp_num_threads 4
    
    Single model mode

    By default, when running the server without specifying a model, the server will instantiate a new whisper model for every client connection. This has the advantage, that the server can use different model sizes, based on the client's requested model size. On the other hand, it also means you have to wait for the model to be loaded upon client connection and you will have increased (V)RAM usage.

    When serving a custom TensorRT model using the -trt or a custom faster_whisper model using the -fw option, the server will instead only instantiate the custom model once and then reuse it for all client connections.

    If you don't want this, set --no_single_model.

    Running the Client

    Use the below command to run the client:

    python3 run_client.py --files <audio-file-name>
    

    This will connect to the localhost server running on port 9090 by default. Use flags --server and --port to use different configurations. The above command will transcribe audio file provided with --files flag.

    Here are the details of client instance implemented in run_client.py script:

    • lang: Language of the input audio, applicable only if using a multilingual model.
    • translate: If set to True then translate from any language to en.
    • model: Whisper model size.
    • use_vad: Whether to use Voice Activity Detection on the server.
    • save_output_recording: Set to True to save the microphone input as a .wav file during live transcription. This option is helpful for recording sessions for later playback or analysis. Defaults to False.
    • output_recording_filename: Specifies the .wav file path where the microphone input will be saved if save_output_recording is set to True.
    • mute_audio_playback: Whether to mute audio playback when transcribing an audio file. Defaults to False.
    • enable_translation: Start translation thread on the server (from any to any).
    • target_language: Server translation thread's target translation language.
    from whisper_live.client import TranscriptionClient
    client = TranscriptionClient(
      "localhost",
      9090,
      lang="en",
      translate=False,
      model="small",                                      # also support hf_model => `Systran/faster-whisper-small`
      use_vad=False,
      save_output_recording=True,                         # Only used for microphone input, False by Default
      output_recording_filename="./output_recording.wav", # Only used for microphone input
      mute_audio_playback=False,                          # Only used for file input, False by Default
      enable_translation=True,
      target_language="hi",
      initial_prompt=None,                                # Add context for the model, e.g. 'Jane Doe context'
    )
    

    It connects to the server running on localhost at port 9090. Using a multilingual model, language for the transcription will be automatically detected. You can also use the language option to specify the target language for the transcription, in this case, English ("en"). The translate option should be set to True if we want to translate from the source language to English and False if we want to transcribe in the source language.

    • Transcribe an audio file:
    client("tests/jfk.wav")
    
    • To transcribe from microphone:
    client()
    
    • To transcribe from a RTSP stream:
    client(rtsp_url="rtsp://admin:[email protected]/rtsp")
    
    • To transcribe from a HLS stream:
    client(hls_url="http://as-hls-ww-live.akamaized.net/pool_904/live/ww/bbc_1xtra/bbc_1xtra.isml/bbc_1xtra-audio%3d96000.norewind.m3u8")
    

    Advanced Features

    Word-Level Timestamps

    Enable per-word timing and confidence scores in transcription segments:

    client = TranscriptionClient(
      "localhost", 9090,
      word_timestamps=True,
    )
    

    When enabled, each segment in the WebSocket response includes a words array:

    {
      "segments": [{
        "start": "0.000", "end": "2.500", "text": "Hello world",
        "words": [
          {"word": "Hello", "start": "0.000", "end": "0.800", "probability": 0.95},
          {"word": " world", "start": "0.900", "end": "2.500", "probability": 0.88}
        ]
      }]
    }
    
    Custom Vocabulary / Hotwords

    Boost recognition of specific terms (product names, acronyms, domain jargon):

    client = TranscriptionClient(
      "localhost", 9090,
      hotwords="WhisperLive,TensorRT,OpenVINO",
    )
    

    The hotwords parameter is a comma-separated string passed directly to faster-whisper's keyword boosting. Also available in the REST API via the hotwords form field.

    Speaker Diarization

    Real-time speaker identification using pyannote.audio embeddings (optional dependency):

    pip install pyannote.audio
    
    client = TranscriptionClient(
      "localhost", 9090,
      enable_diarization=True,
      max_speakers=4,
    )
    

    When enabled, completed segments include a speaker field:

    {"start": "0.000", "end": "2.500", "text": "Hello", "speaker": "SPEAKER_00", "completed": true}
    

    Diarization uses online cosine-similarity clustering of speaker embeddings. If pyannote.audio is not installed, the server logs a warning and continues without diarization.

    The OpenAI-compatible REST endpoint also accepts known_speaker_names and uploaded known_speaker_references multipart fields. When speaker fields are supplied with response_format="verbose_json", segments include a speaker field.

    Batch Inference

    Batch multiple client sessions into single GPU calls for higher throughput:

    python3 run_server.py --port 9090 --backend faster_whisper \
      --batch_inference --batch_max_size 8 --batch_window_ms 50
    
    Raw PCM Input

    Accept raw PCM int16 audio from clients (useful for embedded devices):

    python3 run_server.py --port 9090 --backend faster_whisper --raw_pcm_input
    

    Audio is automatically normalized to float32 range [-1.0, 1.0]. Clients can also set audio_format in the initial websocket options to float32 (default), int16, or uint8.

    Streaming Client (manual audio streaming from any source)

    StreamingTranscriptionClient lets you push raw PCM audio bytes from any source — a live microphone capture loop, a network stream, an audio pipeline — and receive transcripts via callbacks as speech is detected. Unlike TranscriptionClient, it does not manage audio capture internally; you control when and how audio is fed.

    A runnable example that reads from an audio file and streams the chunks is at examples/manual_audio_chunking.py:

    python examples/manual_audio_chunking.py --file assets/jfk.flac
    

    Example usage:

    from whisper_live.client import StreamingTranscriptionClient
    
    client = StreamingTranscriptionClient(
        "localhost", 9090,
        lang="en",
        model="small",
        on_session_started=lambda: print("Server ready"),
        on_partial_transcript=lambda text, segs: print(f"… {text}", end="\r"),
        on_committed_transcript=lambda text, segs: print(f"✓ {text}"),
        on_error=lambda e: print(f"Error: {e}"),
        on_close=lambda: print("Closed"),
    )
    
    with client:
        for chunk in my_audio_source:          # any cadence, any chunk size
            client.send(chunk, pcm_format="int16")
    

    Audio must be mono, 16 kHz PCM. Two formats are accepted:

    pcm_formatDescription
    "int16" (default for raw microphone data)16-bit signed integers, normalized internally
    "float32"32-bit floats in [-1, 1], passed through directly

    NumPy arrays can be sent with send_array():

    import numpy as np
    samples = np.frombuffer(raw_bytes, dtype=np.int16)
    client.send_array(samples)
    

    Callbacks

    CallbackSignatureWhen fired
    on_session_started() -> NoneServer handshake complete, ready to receive audio
    on_partial_transcript(text, segments) -> NoneIn-progress segment updated
    on_committed_transcript(text, segments) -> NoneSegment finalized
    on_translation(text, segments) -> NoneTranslated segment ready (requires enable_translation=True)
    on_error(error) -> NoneWebSocket error
    on_close() -> NoneConnection closed

    Browser Extensions

    Aavaaz

    Aavaaz is a production-grade speech-to-text platform built on WhisperLive, adding speaker diarization, sentiment analysis, PII redaction, webhooks, and OpenAI-compatible REST APIs. It's free to try -- see the Aavaaz README to get started.

    iOS Client

    Use WhisperLive on iOS with our native iOS client.
    Refer to ios-client and ios-client/README.md for setup and usage instructions.

    Whisper Live Server in Docker

    • GPU

      • Faster-Whisper
      docker run -it --gpus all -p 9090:9090 ghcr.io/collabora/whisperlive-gpu:latest
      
      docker build . -f docker/Dockerfile.tensorrt -t whisperlive-tensorrt
      docker run -p 9090:9090 --runtime=nvidia --gpus all --entrypoint /bin/bash -it whisperlive-tensorrt
      
      # Build small.en engine
      bash build_whisper_tensorrt.sh /app/TensorRT-LLM-examples small.en        # float16
      bash build_whisper_tensorrt.sh /app/TensorRT-LLM-examples small.en int8   # int8 weight only quantization
      bash build_whisper_tensorrt.sh /app/TensorRT-LLM-examples small.en int4   # int4 weight only quantization
      
      # Run server with small.en (pick one engine)
      python3 run_server.py --port 9090 \
                            --backend tensorrt \
                            --trt_model_path "/app/TensorRT-LLM-examples/whisper/whisper_small_en_float16"
      # or int8 / int4:
      # --trt_model_path "/app/TensorRT-LLM-examples/whisper/whisper_small_en_int8"
      # --trt_model_path "/app/TensorRT-LLM-examples/whisper/whisper_small_en_int4"
      
      • OpenVINO
      docker run -it --device=/dev/dri -p 9090:9090 ghcr.io/collabora/whisperlive-openvino
      
      • AMD ROCm (faster-whisper on AMD GPU via CTranslate2 ROCm wheel)
      docker build -f docker/Dockerfile.rocm -t whisperlive-rocm .
      docker run --rm -it --device=/dev/kfd --device=/dev/dri \
          --group-add "$(getent group video | cut -d: -f3)" \
          --group-add "$(getent group render | cut -d: -f3)" \
          -p 9090:9090 whisperlive-rocm
      
    • CPU

      • Faster-whisper
      docker run -it -p 9090:9090 ghcr.io/collabora/whisperlive-cpu:latest
      

    Troubleshooting

    macOS OpenMP runtime conflict

    On macOS, especially on Intel Macs, faster_whisper/ctranslate2 can conflict with OpenMP runtimes loaded by other Python packages. If the server aborts with a duplicate OpenMP runtime error, run the server with KMP_DUPLICATE_LIB_OK=TRUE:

    KMP_DUPLICATE_LIB_OK=TRUE python3 run_server.py --port 9090 \
                          --backend faster_whisper \
                          --max_clients 4 \
                          --max_connection_time 600 \
                          --no_single_model
    

    This workaround is intended for local development and testing. For production deployments, prefer using a clean environment that loads only one OpenMP runtime.

    Future Work

    • Add translation to other languages on top of transcription.

    Blog Posts

    Contact

    We are available to help you with both Open Source and proprietary AI projects. You can reach us via the Collabora website or [email protected] and [email protected].

    Citations

    @article{Whisper
      title = {Robust Speech Recognition via Large-Scale Weak Supervision},
      url = {https://arxiv.org/abs/2212.04356},
      author = {Radford, Alec and Kim, Jong Wook and Xu, Tao and Brockman, Greg and McLeavey, Christine and Sutskever, Ilya},
      publisher = {arXiv},
      year = {2022},
    }
    
    @misc{Silero VAD,
      author = {Silero Team},
      title = {Silero VAD: pre-trained enterprise-grade Voice Activity Detector (VAD), Number Detector and Language Classifier},
      year = {2021},
      publisher = {GitHub},
      journal = {GitHub repository},
      howpublished = {\url{https://github.com/snakers4/silero-vad}},
      email = {[email protected]}
    }