失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 语音识别1: 音频信号采集 并存入 wav文件

语音识别1: 音频信号采集 并存入 wav文件

时间:2019-02-27 17:08:50

相关推荐

语音识别1: 音频信号采集 并存入 wav文件

1 说明

语音识别的基本操作是:1)能够录音 2)能够将录音文件存储。以下将列出此操作,并逐条语句讲解。

2 音频录制代码

import pyaudioimport wavefrom tqdm import tqdmdef record_audio(wave_out_path,record_second):CHUNK = 1024FORMAT = pyaudio.paInt16CHANNELS = 2RATE = 44100p = pyaudio.PyAudio()stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)wf = wave.open(wave_out_path, 'wb')wf.setnchannels(CHANNELS)wf.setsampwidth(p.get_sample_size(FORMAT))wf.setframerate(RATE)print("* recording")for i in tqdm(range(0, int(RATE / CHUNK * record_second))):data = stream.read(CHUNK)wf.writeframes(data)print("* done recording")stream.stop_stream()stream.close()p.terminate()wf.close()record_audio("output.wav",record_second=4)

注解:

1)包含对象说明

import pyaudio # 是个操作类,可以生成pyaudio对象,对stream进行操作

import wave # 是对声波信号进行处理的对象

from tqdm import tqdm #是一个进入条

2)函数说明

def record_audio(wave_out_path,record_second): #wav文件路径,录音时长

CHUNK = 1024 # 缓存buff大小

FORMAT = pyaudio.paInt16 # 信号的幅度用2字节整数表示,可以paInt24,或paInt24

CHANNELS = 2 # 双声道

RATE = 44100# 采样频率

p = pyaudio.PyAudio() # 生成一个操作对象

stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE, input=True, frames_per_buffer=CHUNK)# 按照参数生成一个流对象

wf = wave.open(wave_out_path, 'wb') # 打开Wav文件,文件对象为wf

wf.setnchannels(CHANNELS)# 将流对象参数CHANNELS传入文件对象

wf.setsampwidth( p.get_sample_size(FORMAT)) # get_sample_size(FORMAT)获得 ---FORMATE的字节数

wf.setframerate(RATE) # 设定文件的采样频率

print("* recording")

for i in tqdm(range(0, int( RATE / CHUNK * record_second))):

------------- #RATE / CHUNK每秒需要几个buff缓存

data = stream.read(CHUNK) # 取出buff数据,临时存于data变量

wf.writeframes(data)#将data数据存盘。

print("* done recording")

stream.stop_stream()# 停止流

stream.close() # 关闭流

p.terminate() # 中断处理

wf.close() #关闭文件

record_audio("output.wav",record_second=4) # 主程序入口

3 专业的写法

import pyaudioimport waveclass Recorder(object):'''A recorder class for recording audio to a WAV file.Records in mono by default.'''def __init__(self, channels=1, rate=44100, frames_per_buffer=1024):self.channels = channelsself.rate = rateself.frames_per_buffer = frames_per_bufferdef open(self, fname, mode='wb'):return RecordingFile(fname, mode, self.channels, self.rate,self.frames_per_buffer)class RecordingFile(object):def __init__(self, fname, mode, channels, rate, frames_per_buffer):self.fname = fnameself.mode = modeself.channels = channelsself.rate = rateself.frames_per_buffer = frames_per_bufferself._pa = pyaudio.PyAudio()self.wavefile = self._prepare_file(self.fname, self.mode)self._stream = Nonedef __enter__(self):return selfdef __exit__(self, exception, value, traceback):self.close()def record(self, duration):# Use a stream with no callback function in blocking modeself._stream = self._pa.open(format=pyaudio.paInt16,channels=self.channels,rate=self.rate,input=True,frames_per_buffer=self.frames_per_buffer)for _ in range(int(self.rate / self.frames_per_buffer * duration)):audio = self._stream.read(self.frames_per_buffer)self.wavefile.writeframes(audio)return Nonedef start_recording(self):# Use a stream with a callback in non-blocking modeself._stream = self._pa.open(format=pyaudio.paInt16,channels=self.channels,rate=self.rate,input=True,frames_per_buffer=self.frames_per_buffer,stream_callback=self.get_callback())self._stream.start_stream()return selfdef stop_recording(self):self._stream.stop_stream()return selfdef get_callback(self):def callback(in_data, frame_count, time_info, status):self.wavefile.writeframes(in_data)return in_data, pyaudio.paContinuereturn callbackdef close(self):self._stream.close()self._pa.terminate()self.wavefile.close()def _prepare_file(self, fname, mode='wb'):wavefile = wave.open(fname, mode)wavefile.setnchannels(self.channels)wavefile.setsampwidth(self._pa.get_sample_size(pyaudio.paInt16))wavefile.setframerate(self.rate)return wavefileif __name__=="__main__":myRecord = Recorder()myXR = myRecord.open("./myvoice.wav")myXR.record(4)myXR.start_recording()myXR.stop_recording()myXR.close()

如果觉得《语音识别1: 音频信号采集 并存入 wav文件》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。