File size: 1,600 Bytes
20459fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# render-batch.sh DIR: render every song in DIR/manifest.json ([{slug, title, style, seed}], lyrics in DIR/<slug>.txt),
# then trim dead tails and encode MP3. Skips songs that already have an MP3. Saves the semantic tokens of every take
# (DIR/<slug>-s<seed>/semantic.json) so a take can be extended later with semantic_prefix_file.
# Env: AUDIOCPP_CLI, YUE2_MODEL, PYTHON (needs numpy + PyAV for finish_track.py; default python3).
set -u
: "${AUDIOCPP_CLI:?set AUDIOCPP_CLI to your audiocpp_cli}"
: "${YUE2_MODEL:?set YUE2_MODEL to the Yue2-3B-GGUF directory}"
PYTHON=${PYTHON:-python3}; HERE=$(cd "$(dirname "$0")" && pwd)
export ONEAPI_DEVICE_SELECTOR=${ONEAPI_DEVICE_SELECTOR:-level_zero:gpu}
cd "$1"
python3 -c "import json; [print(m['slug'], m['seed'], m['style'], sep='\t') for m in json.load(open('manifest.json'))]" |
while IFS=$'\t' read -r slug seed style; do
  [ -f "$slug-s$seed.mp3" ] && { echo "skip $slug (done)"; continue; }
  start=$(date +%s)
  "$AUDIOCPP_CLI" --task gen --family yue2 --model "$YUE2_MODEL" --backend sycl --threads 8 \
    --lyrics "$(cat "$slug.txt")" --request-option style="$style" --request-option cot=off \
    --request-option semantic_max_tokens=6500 --request-option export_semantic=true \
    --seed "$seed" --out-dir "$slug-s$seed" --out "$slug-s$seed.wav" --log > "$slug-s$seed.log" 2>&1 < /dev/null
  rc=$?
  echo "$slug rc=$rc wall=$(( $(date +%s)-start ))s $(grep -a 'yue2.semantic.tokens ' "$slug-s$seed.log" | awk '{print "tokens="$NF}')"
  [ $rc -eq 0 ] && "$PYTHON" "$HERE/finish_track.py" "$slug-s$seed.wav" "$slug-s$seed.mp3"
done