Files
2026-07-13 12:45:58 +08:00

35 lines
1012 B
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
require "vosk"
require "wavefile"
WaveFile::Reader.new(ARGV[0]) do |reader|
reader_format = reader.format
unless reader_format.channels == 1 && reader_format.bits_per_sample == 16 && reader_format.sample_format == :pcm
puts("Audio file must be WAV format mono PCM.")
exit(1)
end
model = Vosk::Model.new(lang: "en-us")
# You can also specify the possible word or phrase list as JSON list,
# the order doesn't have to be strict
rec = Vosk::KaldiRecognizer.new(
model, reader_format.sample_rate,
'["oh one two three", "four five six", "seven eight nine zero", "[unk]"]',
)
reader.each_buffer(4000) do |buffer|
data = buffer.samples.pack(WaveFile::PACK_CODES.dig(:pcm, 16))
if rec.accept_waveform(data).nonzero?
puts rec.result
rec.grammar = '["one zero one two three oh", "four five six", "seven eight nine zero", "[unk]"]'
else
puts rec.partial_result
end
end
puts rec.final_result
end