cosyvoice-test.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/bin/bash
  2. # CosyVoice 非实时语音合成测试
  3. # 使用阿里云百炼 API,测试长文本合成
  4. API_KEY="sk-c25679401ba24c749f53be86b0c9a7a6"
  5. API_URL="https://dashscope.aliyuncs.com/api/v1/services/audio/tts/SpeechSynthesizer"
  6. OUTPUT_DIR="./test-results"
  7. mkdir -p "$OUTPUT_DIR"
  8. # 测试文本 - 《匆匆》朱自清,约 1300 字
  9. TEXT='燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:现在又到了哪里呢?
  10. 我不知道他们给了我多少日子;但我的手确乎是渐渐空虚了。在默默里算着,八千多日子已经从我手中溜去;像针尖上一滴水滴在大海里,我的日子滴在时间的流里,没有声音,也没有影子。我不禁头涔涔而泪潸潸了。
  11. 去的尽管去了,来的尽管来着;去来的中间,又怎样地匆匆呢?早上我起来的时候,小屋里射进两三方斜斜的太阳。太阳他有脚啊,轻轻悄悄地挪移了;我也茫茫然跟着旋转。于是——洗手的时候,日子从水盆里过去;吃饭的时候,日子从饭碗里过去;默默时,便从凝然的双眼前过去。我觉察他去的匆匆了,伸出手遮挽时,他又从遮挽着的手边过去,天黑时,我躺在床上,他便伶伶俐俐地从我身上跨过,从我脚边飞去了。等我睁开眼和太阳再见,这算又溜走了一日。我掩着面叹息。但是新来的日子的影儿又开始在叹息里闪过了。
  12. 在逃去如飞的日子里,在千门万户的世界里的我能做些什么呢?只有徘徊罢了,只有匆匆罢了;在八千多日的匆匆里,除徘徊外,又剩些什么呢?过去的日子如轻烟,被微风吹散了,如薄雾,被初阳蒸融了;我留着些什么痕迹呢?我何曾留着像游丝样的痕迹呢?我赤裸裸来到这世界,转眼间也将赤裸裸的回去罢?但不能平的,为什么偏要白白走这一遭啊?
  13. 你聪明的,告诉我,我们的日子为什么一去不复返呢?'
  14. echo "========================================="
  15. echo " CosyVoice 非实时语音合成测试"
  16. echo "========================================="
  17. echo ""
  18. echo "模型: cosyvoice-v3.5-flash"
  19. echo "音色: longanyang"
  20. echo "格式: mp3 / 采样率: 24000"
  21. echo "文本长度: $(echo -n "$TEXT" | wc -m) 字符"
  22. echo ""
  23. echo "正在调用 API ..."
  24. START_TIME=$(date +%s)
  25. RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$API_URL" \
  26. -H "Authorization: Bearer $API_KEY" \
  27. -H "Content-Type: application/json" \
  28. -d "$(jq -n \
  29. --arg model "cosyvoice-v3.5-flash" \
  30. --arg text "$TEXT" \
  31. --arg voice "longanyang" \
  32. '{
  33. model: $model,
  34. input: {
  35. text: $text,
  36. voice: $voice,
  37. format: "mp3",
  38. sample_rate: 24000
  39. }
  40. }')")
  41. HTTP_CODE=$(echo "$RESPONSE" | tail -1)
  42. BODY=$(echo "$RESPONSE" | sed '$d')
  43. END_TIME=$(date +%s)
  44. ELAPSED=$((END_TIME - START_TIME))
  45. echo "HTTP状态码: $HTTP_CODE"
  46. echo "耗时: ${ELAPSED}秒"
  47. echo ""
  48. if [ "$HTTP_CODE" != "200" ]; then
  49. echo "❌ 请求失败!响应内容:"
  50. echo "$BODY" | jq .
  51. exit 1
  52. fi
  53. # 解析响应
  54. REQUEST_ID=$(echo "$BODY" | jq -r '.request_id')
  55. AUDIO_URL=$(echo "$BODY" | jq -r '.output.audio.url')
  56. AUDIO_ID=$(echo "$BODY" | jq -r '.output.audio.id')
  57. EXPIRE_AT=$(echo "$BODY" | jq -r '.output.audio.expires_at')
  58. CHAR_COUNT=$(echo "$BODY" | jq -r '.usage.characters')
  59. FINISH_REASON=$(echo "$BODY" | jq -r '.output.finish_reason')
  60. echo "✅ 请求成功!"
  61. echo ""
  62. echo "--- 响应摘要 ---"
  63. echo "Request ID: $REQUEST_ID"
  64. echo "音频 ID: $AUDIO_ID"
  65. echo "完成原因: $FINISH_REASON"
  66. echo "计费字符数: $CHAR_COUNT"
  67. echo "链接过期: $(date -d @"$EXPIRE_AT" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo "时间戳: $EXPIRE_AT")"
  68. echo "音频 URL: $AUDIO_URL"
  69. echo ""
  70. # 下载音频
  71. AUDIO_FILE="$OUTPUT_DIR/cosyvoice-test-$(date +%Y%m%d_%H%M%S).mp3"
  72. echo "正在下载音频到: $AUDIO_FILE"
  73. curl -s -o "$AUDIO_FILE" "$AUDIO_URL"
  74. FILE_SIZE=$(stat -c%s "$AUDIO_FILE" 2>/dev/null || stat -f%z "$AUDIO_FILE" 2>/dev/null)
  75. if [ -f "$AUDIO_FILE" ] && [ "$FILE_SIZE" -gt 0 ]; then
  76. echo "✅ 音频下载成功!"
  77. echo " 文件: $AUDIO_FILE"
  78. echo " 大小: $FILE_SIZE 字节 ($(( FILE_SIZE / 1024 )) KB)"
  79. echo ""
  80. echo "完整响应:"
  81. echo "$BODY" | jq .
  82. else
  83. echo "❌ 音频下载失败或文件为空"
  84. exit 1
  85. fi