1 说明

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

2 音频录制代码

import pyaudio
import wave
from tqdm import tqdm
def 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 pyaudio
import 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文件相关推荐

  1. [Android] [音视频系列]在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件

    参考 官方文档地址:https://developer.android.google.cn/reference/android/media/AudioRecord GitHub 地址:https:// ...

  2. Android音频开发(4):如何存储和解析wav文件

    2019独角兽企业重金招聘Python工程师标准>>> 无论是文字.图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图 ...

  3. Android音频开发(五)如何存储和解析最简单的音频wav文件

    我们大家都知道,无论是文字.图像还是声音,都必须以一定的格式来组织和存储起来,然后其它的软件再以相同的协议规则,相应的格式才能去打开解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 YUV. ...

  4. System Generator从入门到放弃(十)-ADC应用之音频信号采集与输出

    System Generator从入门到放弃(十)-ADC应用之音频信号采集与输出 文章目录 System Generator从入门到放弃(十)-ADC应用之音频信号采集与输出 一.ADC应用之音频信 ...

  5. NAudio用法详解(7)Wav文件结构分析及NAudio相关对象对应关系分析

    目录 波形文件的基础知识 波形文件的存储过程 与声音有关的三个参数 1.采样频率 2.采样位数 3.声道数 WAV文件的编码 文件整体结构 RIFF区块 fmt区块(FORMAT区块) DATA区块 ...

  6. WAV文件C++分析与显示

    预备知识: WAV格式说明:http://baike.baidu.com/view/8033.htm 总体思路:分别建立与WAV格式相对应的类: struct RIFF_HEADER { char s ...

  7. html5使用websocket发送(PCM)音频数据到服务器,再转在wav文件

    PCM格式 通过websocket发送音频数据. <html> <head><meta charset="utf-8"><title> ...

  8. python3 利用ffmpeg把音频转换为16khz的wav文件

    最近语音识别需要转换为16khz 16位的wav文件,这里分享一下我的代码: 这里默认电脑已经安装好ffmpeg,没安装好的话,mac用hombrew安装一下就行了,然后: import osdef ...

  9. 实验 9 音频信号采集及处理

    实验 9 音频信号采集及处理 代码剖析 声音回放 显示音频时域波形 显示音频频域波形 声音主要频率1 声音主要频率2 合成声音播放 播放加噪信号 加噪之后的时域和频谱图 显示低通滤波器特性 播放滤波后 ...

最新文章

  1. 唐山松下焊接机器人编程招聘_机器人四小家族-松下Panasonic专注焊接
  2. C++输入输出流进制转换
  3. mysql数据库有触发器吗_MySQL数据库之MySQL 触发器实现
  4. 在Python中操纵json数据的最佳方式
  5. day16前端(Dom+Jquery)
  6. IOC--IOC+AOP--热插拔的系统架构实现演化
  7. c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...
  8. This blog has been cancelled for a long time
  9. 【写作技巧】毕业论文写作思路
  10. Linux下redis基本安装配置(CentOS7)
  11. 百度文库免费复制文字_如何复制百度文库上的内容——解答!
  12. 不加群提取群成员_使用itchat分析指定微信群男女比例等成员数据
  13. 电影社交网络中Facemash女生评比算法讲解
  14. 前端性能优化实践:让视频加载也“懒”一点
  15. 注册表Regedit实现右键管理员权限运行notepad++打开文件
  16. www.tf.tt index.php,恶意软件分析 URL链接扫描 免费在线病毒分析平台 | 魔盾安全分析...
  17. 迅为STM32MP157开发板使用手册更新啦
  18. 让企业报表化繁为简,Smartbi实现报表统一管理
  19. 前端HTML字体和文本样式
  20. 企业短期偿债能力评估-流动比率、速动比率、现金比率、现金流量比率

热门文章

  1. Flink从入门到精通100篇(十九)-基于 Flink 的大规模准实时数据分析平台的建设实践
  2. mysql中OPTIMIZE TABLE的作用
  3. python爬虫编程100例_哪种Python程序员最赚钱?爬虫数据告诉你!
  4. python-用Map, Filter, Reduce代替For循环
  5. 浅谈百度新一代query-ad 推荐引擎如何提升广告收益率
  6. 带你看android的内心世界
  7. java中hashMap的排序
  8. spring jdbcTemplate使用queryForList示例
  9. What Influences Method Call Performance in Java?--reference
  10. 转载--redis密码管理