How to run Orpheus TTS on a cloud GPU

Rent a GPU on Deploy, then open a terminal in JupyterLab or over SSH. Install Orpheus TTS from the official repository with the streaming example the README prints, which installs the orpheus-speech package and then pins vLLM, and copy output.wav off the instance before you destroy it. Destroying the instance deletes its disk.

Other speech pages: How to run Kokoro TTS on a cloud GPU, How to run Chatterbox TTS on a cloud GPU, and How to run F5-TTS on a cloud GPU. The README’s vLLM line is the package install below. Serving a separate API process is How to serve an OpenAI-compatible API with vLLM on a cloud GPU. If the process runs out of memory: How to fix CUDA out of memory on a cloud GPU.

The README says Orpheus TTS is built on the Llama-3b backbone. LICENSE is the Apache License, Version 2.0, January 2004, and its appendix copyright line is still the unfilled template Copyright [yyyy] [name of copyright owner] (read 2026-11-13). The GitHub license field the same day was Apache-2.0. orpheus_tts_pypi/setup.py classifiers include License :: OSI Approved :: MIT License, and python_requires is >=3.7. The PyPI metadata for orpheus-speech 0.1.0 the same day had an empty license field, requires_python >=3.7, and requires_dist snac and vllm. The model cards for canopylabs/orpheus-tts-0.1-finetune-prod and canopylabs/orpheus-tts-0.1-pretrained each had license apache-2.0 and gated auto. A fetch of each card README returned HTTP 401, so this page does not quote the card body. The two license statements in the repository are the Apache file and the MIT classifier. This page does not merge them. Read both before you redistribute the program.

pretrain/config.yaml sets model_name and tokenizer_name. Each card’s base_model list includes an id this page does not copy. The finetune-prod card also lists canopylabs/orpheus-3b-0.1-pretrained. Copy the two pretrain lines from that yaml. This page does not copy a repository id under a closed-model vendor namespace.

The commands below are copied from the upstream files named in each step. They were not run on a CloudGPU instance for this page. Anything this page adds around them is marked.

What the README and the model API say about memory

The README abilities list says “~200ms streaming latency” for realtime applications, “reducible to ~100ms with input streaming.” Those are latency lines in the README. This page did not measure them. They are not a startup time and they are not a GPU GB figure. The README, the streaming example, and orpheus_tts_pypi/orpheus_tts/engine_class.py publish no GPU GB figure. The model API safetensors total for canopylabs/orpheus-tts-0.1-finetune-prod was 3782986752, all F32, sha 4206a56e5a68cf6cf96900a8a78acd3370c02eb6. The same total and the same sha were returned for canopylabs/orpheus-3b-0.1-ft. The total for canopylabs/orpheus-tts-0.1-pretrained was 3782980608, all F32, sha bf0cce99761b2f5857b3d85829691f696bf20cb0. The same total and the same sha were returned for canopylabs/orpheus-3b-0.1-pretrained. Those totals are parameter counts from the model API. This page does not convert them into GB. The pretrained README line says the base model is trained on 100k+ hours of English speech. That is a data-size line in the README, not a VRAM figure.

GET /v1/public/compute-capabilities does not list GPUs. It returns feature flags. The memory column is vram_gb from gpu-prices.json, updated_at 2026-11-13T00:01:03.458Z. GET /v1/public/gpu-catalog the same day (generated_at 2026-11-13T00:01:04.537Z) listed the same names and the same vram_gb values, plus Ascend 910B at 64, which is not in gpu-prices.json and is not listed here. The catalog response also includes an availability field. This page does not copy it. Every prices row has gpu_count 1. Every vram_gb below is 8 or higher. This page does not mark a row as enough, because the README publishes no GB figure to compare. Which listing you can start is on Deploy.

The catalog template list had no Orpheus template.

Catalog name vram_gb
RTX 2080 8
RTX 3080 10
RTX 2080 Ti 11
RTX 3080 Ti 12
V100 16G 16
A30 24
RTX 3090 24
RTX 4090 24
RTX 4090D 24
RTX 4080 SUPER 32G 32
RTX 5090 32
RTX 5090D 32
V100 32G 32
A100 40G 40
A800 40G 40
A40 48
RTX 4090 48G 48
RTX 4090D 48G 48
RTX A6000 48
NVIDIA RTX PRO 5000 72G 72
RTX PRO 5000 72G 72
A100 80G 80
A800 80G 80
H800 80
RTX 6000D 83
H20 96G 96
RTX PRO 6000 96G 96
RTX PRO 6000 Max-Q 96
H20-3e 141G 141

Install and run the streaming example

On Deploy, choose Raw GPU. The deploy page says “SSH access and root within a dedicated container”. The README also links notebooks and a hosted deployment. This page follows the streaming example printed in the README and does not copy those other sections.

The README’s streaming section prints the clone, then the install, then a note, then the Python example. The printed list numbers those as 1, 2, and 4. Copied:

git clone https://github.com/canopyai/Orpheus-TTS.git
cd Orpheus-TTS && pip install orpheus-speech

The note on the same step says vLLM pushed a slightly buggy version on March 18th, and that some bugs are being resolved by reverting to this pin after pip install orpheus-speech:

pip install vllm==0.7.3

That sentence is the README’s reason for the pin. This page did not check a vLLM release date. PyPI metadata for vllm 0.7.3 the same day set requires_python to >=3.9 and pinned torch==2.5.1, torchaudio==2.5.1, and torchvision==0.20.1. setup.py in this repository still says python_requires >=3.7. This page did not install either package.

The commits API on 2026-11-13 listed e64661fe6d02c414fc77c53578c9d64082614861 on the default branch main, committed 2025-12-05T19:01:02Z, message “Merge pull request #294 from threadedrabbit/issue-290”.

The Python example, copied. It writes output.wav in the working directory. The wave header in the example is 1 channel, sample width 2, and frame rate 24000. decoder.py loads SNAC.from_pretrained("hubertsiuzdak/snac_24khz").

from orpheus_tts import OrpheusModel
import wave
import time

model = OrpheusModel(model_name ="canopylabs/orpheus-tts-0.1-finetune-prod", max_model_len=2048)
prompt = '''Man, the way social media has, um, completely changed how we interact is just wild, right? Like, we're all connected 24/7 but somehow people feel more alone than ever. And don't even get me started on how it's messing with kids' self-esteem and mental health and whatnot.'''

start_time = time.monotonic()
syn_tokens = model.generate_speech(
   prompt=prompt,
   voice="tara",
   )

with wave.open("output.wav", "wb") as wf:
   wf.setnchannels(1)
   wf.setsampwidth(2)
   wf.setframerate(24000)

   total_frames = 0
   chunk_counter = 0
   for audio_chunk in syn_tokens:
      chunk_counter += 1
      frame_count = len(audio_chunk) // (wf.getsampwidth() * wf.getnchannels())
      total_frames += frame_count
      wf.writeframes(audio_chunk)
   duration = total_frames / wf.getframerate()

   end_time = time.monotonic()
   print(f"It took {end_time - start_time} seconds to generate {duration:.2f} seconds of audio")

The example’s print line reports a duration after a run. This page did not run it, so it does not publish a number for that print. The cards are gated: auto. How to download a Hugging Face model is the login reference. The streaming example does not print a login command.

OrpheusModel.__init__ defaults dtype to torch.bfloat16 and tokenizer to canopylabs/orpheus-3b-0.1-pretrained. Extra keyword arguments are passed to vLLM’s AsyncEngineArgs. The example sets max_model_len to 2048 and does not pass repetition_penalty. The README prompting section says repetition_penalty>=1.1 is required for stable generations, and that increasing repetition_penalty and temperature makes the model speak faster. generate_tokens_sync defaults repetition_penalty to 1.3, temperature to 0.6, top_p to 0.8, and max_tokens to 1200. This page did not run the call, so it does not claim which default the installed package uses if that package differs from this file.

The README says the English voice names, in an order it calls subjective benchmarks, are tara, leah, jess, leo, dan, mia, zac, and zoe. Emotive tags it prints are <laugh>, <chuckle>, <sigh>, <cough>, <sniffle>, <groan>, <yawn>, and <gasp>. engine_class.py sets available_voices to zoe, zac, jess, leo, mia, julia, and leah. That list does not include tara or dan, and it includes julia. generate_speech does not call validate_voice. validate_voice checks self.engine.available_voices, which is not the list attribute above. This page did not run either function.

If a KV cache error appears, or max_model_len does not exist, the README says to use the local package instead of the installed PyPI version:

import sys
sys.path.insert(0, 'orpheus_tts_pypi')
from orpheus_tts import OrpheusModel

_map_model_params returns model_name[model_name]["repo_id"] when the argument is the key medium-3b. The README example passes the full repository id canopylabs/orpheus-tts-0.1-finetune-prod, which is not that key, so the function returns the argument unchanged. This page did not run the function. The finetune config.yaml sets model_name to canopylabs/orpheus-tts-0.1-pretrained. The README’s finetune section prints pip install transformers datasets wandb trl flash_attn torch, two login commands, and accelerate launch train.py. This page follows the inference example and does not copy that launch.

The ComfyUI examples top-level list on 2026-11-13 had no Orpheus directory. This repository’s README does not print a ComfyUI install.

A server file in the repository

The README streaming section does not print realtime_streaming_example/main.py. That file imports Flask, constructs OrpheusModel(model_name="canopylabs/orpheus-tts-0.1-finetune-prod"), and calls app.run(host='0.0.0.0', port=8080, threaded=True). The route is /tts. setup.py does not list Flask. The README does not print a Flask install. This page does not add one and does not edit the host. The SSH guide’s FAQ says that for a private session, 127.0.0.1 is enough, and that 0.0.0.0 makes an app reachable from other addresses. How to use SSH port forwarding on a cloud GPU is the tunnel if you run that file. This page did not run it. The documented example above writes output.wav and does not open a port.

The README lists four third-party projects and says it cannot verify that they are accurate. This page does not copy their install steps.

To keep the documented example running after the SSH session closes, this page wraps it in tmux. The README does not print tmux. Save the example as a file yourself. This page does not add a filename the README does not print:

tmux new -s orpheus
cd Orpheus-TTS
python your_script.py

When it fails

CUDA out of memory. The README does not print an out-of-memory flag or a GB target. If the process raises that error, use how to fix CUDA out of memory on a cloud GPU.

“CUDA error: no kernel image is available for execution on the device” on an RTX 5090. The README’s vLLM pin is vllm==0.7.3. PyPI metadata for that version pins torch==2.5.1. The README does not name compute capability 12.0. The RTX 5090 guide says that card is compute capability 12.0 (sm_120) and that PyTorch 2.7 and later, on a build for CUDA 12.8 or newer, is the line that announced support. This page did not install a torch wheel and did not re-test Orpheus on an RTX 5090. Catalog RTX 5090 and RTX 5090D are 32. That is the catalog number only.

KV cache or a missing max_model_len. The README’s response is the sys.path.insert block above, so the import uses orpheus_tts_pypi from the clone. This page did not run that import.

Save the audio, then destroy

The streaming example writes output.wav in the working directory. Copy that file off the instance before you destroy it. Save your work before you destroy a cloud GPU is the checklist. The terms say data on local instance storage is permanently deleted when the instance is destroyed.

The pricing page FAQ states the billing rule in these words:

Per-minute options have a 1-minute minimum; unused prepaid minutes are refunded when you destroy the instance. Some configurations use whole-hour billing with a 1-hour minimum; unused time within a charged hour is not refunded on voluntary stop. The billing period, minimum charge and initial prepayment are shown before confirmation. No subscription.

Prices are not copied here.

Frequently asked questions

How much VRAM does the Orpheus README publish?

The Orpheus README, the streaming example, and engine_class.py publish no GPU GB figure. The README says streaming latency is ~200ms, reducible to ~100ms with input streaming. Those are latency lines, not a VRAM figure, and this page did not measure them. The model API safetensors total is 3782986752 parameters for canopylabs/orpheus-tts-0.1-finetune-prod and 3782980608 parameters for canopylabs/orpheus-tts-0.1-pretrained. Those counts are not a VRAM figure. Every vram_gb in https://cloudgpu.app/gpu-prices.json (updated_at 2026-11-13T00:01:03.458Z) is 8 or higher. This page does not mark a row as enough. Which listing you can start is on https://cloudgpu.app/deploy.

What vLLM command does the README print?

The README says pip install orpheus-speech uses vLLM, and it then prints pip install vllm==0.7.3. The streaming example constructs OrpheusModel with model_name canopylabs/orpheus-tts-0.1-finetune-prod and max_model_len 2048. That is the package route. This page does not add a separate vLLM server command. The vLLM server guide is a different install. PyPI metadata for vllm 0.7.3 pins torch==2.5.1 and requires Python >=3.9. This page did not install the packages.

What is the license, and which id does this page leave out?

LICENSE is the Apache License, Version 2.0, January 2004, and the appendix copyright line is still the unfilled template. setup.py classifiers say MIT. This page does not merge those two statements. The model cards report license apache-2.0 and gated auto. A fetch of each card README returned HTTP 401, so this page does not quote the card body. pretrain/config.yaml sets model_name and tokenizer_name to an id this page does not copy. Copy those two lines from that file. Each card base_model list also includes an id this page does not copy. The finetune-prod card also lists canopylabs/orpheus-3b-0.1-pretrained.

Do the audio files stay on the instance after I destroy it?

No. The streaming example writes output.wav in the working directory. Copy that file off before you destroy the instance. The terms say data on local instance storage is permanently deleted when the instance is destroyed.

Sources (read 2026-11-13, Asia/Shanghai)

  • Orpheus-TTS README (clone, pip install orpheus-speech, vllm==0.7.3, streaming example, output.wav, voice names, latency lines, local-package fallback): https://github.com/canopyai/Orpheus-TTS/blob/main/README.md
  • orpheus_tts_pypi/orpheus_tts/engine_class.py (default tokenizer, available_voices, repetition_penalty 1.3), decoder.py (hubertsiuzdak/snac_24khz), realtime_streaming_example/main.py (host='0.0.0.0', port 8080), setup.py (MIT classifier, python_requires>=3.7), pretrain/config.yaml (model lines not copied here), finetune/config.yaml (canopylabs/orpheus-tts-0.1-pretrained): that repository, commit e64661fe6d02c414fc77c53578c9d64082614861
  • LICENSE (Apache 2.0, January 2004; unfilled copyright template): that repository
  • Model API for canopylabs/orpheus-tts-0.1-finetune-prod and canopylabs/orpheus-tts-0.1-pretrained (license apache-2.0, gated auto, safetensors totals above; card README HTTP 401): https://huggingface.co/canopylabs/orpheus-tts-0.1-finetune-prod and https://huggingface.co/canopylabs/orpheus-tts-0.1-pretrained
  • PyPI orpheus-speech 0.1.0 (snac, vllm, Python >=3.7) and PyPI vllm 0.7.3 (torch==2.5.1, Python >=3.9)
  • ComfyUI examples top-level directories (no Orpheus directory): https://github.com/comfyanonymous/ComfyUI_examples commit f9431bb000ce792094ff345446e22cac1ea6cef3
  • Public GPU memory: https://cloudgpu.app/gpu-prices.json (updated_at 2026-11-13T00:01:03.458Z) and https://cloudgpu.app/v1/public/gpu-catalog (generated_at 2026-11-13T00:01:04.537Z). GET /v1/public/compute-capabilities returned feature flags and no GPU list.

Cards you can start are on the Deploy page. Prices are on https://cloudgpu.app/pricing and are not repeated here.

Last updated: 2026-11-13 (Asia/Shanghai).