fmt
This commit is contained in:
1 file changed
+28
-11
+28
-11
@@ -24,8 +24,14 @@ usage() {
|
|||||||
}
|
}
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case $1 in
|
case $1 in
|
||||||
--srt) srt=true; shift ;;
|
--srt)
|
||||||
--no-diarization) diarization=false; shift ;;
|
srt=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--no-diarization)
|
||||||
|
diarization=false
|
||||||
|
shift
|
||||||
|
;;
|
||||||
--speakers)
|
--speakers)
|
||||||
if [[ ! ${2:-} =~ ^([1-9]|[1-5][0-9]|6[0-4])$ ]]; then
|
if [[ ! ${2:-} =~ ^([1-9]|[1-5][0-9]|6[0-4])$ ]]; then
|
||||||
echo '--speakers must be an integer between 1 and 64' >&2
|
echo '--speakers must be an integer between 1 and 64' >&2
|
||||||
@@ -66,9 +72,18 @@ while [[ $# -gt 0 ]]; do
|
|||||||
chunk_minutes=$2
|
chunk_minutes=$2
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
-h|--help) usage; exit 0 ;;
|
-h | --help)
|
||||||
--) shift; break ;;
|
usage
|
||||||
-*) usage >&2; exit 1 ;;
|
exit 0
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
usage >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
*) break ;;
|
*) break ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -91,7 +106,7 @@ if [[ ! -f $1 || ! -r $1 ]]; then
|
|||||||
echo "Cannot read audio file: $1" >&2
|
echo "Cannot read audio file: $1" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if (( BASH_VERSINFO[0] < 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] < 1) )); then
|
if ((BASH_VERSINFO[0] < 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] < 1))); then
|
||||||
echo 'Bash 5.1 or newer is required for parallel chunk processing.' >&2
|
echo 'Bash 5.1 or newer is required for parallel chunk processing.' >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -103,6 +118,8 @@ for tool in "${dependencies[@]}"; do
|
|||||||
}
|
}
|
||||||
done
|
done
|
||||||
|
|
||||||
|
PYANNOTE_API_KEY_REF="op://API Keys/pyannote-api/credential"
|
||||||
|
|
||||||
# Explicit environment keys also work in headless sessions without 1Password.
|
# Explicit environment keys also work in headless sessions without 1Password.
|
||||||
# Resolve both credentials before starting any paid requests.
|
# Resolve both credentials before starting any paid requests.
|
||||||
if "$diarization" && [[ -z ${PYANNOTE_API_KEY:-} ]]; then
|
if "$diarization" && [[ -z ${PYANNOTE_API_KEY:-} ]]; then
|
||||||
@@ -177,7 +194,7 @@ save_diagnostic "$tmp/chunks.json" chunks.json
|
|||||||
count=$(jq 'length' "$tmp/chunks.json")
|
count=$(jq 'length' "$tmp/chunks.json")
|
||||||
timestamps=$srt
|
timestamps=$srt
|
||||||
if "$diarization"; then timestamps=true; fi
|
if "$diarization"; then timestamps=true; fi
|
||||||
if (( count > 1 )); then
|
if ((count > 1)); then
|
||||||
timestamps=true
|
timestamps=true
|
||||||
echo "Splitting audio into $count overlapping chunks (maximum $chunk_minutes minutes each)." >&2
|
echo "Splitting audio into $count overlapping chunks (maximum $chunk_minutes minutes each)." >&2
|
||||||
echo "Processing up to $jobs chunks in parallel." >&2
|
echo "Processing up to $jobs chunks in parallel." >&2
|
||||||
@@ -190,7 +207,7 @@ transcribe_chunk() {
|
|||||||
mkdir -- "$work"
|
mkdir -- "$work"
|
||||||
read -r start duration < <(jq -r --argjson i "$i" \
|
read -r start duration < <(jq -r --argjson i "$i" \
|
||||||
'.[$i] | "\(.start) \(.end - .start)"' "$tmp/chunks.json")
|
'.[$i] | "\(.start) \(.end - .start)"' "$tmp/chunks.json")
|
||||||
if (( count > 1 )); then
|
if ((count > 1)); then
|
||||||
echo "Transcribing chunk $((i + 1))/$count (start ${start}s, duration ${duration}s)..." >&2
|
echo "Transcribing chunk $((i + 1))/$count (start ${start}s, duration ${duration}s)..." >&2
|
||||||
fi
|
fi
|
||||||
ffmpeg -nostdin -hide_banner -loglevel error -y -ss "$start" -i "$tmp/audio.wav" \
|
ffmpeg -nostdin -hide_banner -loglevel error -y -ss "$start" -i "$tmp/audio.wav" \
|
||||||
@@ -255,8 +272,8 @@ wait_for_worker() {
|
|||||||
# response filenames retain recording order regardless of completion order.
|
# response filenames retain recording order regardless of completion order.
|
||||||
set -m
|
set -m
|
||||||
next=0
|
next=0
|
||||||
while (( next < count || ${#workers[@]} > 0 )); do
|
while ((next < count || ${#workers[@]} > 0)); do
|
||||||
while (( next < count && ${#workers[@]} < jobs )); do
|
while ((next < count && ${#workers[@]} < jobs)); do
|
||||||
transcribe_chunk "$next" &
|
transcribe_chunk "$next" &
|
||||||
workers[$!]=$next
|
workers[$!]=$next
|
||||||
next=$((next + 1))
|
next=$((next + 1))
|
||||||
@@ -270,7 +287,7 @@ while (( next < count || ${#workers[@]} > 0 )); do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
# Only emit a transcript after every chunk succeeds, including SRT conversion.
|
# Only emit a transcript after every chunk succeeds, including SRT conversion.
|
||||||
if "$diarization" || "$srt" || (( count > 1 )); then
|
if "$diarization" || "$srt" || ((count > 1)); then
|
||||||
python3 -B "$script_dir/chunks.py" merge "$tmp/chunks.json" --json >"$tmp/transcript.json"
|
python3 -B "$script_dir/chunks.py" merge "$tmp/chunks.json" --json >"$tmp/transcript.json"
|
||||||
else
|
else
|
||||||
cp -- "$tmp/response-0.json" "$tmp/transcript.json"
|
cp -- "$tmp/response-0.json" "$tmp/transcript.json"
|
||||||
|
|||||||
Reference in new issue
Block a user