|
1 | 1 | #!/usr/bin/env bash |
2 | | -# Download pre-converted FunASR GGUF models from Hugging Face — one command, no Python ML env. |
3 | | -# ./download-funasr-model.sh sensevoice [outdir] |
4 | | -# ./download-funasr-model.sh paraformer | nano | fsmn-vad |
| 2 | +# Download pre-converted FunASR GGUF models from Hugging Face in one command. |
| 3 | +# ./download-funasr-model.sh sensevoice [outdir] [q8|f16|f32|all] |
| 4 | +# ./download-funasr-model.sh paraformer [outdir] [q8|f16|f32|all] |
| 5 | +# ./download-funasr-model.sh nano [outdir] [q8_0|q4km|q5km|all] |
| 6 | +# ./download-funasr-model.sh fsmn-vad [outdir] |
5 | 7 | # ASR models also pull fsmn-vad.gguf (needed for built-in --vad long-audio segmentation). |
6 | 8 | set -euo pipefail |
7 | | -usage(){ echo "usage: $0 {sensevoice|paraformer|nano|fsmn-vad} [outdir]"; exit 1; } |
8 | | -[ $# -ge 1 ] || usage |
9 | | -MODEL="$1"; OUT="${2:-funasr-gguf}" |
| 9 | +usage(){ |
| 10 | + cat >&2 <<EOF |
| 11 | +usage: $0 {sensevoice|paraformer|nano|fsmn-vad} [outdir] [variant] |
| 12 | + sensevoice/paraformer variants: q8 (default), f16, f32, all |
| 13 | + nano variants: q8_0 (default), q4km, q5km, all |
| 14 | +EOF |
| 15 | + exit 1 |
| 16 | +} |
| 17 | +[ $# -ge 1 ] && [ $# -le 3 ] || usage |
| 18 | +MODEL="$1"; OUT="${2:-funasr-gguf}"; VARIANT="${3:-}" |
10 | 19 | case "$MODEL" in |
11 | | - sensevoice) REPO="FunAudioLLM/SenseVoiceSmall-GGUF" ;; |
12 | | - paraformer) REPO="FunAudioLLM/Paraformer-GGUF" ;; |
13 | | - nano) REPO="FunAudioLLM/Fun-ASR-Nano-GGUF" ;; |
14 | | - fsmn-vad|vad) REPO="FunAudioLLM/fsmn-vad-GGUF" ;; |
| 20 | + sensevoice) |
| 21 | + REPO="FunAudioLLM/SenseVoiceSmall-GGUF" |
| 22 | + case "${VARIANT:-q8}" in |
| 23 | + q8) FILES=(sensevoice-small-q8.gguf) ;; |
| 24 | + f16) FILES=(sensevoice-small-f16.gguf) ;; |
| 25 | + f32) FILES=(sensevoice-small.gguf) ;; |
| 26 | + all) FILES=() ;; |
| 27 | + *) usage ;; |
| 28 | + esac |
| 29 | + ;; |
| 30 | + paraformer) |
| 31 | + REPO="FunAudioLLM/Paraformer-GGUF" |
| 32 | + case "${VARIANT:-q8}" in |
| 33 | + q8) FILES=(paraformer-q8.gguf) ;; |
| 34 | + f16) FILES=(paraformer-f16.gguf) ;; |
| 35 | + f32) FILES=(paraformer.gguf) ;; |
| 36 | + all) FILES=() ;; |
| 37 | + *) usage ;; |
| 38 | + esac |
| 39 | + ;; |
| 40 | + nano) |
| 41 | + REPO="FunAudioLLM/Fun-ASR-Nano-GGUF" |
| 42 | + case "${VARIANT:-q8_0}" in |
| 43 | + q8|q8_0) FILES=(funasr-encoder-f16.gguf qwen3-0.6b-q8_0.gguf) ;; |
| 44 | + q4|q4km) FILES=(funasr-encoder-f16.gguf qwen3-0.6b-q4km.gguf) ;; |
| 45 | + q5|q5km) FILES=(funasr-encoder-f16.gguf qwen3-0.6b-q5km.gguf) ;; |
| 46 | + all) FILES=() ;; |
| 47 | + *) usage ;; |
| 48 | + esac |
| 49 | + ;; |
| 50 | + fsmn-vad|vad) |
| 51 | + [ -z "$VARIANT" ] || usage |
| 52 | + REPO="FunAudioLLM/fsmn-vad-GGUF" |
| 53 | + FILES=(fsmn-vad.gguf) |
| 54 | + ;; |
15 | 55 | *) usage ;; |
16 | 56 | esac |
17 | 57 | # huggingface_hub ships `hf` (new CLI); older versions only have `huggingface-cli` (deprecated). Use whichever exists. |
18 | 58 | if command -v hf >/dev/null 2>&1; then HF=hf |
19 | 59 | elif command -v huggingface-cli >/dev/null 2>&1; then HF=huggingface-cli |
20 | | -else echo "need the Hugging Face CLI: pip install -U huggingface_hub"; exit 1; fi |
| 60 | +else echo "error: need the Hugging Face CLI: pip install -U huggingface_hub" >&2; exit 1; fi |
21 | 61 | mkdir -p "$OUT" |
22 | | -echo "downloading $REPO ..."; "$HF" download "$REPO" --include "*.gguf" --local-dir "$OUT" |
| 62 | +echo "downloading $REPO ..." |
| 63 | +if [ ${#FILES[@]} -eq 0 ]; then |
| 64 | + "$HF" download "$REPO" --include "*.gguf" --local-dir "$OUT" |
| 65 | +else |
| 66 | + "$HF" download "$REPO" "${FILES[@]}" --local-dir "$OUT" |
| 67 | +fi |
23 | 68 | if [ "$MODEL" != "fsmn-vad" ] && [ "$MODEL" != "vad" ]; then |
24 | | - echo "downloading FSMN-VAD (for --vad) ..."; "$HF" download FunAudioLLM/fsmn-vad-GGUF --include "*.gguf" --local-dir "$OUT" |
| 69 | + echo "downloading FSMN-VAD (for --vad) ..." |
| 70 | + "$HF" download FunAudioLLM/fsmn-vad-GGUF fsmn-vad.gguf --local-dir "$OUT" |
| 71 | +fi |
| 72 | +shopt -s nullglob |
| 73 | +GGUF_FILES=("$OUT"/*.gguf) |
| 74 | +shopt -u nullglob |
| 75 | +if [ ${#GGUF_FILES[@]} -eq 0 ]; then |
| 76 | + echo "error: no GGUF files found in $OUT" >&2 |
| 77 | + exit 1 |
25 | 78 | fi |
26 | | -echo "done -> $OUT"; ls -1 "$OUT"/*.gguf |
| 79 | +echo "done -> $OUT" |
| 80 | +printf '%s\n' "${GGUF_FILES[@]}" |
0 commit comments