AudioTranscriptionFFmpegTimestampsNbility

Restoring Global Timestamps After Transcribing Long Audio in Chunks

Record actual chunk boundaries with FFmpeg, map local transcription times back to the original recording, and handle overlap and speaker labels carefully.

Restoring Global Timestamps After Transcribing Long Audio in Chunks

Split a long recording into chunks and each transcription may start again at 00:00. Concatenating those results creates overlapping subtitles. Keep two clocks: the chunk's actual position in the original recording and the local time inside its transcription. Add them, then review the boundaries.

Checked on November 10, 2026, this guide uses FFmpeg documentation and Nbility's audio guide. The segmentation command was executed with synthetic silence on FFmpeg 9.0.2. No real recording was uploaded, no transcription model was called, and speaker recognition was not tested.

Preserve the original and check the model's output contract

Confirm the selected model's file formats, size and duration limits, languages, and output formats. Compatible endpoints do not make every provider's limits identical. If timestamps matter, verify them with a short public sample first. Plain text alone cannot provide reliable audio alignment through a prompt instruction.

Keep an unchanged original and record transcoding or trimming. Mono conversion can affect workflows that rely on separate channels. The 16 kHz mono WAV below is a demonstration choice, not a universal model requirement or an audio-quality recommendation.

Export a manifest while segmenting

Run in a new working directory with a local input copy. Inspect existing output before rerunning:

mkdir -p chunks
ffmpeg -i meeting.wav \
  -map 0:a:0 -vn -ar 16000 -ac 1 -c:a pcm_s16le \
  -f segment -segment_time 600 \
  -segment_list chunks/segments.csv -segment_list_type csv \
  -reset_timestamps 1 chunks/chunk-%03d.wav

600 is a demonstration chunk duration, not an API limit. Adjust it for the model and leave margin. PCM WAV can be much larger than compressed input, so duration segmentation does not guarantee acceptable upload size.

The FFmpeg segment documentation source defines a headerless CSV containing filename, start seconds, and end seconds. reset_timestamps attempts to start each output near zero; the manifest's original-timeline offsets serve a different purpose.

Save each audio chunk with its filename and actual start and end offsets

A local 1,250-second silence fixture produced:

chunk-000.wav,0.000000,600.000000
chunk-001.wav,600.000000,1200.000000
chunk-002.wav,1200.000000,1250.000000

This verifies the command and segment boundaries, not speech recognition. Other codecs and cutting methods can be constrained by packet or frame boundaries. Read actual manifests and media information rather than assuming every start equals chunk index times 600.

Validate one chunk before processing everything

The Nbility audio guide documents multipart transcription requests:

curl --fail-with-body --silent --show-error \
  https://api.nbility.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $NBILITY_API_KEY" \
  -F "model=YOUR_TRANSCRIPTION_MODEL" \
  -F "file=@chunks/chunk-000.wav" \
  -F "response_format=json" \
  --output chunk-000.transcript.json

This basic JSON request does not guarantee timestamps. Select a supported timestamp format and parameters from the model's documentation, then inspect the response. Do not assume all providers share a schema or merge an error body as transcription data. We did not execute this authenticated request.

Check access using the model-list guide. On upload failure, inspect status, content type, and file size before resubmitting.

Restore original-recording times

Use:

global start = manifest chunk start + local transcript start
global end   = manifest chunk start + local transcript end

For a chunk beginning at 600.000 seconds, a local interval of 12.400–15.800 becomes 612.400–615.800. This is arithmetic, not model output. If you trimmed 30 seconds before segmentation and need the untrimmed timeline, add that offset too.

Add the chunk offset to local timestamps, then account for any earlier trim

Validate finite numbers, ordered intervals, and plausible positions within the source chunk. Allow justified encoding tolerance without silently repairing absurd values. Sort by global start and retain the source filename for listening checks.

Review overlap and speakers separately

The command above creates consecutive chunks without intentional overlap. If you introduce overlap to preserve boundary sentences, record each actual start. Two recognitions of an overlap can differ in wording, so exact-string deduplication is insufficient; compare time ranges and listen before retaining one version.

Boundary duplication, local speaker labels, and missing timestamps require different review steps

speaker_0 in one chunk need not identify the same person in another. Global speaker identity requires a supporting workflow and separate verification. Names, numbers, and decisions also need review before the transcript becomes meeting minutes.

Listen at the beginning, chunk boundaries, and end, then check timestamps cited in the final output. The document-summary workflow can help with a reviewed transcript, while preserving audio references. Configure dedicated credentials using connection basics, and control recording copies, access, and retention when personal information is involved.

Related posts

Gemini Saves a New Voice When You Remix One
GeminiTTSVoice Design

Gemini Saves a New Voice When You Remix One

Use relative instructions to create an independent Gemini voice, separate persistent traits from delivery style, and track previews, lineage, project scope, and expiration.

Run your Agent workflow through Nbility

Get an API key and connect OpenAI-compatible models and developer tools from one place.

Get an API key