39 lines
1018 B
Elixir
39 lines
1018 B
Elixir
defmodule AudioSaver do
|
|
@wav_dir "recordings/"
|
|
|
|
def save_chunk_as_wav(ref, chunk, sample_rate \\ 48100, bits_per_sample \\ 16, channels \\ 1, type) do
|
|
File.mkdir_p!(@wav_dir)
|
|
|
|
data_size = byte_size(chunk)
|
|
byte_rate = sample_rate * channels * div(bits_per_sample, 8)
|
|
block_align = div(bits_per_sample * channels, 8)
|
|
riff_size = 36 + data_size
|
|
|
|
header =
|
|
<<
|
|
"RIFF",
|
|
riff_size::little-size(32),
|
|
"WAVE",
|
|
"fmt ",
|
|
16::little-size(32),
|
|
1::little-size(16),
|
|
channels::little-size(16),
|
|
sample_rate::little-size(32),
|
|
byte_rate::little-size(32),
|
|
block_align::little-size(16),
|
|
bits_per_sample::little-size(16),
|
|
"data",
|
|
data_size::little-size(32)
|
|
>>
|
|
|
|
chunk_number = Whisper.Counter.next(ref)
|
|
|
|
filename = "#{ref}_#{chunk_number}.wav"
|
|
path = Path.join(@wav_dir, filename)
|
|
File.write!(path, header <> chunk)
|
|
IO.inspect(path, label: "---> ")
|
|
|
|
{:ok, path}
|
|
end
|
|
end
|