#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2018/12/12 04:44:09 +0900> """ Split wav file by 32 samples. use Pydub. 【Python/pydub】mp3、wavファイルから部分抽出(切り分け、分割) | アルゴリズム雑記 https://algorithm.joho.info/programming/python/pydub-split/ 【Python/pydub】mp3、wavのデータをNumPy配列に変換 | アルゴリズム雑記 https://algorithm.joho.info/programming/python/pydub-numpy/ Windows10 x64 + Python 2.7.15 32bit + Pydub 0.23.0 + Numpy 1.15.4 """ import argparse import sys from pydub import AudioSegment import numpy as np def dump_table(dt): print("pcmtbl={") for src in dt: d = (src * 0x0f).astype("int16") if d.min() < 0 or d.max() > 15: print("Error : min(), max() = %f,%f" % (d.min(), d.max())) sys.exit() s = " {" for i in range(0, 32, 2): v = ((d[i + 1] & 0x0f) << 4) | (d[i + 0] & 0x0f) if i < 30: s += "0x%02x," % v else: s += "0x%02x" % v s += "}," print(s) print("}") def dump_string(dt): print("pcmtbl={") for src in dt: d = (src * 0x0f).astype("int16") if d.min() < 0 or d.max() > 15: print("Error : min(), max() = %f,%f" % (d.min(), d.max())) sys.exit() s = ' "' for i in range(0, 32, 2): v = ((d[i + 1] & 0x0f) << 4) | (d[i + 0] & 0x0f) s += "%02x" % v s += '",' print(s) print("}") def main(): """Main.""" parser = argparse.ArgumentParser() parser.add_argument('arg1', metavar='WAVFILE', help='Input wav file') parser.add_argument('--table', action='store_true', help='table output') args = parser.parse_args() infile = args.arg1 sound = AudioSegment.from_wav(infile) # read wave file data = np.array(sound.get_array_of_samples()) src = data[::sound.channels] # get mono channel # normlize src = (src - src.min()).astype(float) / (src.max() - src.min()).astype(float) rate = sound.frame_rate sample_len = len(src) print("-- Input file : %s" % infile) print("-- Channel : %d" % sound.channels) print("-- Sampling rate : %d Hz" % rate) print("-- Duration : %f msec" % len(sound)) print("-- Sample length : %d point" % sample_len) # divide dt = [] src_len = len(src) idx = 0 while True: d = np.array([0.5] * 32) for i in range(32): if idx + i < src_len: d[i] = src[idx + i] dt.append(d) idx += 32 if idx >= src_len: break print("-- N : %d" % len(dt)) if args.table: dump_table(dt) else: dump_string(dt) if __name__ == "__main__": main()