import type { CatalogModel } from '@sirene/shared';
import { OPENAI_VOICES } from '../repositories';

export const modelsCatalog: CatalogModel[] = [
  {
    id: 'kokoro-v1.0',
    name: 'Kokoro v1.0',
    backend: 'kokoro',
    backendDisplayName: 'Kokoro',
    backendDescription: 'Lightweight, fast, multi-language preset voice synthesis using ONNX.',
    description: 'Kokoro TTS - lightweight, fast, multi-language voice synthesis using ONNX runtime.',
    repo: 'onnx-community/Kokoro-82M-v1.0-ONNX',
    files: [
      'onnx/model.onnx',
      { path: 'config.json', repo: 'hexgrad/Kokoro-82M' },
      'voices/af_heart.bin',
      'voices/af_bella.bin',
      'voices/af_sky.bin',
      'voices/af_nova.bin',
      'voices/af_sarah.bin',
      'voices/am_adam.bin',
      'voices/am_michael.bin',
      'voices/am_echo.bin',
      'voices/bf_emma.bin',
      'voices/bm_george.bin',
      'voices/ff_siwis.bin',
    ],
    size: 336_000_000,
    types: ['preset'],
    presetVoices: [
      { id: 'af_heart', label: 'Heart (F)' },
      { id: 'af_bella', label: 'Bella (F)' },
      { id: 'af_sky', label: 'Sky (F)' },
      { id: 'af_nova', label: 'Nova (F)' },
      { id: 'af_sarah', label: 'Sarah (F)' },
      { id: 'am_adam', label: 'Adam (M)' },
      { id: 'am_michael', label: 'Michael (M)' },
      { id: 'am_echo', label: 'Echo (M)' },
      { id: 'bf_emma', label: 'Emma (F)' },
      { id: 'bm_george', label: 'George (M)' },
      { id: 'ff_siwis', label: 'Siwis (F)' },
    ],
  },

  {
    id: 'qwen3-tts-1.7B',
    name: 'Qwen3-TTS 1.7B Base',
    backend: 'qwen',
    backendDisplayName: 'Qwen',
    backendDescription: 'High-quality multilingual speech synthesis with voice cloning by Alibaba.',
    description: 'Qwen3-TTS by Alibaba - high-quality multilingual speech synthesis with voice cloning.',
    repo: 'Qwen/Qwen3-TTS-12Hz-1.7B-Base',
    files: ['model.safetensors', 'config.json', 'generation_config.json', 'tokenizer_config.json', 'vocab.json', 'merges.txt', 'preprocessor_config.json', 'speech_tokenizer/config.json', 'speech_tokenizer/configuration.json', 'speech_tokenizer/model.safetensors', 'speech_tokenizer/preprocessor_config.json'],
    size: 3_400_000_000,
    types: ['cloning'],
    maxReferenceDuration: 30,
    supportsInstruct: true,
  },
  {
    id: 'qwen3-tts-1.7B-custom-voice',
    name: 'Qwen3-TTS 1.7B CustomVoice',
    backend: 'qwen',
    backendDisplayName: 'Qwen',
    backendDescription: 'High-quality multilingual speech synthesis with voice cloning by Alibaba.',
    description: 'Qwen3-TTS by Alibaba - 9 pre-trained voices with style control.',
    repo: 'Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice',
    files: ['model.safetensors', 'config.json', 'generation_config.json', 'tokenizer_config.json', 'vocab.json', 'merges.txt', 'preprocessor_config.json', 'speech_tokenizer/config.json', 'speech_tokenizer/configuration.json', 'speech_tokenizer/model.safetensors', 'speech_tokenizer/preprocessor_config.json'],
    size: 4_500_000_000,
    types: ['preset'],
    supportsInstruct: true,
    presetVoices: [
      { id: 'Vivian', label: 'Vivian' },
      { id: 'Serena', label: 'Serena' },
      { id: 'Uncle_Fu', label: 'Uncle Fu' },
      { id: 'Dylan', label: 'Dylan' },
      { id: 'Eric', label: 'Eric' },
      { id: 'Ryan', label: 'Ryan' },
      { id: 'Aiden', label: 'Aiden' },
      { id: 'Ono_Anna', label: 'Ono Anna' },
      { id: 'Sohee', label: 'Sohee' },
    ],
  },
  {
    id: 'qwen3-tts-1.7B-voice-design',
    name: 'Qwen3-TTS 1.7B VoiceDesign',
    backend: 'qwen',
    backendDisplayName: 'Qwen',
    backendDescription: 'High-quality multilingual speech synthesis with voice cloning by Alibaba.',
    description: 'Qwen3-TTS by Alibaba - create voices from natural language descriptions.',
    repo: 'Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign',
    files: ['model.safetensors', 'config.json', 'generation_config.json', 'tokenizer_config.json', 'vocab.json', 'merges.txt', 'preprocessor_config.json', 'speech_tokenizer/config.json', 'speech_tokenizer/configuration.json', 'speech_tokenizer/model.safetensors', 'speech_tokenizer/preprocessor_config.json'],
    size: 4_520_000_000,
    types: ['design'],
    supportsInstruct: true,
  },
  {
    id: 'qwen3-tts-0.6B',
    name: 'Qwen3-TTS 0.6B Base',
    backend: 'qwen',
    backendDisplayName: 'Qwen',
    backendDescription: 'High-quality multilingual speech synthesis with voice cloning by Alibaba.',
    description: 'Qwen3-TTS by Alibaba - compact 0.6B model for faster inference.',
    repo: 'Qwen/Qwen3-TTS-12Hz-0.6B-Base',
    files: ['model.safetensors', 'config.json', 'generation_config.json', 'tokenizer_config.json', 'vocab.json', 'merges.txt', 'preprocessor_config.json', 'speech_tokenizer/config.json', 'speech_tokenizer/configuration.json', 'speech_tokenizer/model.safetensors', 'speech_tokenizer/preprocessor_config.json'],
    size: 1_200_000_000,
    types: ['cloning'],
    maxReferenceDuration: 30,
    supportsInstruct: true,
  },
  {
    id: 'qwen3-tts-0.6B-custom-voice',
    name: 'Qwen3-TTS 0.6B CustomVoice',
    backend: 'qwen',
    backendDisplayName: 'Qwen',
    backendDescription: 'High-quality multilingual speech synthesis with voice cloning by Alibaba.',
    description: 'Qwen3-TTS by Alibaba - compact model with 9 pre-trained voices.',
    repo: 'Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice',
    files: ['model.safetensors', 'config.json', 'generation_config.json', 'tokenizer_config.json', 'vocab.json', 'merges.txt', 'preprocessor_config.json', 'speech_tokenizer/config.json', 'speech_tokenizer/configuration.json', 'speech_tokenizer/model.safetensors', 'speech_tokenizer/preprocessor_config.json'],
    size: 2_500_000_000,
    types: ['preset'],
    supportsInstruct: true,
    presetVoices: [
      { id: 'Vivian', label: 'Vivian' },
      { id: 'Serena', label: 'Serena' },
      { id: 'Uncle_Fu', label: 'Uncle Fu' },
      { id: 'Dylan', label: 'Dylan' },
      { id: 'Eric', label: 'Eric' },
      { id: 'Ryan', label: 'Ryan' },
      { id: 'Aiden', label: 'Aiden' },
      { id: 'Ono_Anna', label: 'Ono Anna' },
      { id: 'Sohee', label: 'Sohee' },
    ],
  },
  {
    id: 'f5-tts-default',
    name: 'F5-TTS',
    backend: 'f5tts',
    backendDisplayName: 'F5',
    backendDescription: 'Zero-shot voice cloning with high fidelity from reference audio.',
    description: 'F5-TTS - zero-shot voice cloning with high fidelity from reference audio.',
    repo: 'SWivid/F5-TTS',
    files: ['F5TTS_v1_Base/model_1250000.safetensors', 'F5TTS_v1_Base/vocab.txt'],
    size: 1_200_000_000,
    types: ['cloning'],
    maxReferenceDuration: 25,
  },

  {
    id: 'cosyvoice3-0.5B',
    name: 'CosyVoice3 0.5B',
    backend: 'cosyvoice',
    backendDisplayName: 'CosyVoice',
    backendDescription: 'Fast multilingual voice cloning with streaming by Alibaba (~150ms latency).',
    description: 'CosyVoice3 by Alibaba - superior voice cloning fidelity, 9 languages, streaming with ~150ms latency.',
    repo: 'FunAudioLLM/Fun-CosyVoice3-0.5B-2512',
    files: [
      'config.json',
      'configuration.json',
      'cosyvoice3.yaml',
      'campplus.onnx',
      'flow.pt',
      'flow.decoder.estimator.fp32.onnx',
      'hift.pt',
      'llm.pt',
      'speech_tokenizer_v3.onnx',
      'speech_tokenizer_v3.batch.onnx',
      'CosyVoice-BlankEN/config.json',
      'CosyVoice-BlankEN/generation_config.json',
      'CosyVoice-BlankEN/merges.txt',
      'CosyVoice-BlankEN/model.safetensors',
      'CosyVoice-BlankEN/tokenizer_config.json',
      'CosyVoice-BlankEN/vocab.json',
    ],
    size: 6_400_000_000,
    types: ['cloning', 'design'],
    maxReferenceDuration: 20,
    supportsInstruct: true,
  },
  {
    id: 'cosyvoice2-0.5B',
    name: 'CosyVoice2 0.5B',
    backend: 'cosyvoice',
    backendDisplayName: 'CosyVoice',
    backendDescription: 'Fast multilingual voice cloning with streaming by Alibaba (~150ms latency).',
    description: 'CosyVoice2 by Alibaba - fast multilingual voice cloning with streaming (~150ms latency).',
    repo: 'FunAudioLLM/CosyVoice2-0.5B',
    files: [
      'config.json',
      'configuration.json',
      'cosyvoice2.yaml',
      'campplus.onnx',
      'flow.pt',
      'flow.decoder.estimator.fp32.onnx',
      'hift.pt',
      'llm.pt',
      'speech_tokenizer_v2.onnx',
      'speech_tokenizer_v2.batch.onnx',
      'CosyVoice-BlankEN/config.json',
      'CosyVoice-BlankEN/generation_config.json',
      'CosyVoice-BlankEN/merges.txt',
      'CosyVoice-BlankEN/model.safetensors',
      'CosyVoice-BlankEN/tokenizer_config.json',
      'CosyVoice-BlankEN/vocab.json',
    ],
    size: 4_850_000_000,
    types: ['cloning', 'design'],
    maxReferenceDuration: 20,
    supportsInstruct: true,
  },

  {
    id: 'openaudio-s1-mini',
    name: 'OpenAudio S1 Mini',
    backend: 'openaudio',
    backendDisplayName: 'OpenAudio',
    backendDescription: 'High-quality multilingual voice cloning with emotional expression by Fish Audio.',
    description: 'OpenAudio S1-mini by Fish Audio - high-quality multilingual voice cloning with emotional expression.',
    repo: 'fishaudio/openaudio-s1-mini',
    files: ['config.json', 'model.pth', 'codec.pth', 'special_tokens.json', 'tokenizer.tiktoken'],
    size: 3_610_000_000,
    types: ['cloning'],
    maxReferenceDuration: 25,
    gated: true,
    supportsEffects: true,
  },

  {
    id: 'chatterbox-en',
    name: 'Chatterbox English',
    backend: 'chatterbox',
    backendDisplayName: 'Chatterbox',
    backendDescription: 'Zero-shot voice cloning with emotion control by Resemble AI (0.5B Llama).',
    description: 'Chatterbox by Resemble AI - high-quality English zero-shot voice cloning with emotion control (0.5B Llama).',
    repo: 'ResembleAI/chatterbox',
    files: ['t3_cfg.safetensors', 's3gen.safetensors', 've.safetensors', 'tokenizer.json', 'conds.pt'],
    size: 3_250_000_000,
    types: ['cloning'],
    maxReferenceDuration: 25,
  },
  {
    id: 'chatterbox-multilingual',
    name: 'Chatterbox Multilingual',
    backend: 'chatterbox',
    backendDisplayName: 'Chatterbox',
    backendDescription: 'Zero-shot voice cloning with emotion control by Resemble AI (0.5B Llama).',
    description: 'Chatterbox by Resemble AI - zero-shot voice cloning in 23 languages with emotion control (0.5B Llama).',
    repo: 'ResembleAI/chatterbox',
    files: ['t3_mtl23ls_v2.safetensors', 's3gen.pt', 've.pt', 'grapheme_mtl_merged_expanded_v1.json', 'Cangjie5_TC.json', 'conds.pt'],
    size: 3_400_000_000,
    types: ['cloning'],
    maxReferenceDuration: 25,
  },

  {
    id: 'piper-ar_JO-kareem-medium',
    name: 'Piper AR Kareem',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Arabic voice (ar_JO, kareem, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['ar/ar_JO/kareem/medium/ar_JO-kareem-medium.onnx', 'ar/ar_JO/kareem/medium/ar_JO-kareem-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Kareem' }],
  },
  {
    id: 'piper-bg_BG-dimitar-medium',
    name: 'Piper BG Dimitar',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Bulgarian voice (bg_BG, dimitar, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['bg/bg_BG/dimitar/medium/bg_BG-dimitar-medium.onnx', 'bg/bg_BG/dimitar/medium/bg_BG-dimitar-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Dimitar' }],
  },
  {
    id: 'piper-ca_ES-upc_ona-medium',
    name: 'Piper CA Ona',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Catalan voice (ca_ES, upc_ona, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['ca/ca_ES/upc_ona/medium/ca_ES-upc_ona-medium.onnx', 'ca/ca_ES/upc_ona/medium/ca_ES-upc_ona-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Ona' }],
  },
  {
    id: 'piper-cs_CZ-jirka-medium',
    name: 'Piper CS Jirka',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Czech voice (cs_CZ, jirka, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['cs/cs_CZ/jirka/medium/cs_CZ-jirka-medium.onnx', 'cs/cs_CZ/jirka/medium/cs_CZ-jirka-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Jirka' }],
  },
  {
    id: 'piper-da_DK-talesyntese-medium',
    name: 'Piper DA Talesyntese',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Danish voice (da_DK, talesyntese, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['da/da_DK/talesyntese/medium/da_DK-talesyntese-medium.onnx', 'da/da_DK/talesyntese/medium/da_DK-talesyntese-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Talesyntese' }],
  },
  {
    id: 'piper-de_DE-thorsten-medium',
    name: 'Piper DE Thorsten',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - German voice (de_DE, thorsten, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx', 'de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Thorsten' }],
  },
  {
    id: 'piper-el_GR-rapunzelina-medium',
    name: 'Piper EL Rapunzelina',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Greek voice (el_GR, rapunzelina, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['el/el_GR/rapunzelina/medium/el_GR-rapunzelina-medium.onnx', 'el/el_GR/rapunzelina/medium/el_GR-rapunzelina-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Rapunzelina' }],
  },
  {
    id: 'piper-en_GB-alba-medium',
    name: 'Piper EN-GB Alba',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - British English voice (en_GB, alba, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['en/en_GB/alba/medium/en_GB-alba-medium.onnx', 'en/en_GB/alba/medium/en_GB-alba-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Alba' }],
  },
  {
    id: 'piper-en_US-amy-medium',
    name: 'Piper EN-US Amy',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - American English voice (en_US, amy, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['en/en_US/amy/medium/en_US-amy-medium.onnx', 'en/en_US/amy/medium/en_US-amy-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Amy' }],
  },
  {
    id: 'piper-en_US-lessac-medium',
    name: 'Piper EN-US Lessac',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - American English voice (en_US, lessac, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['en/en_US/lessac/medium/en_US-lessac-medium.onnx', 'en/en_US/lessac/medium/en_US-lessac-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Lessac' }],
  },
  {
    id: 'piper-es_ES-carrie-medium',
    name: 'Piper ES Carrie',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Spanish voice (es_ES, carrie, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['es/es_ES/carrie/medium/es_ES-carrie-medium.onnx', 'es/es_ES/carrie/medium/es_ES-carrie-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Carrie' }],
  },
  {
    id: 'piper-fi_FI-harri-medium',
    name: 'Piper FI Harri',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Finnish voice (fi_FI, harri, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['fi/fi_FI/harri/medium/fi_FI-harri-medium.onnx', 'fi/fi_FI/harri/medium/fi_FI-harri-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Harri' }],
  },
  {
    id: 'piper-fr_FR-siwis-medium',
    name: 'Piper FR Siwis',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - French voice (fr_FR, siwis, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx', 'fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Siwis' }],
  },
  {
    id: 'piper-hu_HU-anna-medium',
    name: 'Piper HU Anna',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Hungarian voice (hu_HU, anna, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['hu/hu_HU/anna/medium/hu_HU-anna-medium.onnx', 'hu/hu_HU/anna/medium/hu_HU-anna-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Anna' }],
  },
  {
    id: 'piper-is_IS-bui-medium',
    name: 'Piper IS Bui',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Icelandic voice (is_IS, bui, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['is/is_IS/bui/medium/is_IS-bui-medium.onnx', 'is/is_IS/bui/medium/is_IS-bui-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Bui' }],
  },
  {
    id: 'piper-it_IT-riccardo_fasol-medium',
    name: 'Piper IT Riccardo',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Italian voice (it_IT, riccardo_fasol, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['it/it_IT/riccardo_fasol/medium/it_IT-riccardo_fasol-medium.onnx', 'it/it_IT/riccardo_fasol/medium/it_IT-riccardo_fasol-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Riccardo' }],
  },
  {
    id: 'piper-ka_GE-natia-medium',
    name: 'Piper KA Natia',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Georgian voice (ka_GE, natia, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['ka/ka_GE/natia/medium/ka_GE-natia-medium.onnx', 'ka/ka_GE/natia/medium/ka_GE-natia-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Natia' }],
  },
  {
    id: 'piper-nl_NL-flemishguy-medium',
    name: 'Piper NL Flemishguy',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Dutch voice (nl_NL, flemishguy, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['nl/nl_NL/flemishguy/medium/nl_NL-flemishguy-medium.onnx', 'nl/nl_NL/flemishguy/medium/nl_NL-flemishguy-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Flemishguy' }],
  },
  {
    id: 'piper-no_NO-talesyntese-medium',
    name: 'Piper NO Talesyntese',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Norwegian voice (no_NO, talesyntese, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['no/no_NO/talesyntese/medium/no_NO-talesyntese-medium.onnx', 'no/no_NO/talesyntese/medium/no_NO-talesyntese-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Talesyntese' }],
  },
  {
    id: 'piper-pt_BR-faber-medium',
    name: 'Piper PT-BR Faber',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Brazilian Portuguese voice (pt_BR, faber, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['pt/pt_BR/faber/medium/pt_BR-faber-medium.onnx', 'pt/pt_BR/faber/medium/pt_BR-faber-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Faber' }],
  },
  {
    id: 'piper-ro_RO-mihai-medium',
    name: 'Piper RO Mihai',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Romanian voice (ro_RO, mihai, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['ro/ro_RO/mihai/medium/ro_RO-mihai-medium.onnx', 'ro/ro_RO/mihai/medium/ro_RO-mihai-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Mihai' }],
  },
  {
    id: 'piper-ru_RU-irinia-medium',
    name: 'Piper RU Irinia',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Russian voice (ru_RU, irinia, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['ru/ru_RU/irinia/medium/ru_RU-irinia-medium.onnx', 'ru/ru_RU/irinia/medium/ru_RU-irinia-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Irinia' }],
  },
  {
    id: 'piper-sk_SK-lili-medium',
    name: 'Piper SK Lili',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Slovak voice (sk_SK, lili, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['sk/sk_SK/lili/medium/sk_SK-lili-medium.onnx', 'sk/sk_SK/lili/medium/sk_SK-lili-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Lili' }],
  },
  {
    id: 'piper-sv_SE-nst_talesyntese-medium',
    name: 'Piper SV Talesyntese',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Swedish voice (sv_SE, nst_talesyntese, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['sv/sv_SE/nst_talesyntese/medium/sv_SE-nst_talesyntese-medium.onnx', 'sv/sv_SE/nst_talesyntese/medium/sv_SE-nst_talesyntese-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Talesyntese' }],
  },
  {
    id: 'piper-tr_TR-dfki_AI-medium',
    name: 'Piper TR DFKI',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Turkish voice (tr_TR, dfki_AI, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['tr/tr_TR/dfki_AI/medium/tr_TR-dfki_AI-medium.onnx', 'tr/tr_TR/dfki_AI/medium/tr_TR-dfki_AI-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'DFKI' }],
  },
  {
    id: 'piper-uk_UA-ukrainian_tts-medium',
    name: 'Piper UK Ukrainian TTS',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Ukrainian voice (uk_UA, ukrainian_tts, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['uk/uk_UA/ukrainian_tts/medium/uk_UA-ukrainian_tts-medium.onnx', 'uk/uk_UA/ukrainian_tts/medium/uk_UA-ukrainian_tts-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Ukrainian TTS' }],
  },
  {
    id: 'piper-vi_VN-tcort-medium',
    name: 'Piper VI Tcort',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Vietnamese voice (vi_VN, tcort, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['vi/vi_VN/tcort/medium/vi_VN-tcort-medium.onnx', 'vi/vi_VN/tcort/medium/vi_VN-tcort-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Tcort' }],
  },
  {
    id: 'piper-zh_CN-huayan-medium',
    name: 'Piper ZH Huayan',
    backend: 'piper',
    backendDisplayName: 'Piper',
    backendDescription: 'Fast and lightweight offline TTS with a wide range of languages.',
    description: 'Piper - Chinese voice (zh_CN, huayan, medium quality).',
    repo: 'rhasspy/piper-voices',
    files: ['zh/zh_CN/huayan/medium/zh_CN-huayan-medium.onnx', 'zh/zh_CN/huayan/medium/zh_CN-huayan-medium.onnx.json'],
    size: 60_000_000,
    types: ['preset'],
    presetVoices: [{ id: 'default', label: 'Huayan' }],
  },

  {
    id: 'voxtral-4b-tts-2603',
    name: 'Voxtral 4B TTS',
    backend: 'voxtral',
    backendDisplayName: 'Voxtral',
    backendDescription: 'High-quality multilingual TTS by Mistral AI with voice cloning. Requires ≥16 GB VRAM and vLLM.',
    description: 'Voxtral 4B TTS - 20 preset voices, 9 languages, voice cloning, ~70ms latency. CC BY-NC 4.0.',
    repo: 'mistralai/Voxtral-4B-TTS-2603',
    files: [
      'consolidated.safetensors',
      'params.json',
      'tekken.json',
      'voice_embedding/ar_male.pt',
      'voice_embedding/de_female.pt',
      'voice_embedding/de_male.pt',
      'voice_embedding/es_female.pt',
      'voice_embedding/es_male.pt',
      'voice_embedding/fr_female.pt',
      'voice_embedding/fr_male.pt',
      'voice_embedding/hi_female.pt',
      'voice_embedding/hi_male.pt',
      'voice_embedding/it_female.pt',
      'voice_embedding/it_male.pt',
      'voice_embedding/nl_female.pt',
      'voice_embedding/nl_male.pt',
      'voice_embedding/pt_female.pt',
      'voice_embedding/pt_male.pt',
      'voice_embedding/casual_female.pt',
      'voice_embedding/casual_male.pt',
      'voice_embedding/cheerful_female.pt',
      'voice_embedding/neutral_female.pt',
      'voice_embedding/neutral_male.pt',
    ],
    size: 8_060_000_000,
    types: ['preset', 'cloning'],
    presetVoices: [
      { id: 'casual_female', label: 'Casual (F)' },
      { id: 'casual_male', label: 'Casual (M)' },
      { id: 'neutral_female', label: 'Neutral (F)' },
      { id: 'neutral_male', label: 'Neutral (M)' },
      { id: 'cheerful_female', label: 'Cheerful (F)' },
      { id: 'fr_female', label: 'French (F)' },
      { id: 'fr_male', label: 'French (M)' },
      { id: 'de_female', label: 'German (F)' },
      { id: 'de_male', label: 'German (M)' },
      { id: 'es_female', label: 'Spanish (F)' },
      { id: 'es_male', label: 'Spanish (M)' },
      { id: 'it_female', label: 'Italian (F)' },
      { id: 'it_male', label: 'Italian (M)' },
      { id: 'pt_female', label: 'Portuguese (F)' },
      { id: 'pt_male', label: 'Portuguese (M)' },
      { id: 'nl_female', label: 'Dutch (F)' },
      { id: 'nl_male', label: 'Dutch (M)' },
      { id: 'hi_female', label: 'Hindi (F)' },
      { id: 'hi_male', label: 'Hindi (M)' },
      { id: 'ar_male', label: 'Arabic (M)' },
    ],
  },

  {
    id: 'higgs-audio-v2-3B',
    name: 'Higgs Audio V2 3B',
    backend: 'higgs_audio',
    backendDisplayName: 'Higgs Audio',
    backendDescription: 'High-quality multilingual TTS by Boson AI with voice cloning.',
    description: 'Higgs Audio V2 - 3B parameter model with zero-shot voice cloning and 50+ languages.',
    repo: 'bosonai/higgs-audio-v2-generation-3B-base',
    files: [
      'config.json',
      'generation_config.json',
      'model.safetensors.index.json',
      'model-00001-of-00003.safetensors',
      'model-00002-of-00003.safetensors',
      'model-00003-of-00003.safetensors',
      'special_tokens_map.json',
      'tokenizer.json',
      'tokenizer_config.json',
      { path: 'tokenizer/config.json', repo: 'bosonai/higgs-audio-v2-tokenizer', remotePath: 'config.json' },
      { path: 'tokenizer/model.pth', repo: 'bosonai/higgs-audio-v2-tokenizer', remotePath: 'model.pth' },
    ],
    size: 12_500_000_000,
    types: ['cloning'],
    maxReferenceDuration: 25,
    supportsInstruct: true,
  },

  {
    id: 'openai-tts-v1',
    name: 'OpenAI TTS',
    backend: 'openai',
    backendDisplayName: 'OpenAI',
    backendDescription: 'High-quality cloud-based TTS by OpenAI. Requires an API key.',
    description: 'OpenAI TTS - natural-sounding voices with tts-1 and tts-1-hd models.',
    repo: '',
    files: [],
    size: 0,
    types: ['api'],
    presetVoices: OPENAI_VOICES,
  },

  {
    id: 'elevenlabs-v1',
    name: 'ElevenLabs',
    backend: 'elevenlabs',
    backendDisplayName: 'ElevenLabs',
    backendDescription: 'High-quality cloud-based TTS by ElevenLabs. Requires an API key.',
    description: 'ElevenLabs - high-quality cloud-based text-to-speech with natural-sounding voices.',
    repo: '',
    files: [],
    size: 0,
    types: ['api'],
  },

  {
    id: 'whisper-tiny',
    name: 'Whisper Tiny',
    backend: 'whisper',
    backendDisplayName: 'Whisper',
    backendDescription: 'Speech-to-text transcription, from fast/lightweight to high accuracy.',
    description: 'Whisper Tiny - fastest transcription model, lower accuracy. Good for quick drafts.',
    repo: 'Systran/faster-whisper-tiny',
    files: ['config.json', 'model.bin', 'tokenizer.json', 'vocabulary.txt'],
    size: 75_000_000,
    types: ['transcription'],
  },
  {
    id: 'whisper-base',
    name: 'Whisper Base',
    backend: 'whisper',
    backendDisplayName: 'Whisper',
    backendDescription: 'Speech-to-text transcription, from fast/lightweight to high accuracy.',
    description: 'Whisper Base - good balance of speed and accuracy for general transcription.',
    repo: 'Systran/faster-whisper-base',
    files: ['config.json', 'model.bin', 'tokenizer.json', 'vocabulary.txt'],
    size: 145_000_000,
    types: ['transcription'],
  },
  {
    id: 'whisper-small',
    name: 'Whisper Small',
    backend: 'whisper',
    backendDisplayName: 'Whisper',
    backendDescription: 'Speech-to-text transcription, from fast/lightweight to high accuracy.',
    description: 'Whisper Small - improved accuracy for multilingual transcription.',
    repo: 'Systran/faster-whisper-small',
    files: ['config.json', 'model.bin', 'tokenizer.json', 'vocabulary.txt'],
    size: 465_000_000,
    types: ['transcription'],
  },
  {
    id: 'whisper-medium',
    name: 'Whisper Medium',
    backend: 'whisper',
    backendDisplayName: 'Whisper',
    backendDescription: 'Speech-to-text transcription, from fast/lightweight to high accuracy.',
    description: 'Whisper Medium - high accuracy transcription, requires more resources.',
    repo: 'Systran/faster-whisper-medium',
    files: ['config.json', 'model.bin', 'tokenizer.json', 'vocabulary.txt'],
    size: 1_500_000_000,
    types: ['transcription'],
  },
  {
    id: 'whisper-large-v3',
    name: 'Whisper Large v3',
    backend: 'whisper',
    backendDisplayName: 'Whisper',
    backendDescription: 'Speech-to-text transcription, from fast/lightweight to high accuracy.',
    description: 'Whisper Large v3 - best accuracy, multilingual. Requires significant GPU memory.',
    repo: 'Systran/faster-whisper-large-v3',
    files: ['config.json', 'model.bin', 'tokenizer.json', 'vocabulary.txt'],
    size: 3_000_000_000,
    types: ['transcription'],
  },
];
