PCM 转WAV。 2. 多通道pcm挑出其中

import wave
import os
import wave
import numpy as np

def gen_wav(filepath):
    

    wavelist=[]
    filenames=os.listdir(filepath)
    for filename in filenames:
        print(filename)
        name,category=os.path.splitext(filepath+filename)  #分解文件扩展名
    #     name,category=os.path.splitext(filename)  #分解文件扩展名
        if category=='.pcm':  #若文件为wav音频文件
            print(name+'.wav')
            with open(filepath+filename, 'rb') as pcmfile:
                pcmdata = pcmfile.read()
            output = wave.open(name+'.wav', 'wb')
            output.setparams((1, 2, 32000, 0, 'NONE', 'NONE'))
            output.writeframes(pcmdata)
            output.close()


filepath="/Users/anker/Documents/2_Speech_data/anker设备实际录音/3382/Stage1/Katar/键盘 1hour/"
gen_wav(filepath)
        

2. 

import scipy.io.wavfile as wav
import wave
def pcm2wav(pcm_file, wav_file, channels=6, bits=16, sample_rate=48000):
    pcmf = open(pcm_file, 'rb')
    pcmdata = pcmf.read()
    pcmf.close()

    if bits % 8 != 0:
        raise ValueError("bits % 8 must == 0. now bits:" + str(bits))

    wavfile = wave.open(wav_file, 'wb')
    wavfile.setnchannels(channels)
    wavfile.setsampwidth(bits // 8)
    wavfile.setframerate(sample_rate)
    wavfile.writeframes(pcmdata)
    wavfile.close
    
for i in range (1,4):
    pcm2wav(str(i) + ".pcm", str(i)+".wav")
    sr, signal = wav.read(str(i) + ".wav")
    wav.write(str(i)+"_mic.wav", sr, signal[:,0])
    wav.write(str(i)+"_ref.wav", sr, signal[:,4])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCM音频数据换为WAV格式的方法如下: 1. 创建一个WAV文件头。 WAV文件头是固定大小的结构体,包含WAV文件的格式和参数信息。需要根据实际情况填充以下字段: - ChunkID:文件头标识符,固定为“RIFF”。 - ChunkSize:文件大小,不包括文件头的8个字节。 - Format:文件格式标识符,固定为“WAVE”。 - Subchunk1ID:子块1标识符,固定为“fmt ”。 - Subchunk1Size:子块1大小,固定为16。 - AudioFormat:音频格式,PCM为1。 - NumChannels:声道数,1为单声道,2为双声道。 - SampleRate:采样率,如44100。 - ByteRate:码率,等于采样率×声道数×采样位数/8。 - BlockAlign:数据块对齐单位,等于声道数×采样位数/8。 - BitsPerSample:采样位数,如16。 - Subchunk2ID:子块2标识符,固定为“data”。 - Subchunk2Size:子块2大小,等于音频数据的字节数。 2. 打开PCM文件,读取音频数据。 使用fopen()函数打开PCM文件,使用fread()函数读取PCM数据。 3. 将PCM数据写入WAV文件。 使用fwrite()函数将PCM数据写入WAV文件。 4. 关闭文件。 使用fclose()函数关闭文件。 下面是一个简单的C语言程序,实现了将单声道16位PCM音频数据换为WAV格式的功能: ``` #include <stdio.h> typedef struct { char ChunkID[4]; // RIFF标识符 unsigned int ChunkSize; // 文件大小 char Format[4]; // WAVE格式标识符 char Subchunk1ID[4]; // fmt标识符 unsigned int Subchunk1Size; // fmt块大小 unsigned short AudioFormat; // 音频格式 unsigned short NumChannels; // 声道数 unsigned int SampleRate; // 采样率 unsigned int ByteRate; // 码率 unsigned short BlockAlign; // 数据块对齐单位 unsigned short BitsPerSample; // 采样位数 char Subchunk2ID[4]; // data标识符 unsigned int Subchunk2Size; // 音频数据大小 } WAVE_HEADER; int main(int argc, char *argv[]) { char *pcm_file = "test.pcm"; char *wav_file = "test.wav"; unsigned int pcm_size; unsigned char *pcm_data; WAVE_HEADER wav_header; FILE *pcm_fp, *wav_fp; // 打开PCM文件 pcm_fp = fopen(pcm_file, "rb"); if (!pcm_fp) { printf("Open PCM file failed!\n"); return -1; } // 获取PCM数据大小 fseek(pcm_fp, 0, SEEK_END); pcm_size = ftell(pcm_fp); rewind(pcm_fp); // 分配PCM数据缓冲区 pcm_data = (unsigned char *)malloc(pcm_size); if (!pcm_data) { printf("Allocate memory failed!\n"); fclose(pcm_fp); return -1; } // 读取PCM数据 if (fread(pcm_data, 1, pcm_size, pcm_fp) != pcm_size) { printf("Read PCM data failed!\n"); free(pcm_data); fclose(pcm_fp); return -1; } // 关闭PCM文件 fclose(pcm_fp); // 填充WAV文件头 wav_header.ChunkID[0] = 'R'; wav_header.ChunkID[1] = 'I'; wav_header.ChunkID[2] = 'F'; wav_header.ChunkID[3] = 'F'; wav_header.ChunkSize = pcm_size + sizeof(WAVE_HEADER) - 8; wav_header.Format[0] = 'W'; wav_header.Format[1] = 'A'; wav_header.Format[2] = 'V'; wav_header.Format[3] = 'E'; wav_header.Subchunk1ID[0] = 'f'; wav_header.Subchunk1ID[1] = 'm'; wav_header.Subchunk1ID[2] = 't'; wav_header.Subchunk1ID[3] = ' '; wav_header.Subchunk1Size = 16; wav_header.AudioFormat = 1; wav_header.NumChannels = 1; wav_header.SampleRate = 44100; wav_header.ByteRate = 44100 * 2; wav_header.BlockAlign = 2; wav_header.BitsPerSample = 16; wav_header.Subchunk2ID[0] = 'd'; wav_header.Subchunk2ID[1] = 'a'; wav_header.Subchunk2ID[2] = 't'; wav_header.Subchunk2ID[3] = 'a'; wav_header.Subchunk2Size = pcm_size; // 打开WAV文件 wav_fp = fopen(wav_file, "wb"); if (!wav_fp) { printf("Open WAV file failed!\n"); free(pcm_data); return -1; } // 写入WAV文件头 if (fwrite(&wav_header, sizeof(WAVE_HEADER), 1, wav_fp) != 1) { printf("Write WAV header failed!\n"); free(pcm_data); fclose(wav_fp); return -1; } // 写入PCM数据 if (fwrite(pcm_data, 1, pcm_size, wav_fp) != pcm_size) { printf("Write WAV data failed!\n"); free(pcm_data); fclose(wav_fp); return -1; } // 关闭WAV文件 fclose(wav_fp); // 释放PCM数据缓冲区 free(pcm_data); printf("Convert PCM to WAV success!\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值