generate_audio_file.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from __future__ import print_function
  2. from builtins import range
  3. import os
  4. import wave
  5. import struct
  6. def get_wave_array_str(filename, target_bits):
  7. wave_read = wave.open(filename, "r")
  8. array_str = ""
  9. nchannels, sampwidth, framerate, nframes, comptype, compname = wave_read.getparams()
  10. sampwidth *= 8
  11. for i in range(wave_read.getnframes()):
  12. val, = struct.unpack("<H", wave_read.readframes(1))
  13. scale_val = (1 << target_bits) - 1
  14. cur_lim = (1 << sampwidth) - 1
  15. # scale current data to 8-bit data
  16. val = val * scale_val / cur_lim
  17. val = int(val + ((scale_val + 1) // 2)) & scale_val
  18. array_str += "0x%x, " % (val)
  19. if (i + 1) % 16 == 0:
  20. array_str += "\n"
  21. return array_str
  22. def gen_wave_table(wav_file_list, target_file_name, scale_bits=8):
  23. with open(target_file_name, "w") as audio_table:
  24. print('#include <stdio.h>', file=audio_table)
  25. print('const unsigned char audio_table[] = {', file=audio_table)
  26. for wav in wav_file_list:
  27. print("processing: {}".format(wav))
  28. print(get_wave_array_str(filename=wav, target_bits=scale_bits), file=audio_table)
  29. print('};\n', file=audio_table)
  30. print("Done...")
  31. if __name__ == '__main__':
  32. print("Generating audio array...")
  33. wav_list = []
  34. for filename in os.listdir("./"):
  35. if filename.endswith(".wav"):
  36. wav_list.append(filename)
  37. gen_wave_table(wav_file_list=wav_list, target_file_name="audio_example_file.h")