162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
|
# File 'lib/cohere/transcribe/cli.rb', line 162
def option_parser(values, state, out:)
OptionParser.new do |parser|
parser.banner = "Usage: cohere-transcribe [options] audio [audio ...]"
parser.separator("")
parser.separator("Batch Arabic/English transcription with optional timestamp alignment.")
parser.separator("")
parser.on("--model MODEL", "Hugging Face repository or local native Cohere ASR directory.") do |value|
values[:model] = value
end
parser.on("--model-revision REVISION", "Hub model commit, tag, or branch.") do |value|
values[:model_revision] = value
end
parser.on("--adapter ADAPTER", "Optional Hub repository or local LoRA adapter directory.") do |value|
values[:adapter] = value
end
parser.on("--adapter-revision REVISION", "Hub adapter commit, tag, or branch.") do |value|
values[:adapter_revision] = value
end
parser.on("--language LANGUAGE", String, %w[ar en], "Spoken language tag (ar or en).") do |value|
values[:language] = value
end
parser.on("--formats FORMAT [FORMAT ...]", String, "Outputs to write: txt, srt, vtt, json.") do |encoded|
value = encoded.split(FORMAT_ARGUMENT_SEPARATOR, -1)
unsupported = value - OUTPUT_FORMATS
unless unsupported.empty?
raise OptionParser::InvalidArgument,
"unsupported output format(s): #{unsupported.sort.join(", ")}"
end
values[:formats] = value
end
parser.on("--output-dir DIRECTORY", "Output root; preserve directory-relative structure.") do |value|
values[:output_dir] = value
end
parser.on("--recursive", "Recurse into input directories (default).") { values[:recursive] = true }
parser.on("--no-recursive", "Do not recurse into input directories.") { values[:recursive] = false }
parser.on("--existing POLICY", String, %w[error overwrite skip], "Existing outputs policy.") do |value|
values[:existing] = value
end
parser.on("--device DEVICE", String, %w[auto mps cuda cpu], "Inference device.") do |value|
values[:device] = value
end
parser.on("--dtype DTYPE", String, %w[auto bf16 fp16 fp32], "ASR model precision.") do |value|
values[:dtype] = value
end
parser.on(
"--audio-backend BACKEND",
String,
%w[auto torchcodec ffmpeg librosa],
"Audio decoder configuration."
) { |value| values[:audio_backend] = value }
parser.on("--audio-memory-gb GIB", String, "Decoded-PCM memory limit per file/group.") do |value|
values[:audio_memory_gb] = parse_reference_float(value)
end
parser.on("--preprocess-workers COUNT", String, "Concurrent audio decode workers.") do |value|
values[:preprocess_workers] = parse_reference_integer(value)
end
parser.on("--pipeline-preparation", "Overlap bounded preparation with ASR (default).") do
values[:pipeline_preparation] = true
end
parser.on("--no-pipeline-preparation", "Disable preparation/ASR overlap.") do
values[:pipeline_preparation] = false
end
parser.separator("")
parser.separator("Segmentation (VAD):")
parser.on("--vad MODE", String, %w[silero auditok none], "Segmentation policy.") do |value|
values[:vad] = value
end
parser.on("--vad-engine ENGINE", String, %w[auto torch onnx jit], "Silero runtime.") do |value|
values[:vad_engine] = value
end
parser.on("--vad-batch-size COUNT", String, "Maximum files per packed VAD call.") do |value|
values[:vad_batch_size] = parse_reference_integer(value)
end
parser.on("--vad-block-frames COUNT", String, "Maximum frames per packed VAD file.") do |value|
values[:vad_block_frames] = parse_reference_integer(value)
end
parser.on("--vad-threads COUNT", String, "Packed VAD CPU thread count.") do |value|
values[:vad_threads] = parse_reference_integer(value)
end
parser.on("--vad-merge", "Merge adjacent Silero speech spans.") { values[:vad_merge] = true }
parser.on("--no-vad-merge", "Do not merge adjacent Silero spans (default).") do
values[:vad_merge] = false
end
parser.on("--min-dur SECONDS", String, "Minimum speech duration.") do |value|
values[:min_dur] = parse_reference_float(value)
end
parser.on("--max-dur SECONDS", String, "Maximum segment/window duration.") do |value|
values[:max_dur] = parse_reference_float(value)
end
parser.on("--max-silence SECONDS", String, "Maximum Auditok internal silence.") do |value|
values[:max_silence] = parse_reference_float(value)
end
parser.on("--energy-threshold DB", String, "Auditok energy threshold.") do |value|
values[:energy_threshold] = parse_reference_float(value)
end
parser.on("--vad-threshold PROBABILITY", String, "Silero speech threshold.") do |value|
values[:vad_threshold] = parse_reference_float(value)
end
parser.on("--min-silence-ms MILLISECONDS", String, "Silero split silence.") do |value|
values[:min_silence_ms] = parse_reference_integer(value)
end
parser.on("--speech-pad-ms MILLISECONDS", String, "Silero speech padding.") do |value|
values[:speech_pad_ms] = parse_reference_integer(value)
end
parser.separator("")
parser.separator("Transcription:")
parser.on("--batch-size COUNT", String, "Initial ASR segment count.") do |value|
values[:batch_size] = parse_reference_integer(value)
end
parser.on("--batch-max-size COUNT", String, "Adaptive batch upper row cap.") do |value|
values[:batch_max_size] = parse_reference_integer(value)
end
parser.on("--batch-audio-seconds SECONDS", String, "Maximum padded audio per batch.") do |value|
values[:batch_audio_seconds] = parse_reference_float(value)
end
parser.on("--batch-vram-target FRACTION", String, "Adaptive batching VRAM target.") do |value|
values[:batch_vram_target] = parse_reference_float(value)
end
parser.on("--adaptive-batch", "Enable experimental adaptive batch growth.") do
values[:adaptive_batch] = true
end
parser.on("--no-adaptive-batch", "Disable adaptive growth (default).") do
values[:adaptive_batch] = false
end
parser.on("--pin-memory", "Compatibility flag; not applicable to native ggml.") do
values[:pin_memory] = true
end
parser.on("--no-pin-memory", "Leave native ggml host buffers unpinned (default).") do
values[:pin_memory] = false
end
parser.on("--max-new-tokens COUNT", String, "Initial decoder token limit.") do |value|
values[:max_new_tokens] = parse_reference_integer(value)
end
parser.on("--max-retry-tokens COUNT", String, "Automatic retry token limit.") do |value|
values[:max_retry_tokens] = parse_reference_integer(value)
end
parser.on("--truncation-policy POLICY", String, %w[retry warn], "Token-limit behavior.") do |value|
values[:truncation_policy] = value
end
parser.on("--stop-repetition-loops", "Stop conservative decoder repetition loops (default).") do
values[:stop_repetition_loops] = true
end
parser.on("--no-stop-repetition-loops", "Disable the repetition-loop guard.") do
values[:stop_repetition_loops] = false
end
parser.separator("")
parser.separator("Alignment and subtitle cues:")
parser.on("--alignment MODE", String, %w[word segment none], "Timestamp mode.") do |value|
state[:alignment] = true
values[:alignment] = value
end
parser.on("--text-only", "Alias for --alignment none.") do
state[:text_only] = true
values[:text_only] = true
end
parser.on("--align-batch-size COUNT", String, "Maximum alignment windows per batch.") do |value|
values[:align_batch_size] = parse_reference_integer(value)
end
parser.on("--align-dtype DTYPE", String, %w[fp32 fp16], "Alignment precision.") do |value|
values[:align_dtype] = value
end
parser.on("--max-chars COUNT", String, "Target subtitle cue length.") do |value|
values[:max_chars] = parse_reference_integer(value)
end
parser.on("--max-cue-dur SECONDS", String, "Target subtitle cue duration.") do |value|
values[:max_cue_dur] = parse_reference_float(value)
end
parser.on("--max-gap SECONDS", String, "Maximum inter-word cue gap.") do |value|
values[:max_gap] = parse_reference_float(value)
end
parser.on("--profile-json PATH", "Write performance telemetry as JSON.") do |value|
values[:profile_json] = value
end
parser.on("--version", "Show version and exit.") do
out.puts("cohere-transcribe #{VERSION}")
raise EarlyExit, 0
end
parser.on_tail("-h", "--help", "Show this help and exit.") do
out.puts(parser)
raise EarlyExit, 0
end
end
end
|