从github迁移过来

This commit is contained in:
xsl
2026-05-18 18:39:49 +08:00
commit 9c5d9e586c
89 changed files with 9035 additions and 0 deletions
+109
View File
@@ -0,0 +1,109 @@
#!/usr/bin/env bash
set -euo pipefail
# Check reference voice library completeness for batch TTS.
# Usage:
# bash audio/check_voice_library.sh
BASE_DIR="/home/xsl/blind/audio/00_raw/tts/prompt_ref"
MANIFEST="${BASE_DIR}/ref_manifest.txt"
REQUIRED_FILES=(
"mom_ref.wav"
"azhe_ref.wav"
"xiaomei_ref.wav"
"zhounan_ref.wav"
"hr_ref.wav"
"anan_ref.wav"
"dorm_a_ref.wav"
"dorm_b_ref.wav"
"dorm_c_ref.wav"
"delivery_ref.wav"
)
ok() { echo "[OK] $*"; }
warn() { echo "[WARN] $*"; }
err() { echo "[ERROR] $*"; }
missing_count=0
warn_count=0
command -v ffprobe >/dev/null 2>&1 || {
err "缺少 ffprobe(请安装 ffmpeg"
exit 1
}
echo "=== 角色音色库检查 ==="
echo "目录: $BASE_DIR"
echo ""
if [[ ! -f "$MANIFEST" ]]; then
err "缺少清单文件: $MANIFEST"
((missing_count+=1))
fi
for f in "${REQUIRED_FILES[@]}"; do
path="${BASE_DIR}/${f}"
if [[ ! -f "$path" ]]; then
err "缺少参考音频: $f"
((missing_count+=1))
continue
fi
sample_rate="$(ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 "$path" || true)"
channels="$(ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=noprint_wrappers=1:nokey=1 "$path" || true)"
duration="$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$path" || true)"
duration_int="${duration%.*}"
if [[ -z "$sample_rate" || -z "$channels" || -z "$duration" ]]; then
warn "无法读取音频信息: $f"
((warn_count+=1))
continue
fi
if [[ "$sample_rate" -lt 16000 ]]; then
warn "$f 采样率 ${sample_rate}Hz,低于 16kHz"
((warn_count+=1))
fi
if [[ "$channels" -ne 1 ]]; then
warn "$f 声道数 ${channels},建议为单声道"
((warn_count+=1))
fi
if [[ "$duration_int" -lt 5 || "$duration_int" -gt 30 ]]; then
warn "$f 时长 ${duration}s,建议 5-30s"
((warn_count+=1))
fi
ok "$f 通过基础检测 (${sample_rate}Hz/${channels}ch/${duration}s)"
done
echo ""
if [[ -f "$MANIFEST" ]]; then
for f in "${REQUIRED_FILES[@]}"; do
line="$(awk -F'|' -v file="$f" '$1 ~ file {print $0}' "$MANIFEST" | head -n 1)"
if [[ -z "$line" ]]; then
err "清单缺少条目: $f"
((missing_count+=1))
continue
fi
text="$(echo "$line" | awk -F'|' '{sub(/^[ \t]+/, "", $2); sub(/[ \t]+$/, "", $2); print $2}')"
if [[ -z "$text" || "$text" == TODO:* ]]; then
warn "清单文本未完成: $f"
((warn_count+=1))
fi
done
fi
echo ""
echo "=== 结果 ==="
echo "缺失项: $missing_count"
echo "警告项: $warn_count"
if [[ "$missing_count" -gt 0 ]]; then
exit 2
fi
if [[ "$warn_count" -gt 0 ]]; then
exit 1
fi
ok "音色库完整,可进入批量 TTS。"