| 36 | os.makedirs(os.path.join(project_dir, 'lpc')) |
| 37 | |
| 38 | def audioProcess(wav_path): |
| 39 | # 读取wav文件,存入list |
| 40 | rate, signal = wavfile.read(wav_path) # rate:采样率 |
| 41 | # print(len(signal)) |
| 42 | # print('signal:',signal[1000:2000]) |
| 43 | print('rate: ', rate) # 采样率 |
| 44 | |
| 45 | frames_per_second = 30 # 视频fps |
| 46 | chunks_length = 260 # 音频分割,520ms |
| 47 | audio_frameNum = int(len(signal) / rate * frames_per_second) # 计算音频对应的视频帧数 |
| 48 | print('audio_frameNum: ', audio_frameNum) |
| 49 | |
| 50 | # 前后各添加260ms音频 |
| 51 | a = np.zeros(chunks_length * rate // 1000, dtype=np.int16) |
| 52 | signal = np.hstack((a, signal, a)) |
| 53 | |
| 54 | # signal = signal / (2.**15) |
| 55 | frames_step = 1000.0 / frames_per_second # 视频每帧的时长间隔33.3333ms |
| 56 | rate_kHz = int(rate / 1000) # 采样率:48kHz |
| 57 | |
| 58 | # 分割音频 |
| 59 | audio_frames = [signal[int(i * frames_step * rate_kHz): |
| 60 | int((i * frames_step + chunks_length * 2) * rate_kHz)] |
| 61 | for i in range(audio_frameNum)] |
| 62 | inputData_array = np.zeros(shape=(1, 32, 64)) # 创建一个空3D数组,该数组(1*32*64)最后需要删除 |
| 63 | |
| 64 | for i in range(len(audio_frames)): |
| 65 | print(i) |
| 66 | audio_frame = audio_frames[i] # 每段音频,8320个采样点 |
| 67 | |
| 68 | overlap_frames_apart = 0.008 |
| 69 | overlap = int(rate * overlap_frames_apart) # 128 samples |
| 70 | frameSize = int(rate * overlap_frames_apart * 2) # 256 samples |
| 71 | numberOfFrames = 64 |
| 72 | |
| 73 | # initiate a 2D array with numberOfFrames rows and frame size columns |
| 74 | frames = np.ndarray((numberOfFrames, frameSize)) |
| 75 | for k in range(0, numberOfFrames): |
| 76 | for i in range(0, frameSize): |
| 77 | if ((k * overlap + i) < len(audio_frame)): |
| 78 | frames[k][i] = audio_frame[k * overlap + i] |
| 79 | else: |
| 80 | frames[k][i] = 0 |
| 81 | |
| 82 | frames *= np.hanning(frameSize) |
| 83 | frames_lpc_features = [] |
| 84 | |
| 85 | # a = (c_double*frameSize)() |
| 86 | b = (c_double * 32)() |
| 87 | |
| 88 | # linear predictive coding |
| 89 | for k in range(0, numberOfFrames): |
| 90 | # temp_list = frames[k] |
| 91 | a = (c_double * frameSize)(*frames[k]) |
| 92 | # a = (c_double*len(frames[k]))() |
| 93 | # b = (c_double*32)() |
| 94 | # LPC(float *in, int size, int order, float *out) |
| 95 | dll.LPC(pointer(a), frameSize, 32, pointer(b)) # linear predictive coding |