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 = case type do "part" -> "#{ref}_#{chunk_number}.wav" "final" -> "#{ref}_final.wav" _ -> "#{ref}_#{chunk_number}.wav" end path = Path.join(@wav_dir, filename) IO.inspect(path, label: "---> ") File.write!(path, header <> chunk) {:ok, path} end end