File size: 2,774 Bytes
71e354e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env bash
set -euo pipefail

ip="${1:-127.0.0.1}"
port="${2:-8080}"
out_dir="${3:-/tmp/tts_smoke}"

mkdir -p "$out_dir"

post_json() {
  local name="$1"
  local json="$2"
  local out="$3"
  local code="000"

  if command -v curl >/dev/null 2>&1; then
    code=$(curl -s -o "$out" -w '%{http_code}' \
      -H 'Content-Type: application/json' \
      -d "$json" \
      "http://${ip}:${port}/v1/audio/speech")
  elif command -v wget >/dev/null 2>&1; then
    wget -q -O "$out" --server-response \
      --header='Content-Type: application/json' \
      --post-data="$json" \
      "http://${ip}:${port}/v1/audio/speech" 2>&1 | awk '/^  HTTP/{code=$2} END{print code}' > /tmp/.tts_http_code
    if [[ -s /tmp/.tts_http_code ]]; then
      code=$(cat /tmp/.tts_http_code)
    fi
  else
    echo "No curl or wget found"
    return 1
  fi

  echo "$name http:$code size:$(stat -c%s "$out" 2>/dev/null || echo 0)"
  if [[ "$code" == "200" ]]; then
    [[ -s "$out" ]] || { echo "$name output empty"; return 1; }
  fi
}

echo "== TTS smoke test =="
echo "target: ${ip}:${port}"
echo "out: ${out_dir}"

# English
post_json "en_ok" \
  '{"model":"kokoro","input":"Hello world","voice":"af_heart","response_format":"wav","speed":1.0,"instructions":"en"}' \
  "${out_dir}/en.wav"

# Chinese (requires server started with --jieba_dict_path)
post_json "zh_ok" \
  '{"model":"kokoro","input":"ๆ—ฉไธŠๅฅฝ๏ผŒไปŠๅคฉๅคฉๆฐ”ไธ้”™ใ€‚","voice":"zf_xiaobei","response_format":"wav","speed":1.0,"instructions":"zh"}' \
  "${out_dir}/zh.wav"

# Japanese kana (hiragana/katakana only)
post_json "ja_kana_ok" \
  '{"model":"kokoro","input":"ใŠใฏใ‚ˆใ†ใ”ใ–ใ„ใพใ™ใ€‚ใใ‚‡ใ†ใฏใ‚ˆใ„ใฆใ‚“ใใงใ™ใญใ€‚","voice":"jf_gongitsune","response_format":"wav","speed":1.0,"instructions":"ja"}' \
  "${out_dir}/ja_kana.wav"

# Japanese kana (katakana)
post_json "ja_katakana_ok" \
  '{"model":"kokoro","input":"ใ‚ณใƒณใƒ‹ใƒใƒใ€‚ใƒจใƒญใ‚ทใ‚ฏใ‚ชใƒใ‚ฌใ‚คใ‚ทใƒžใ‚นใ€‚","voice":"jf_gongitsune","response_format":"wav","speed":1.0,"instructions":"ja"}' \
  "${out_dir}/ja_katakana.wav"

# Long Japanese kana (chunking)
post_json "ja_kana_long_ok" \
  '{"model":"kokoro","input":"ใŠใฏใ‚ˆใ†ใ”ใ–ใ„ใพใ™ใ€‚ใใ‚‡ใ†ใฏใ‚ˆใ„ใฆใ‚“ใใงใ™ใญใ€‚ใ‚ใ—ใŸใฎใ‹ใ„ใŽใฏใ”ใœใ‚“ใ˜ใ‚…ใ†ใ˜ใ‹ใ‚‰ใฏใ˜ใพใ‚Šใพใ™ใ€‚ใŠใ‚“ใ›ใ„ใฎใฒใ‚“ใ—ใคใ‚’ใ‹ใใซใ‚“ใ—ใฆใ„ใพใ™ใ€‚","voice":"jf_gongitsune","response_format":"wav","speed":1.0,"instructions":"ja"}' \
  "${out_dir}/ja_kana_long.wav"

# Japanese with kanji should be rejected (400)
post_json "ja_kanji_reject" \
  '{"model":"kokoro","input":"ใŠใฏใ‚ˆใ†ใ”ใ–ใ„ใพใ™ใ€‚ไปŠๆ—ฅใฏ่‰ฏใ„ๅคฉๆฐ—ใงใ™ใญใ€‚","voice":"jf_gongitsune","response_format":"wav","speed":1.0,"instructions":"ja"}' \
  "${out_dir}/ja_kanji.err"

echo "done"