录音--获取语音流(pyAudio)
这是学习时的笔记,包含相关资料链接,有的当时没有细看,记录下来在需要的时候回顾。
有些较混乱的部分,后续会再更新。
欢迎感兴趣的小伙伴一起讨论,跪求大神指点~
录音-语音流(pyAudio)
tags:voice
进行语音流检测
pyAudio
http://old.sebug.net/paper/books/scipydoc/wave_pyaudio.html
注:这部分是通过录音设备给语音激活检测传输语音流。
"path/to/vad/audio_stream.py"
#!usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
from pyaudio import PyAudio,paInt16
from datetime import datetime
import wave
from Tkinter import *
import sys
from ffnn import FFNNVADGeneral
import logging
# import chardet # 查看编码
# define of params
NUM_SAMPLES =160
FRAMERATE = 16000
CHANNELS = 1
SAMPWIDTH = 2
FORMAT = paInt16
TIME = 125
FRAMESHIFT = 160
def save_wave_file(filename,data):
'''save the date to the wav file'''
wf = wave.open(filename,'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(SAMPWIDTH)
wf.setframerate(FRAMERATE)
wf.writeframes("".join(data)) # ""中间不能有空格,不然语音录入会有很多中断。
wf.close()
def my_button(root,label_text,button_text,button_stop,button_func,stop_func):
'''create label and button'''
label = Label(root,text=label_text,width=30,height=3).pack()
button = Button(root,text=button_text,command=button_func,anchor='center',width=30,height=3).pack()
button = Button(root,text=button_stop,command=stop_func,anchor='center',width=30,height=3).pack()
def record_wave():
'''open the input of wave'''
pa = PyAudio()
# 录音
stream = pa.open(format=FORMAT,
channels=CHANNELS,
rate=FRAMERATE,
input=True,
frames_per_buffer=NUM_SAMPLES) #一个buffer存NUM_SAMPLES个字节,作为一帧
vad = FFNNVADGeneral('/path/to/VAD/alex-master/alex/tools/vad_train/model_voip/vad_nnt_546_hu32_hl1_hla6_pf10_nf10_acf_1.0_mfr20000_mfl20000_mfps0_ts0_usec00_usedelta0_useacc0_mbo1_bs100.tffnn',
filter_length=2, sample_rate=16000, framesize=512, frameshift=160,
usehamming=True, preemcoef=0.97, numchans=26, ceplifter=22, numceps=12,
enormalise=True, zmeansource=True, usepower=True, usec0=False,
usecmn=False, usedelta=False, useacc=False, n_last_frames=10,
n_prev_frames=10, lofreq=125, hifreq=3800, mel_banks_only=True)
# 语音激活检测神经网络方法的类FFNNVADGeneral.
save_buffer = []
count = 0
# logging设置,用于记录日志
logging.basicConfig(level=logging.INFO,
filename='log.txt',
filemode ='w',
format='%(message)s')
while count < TIME*4:
string_audio_data = stream.read(NUM_SAMPLES)
result = vad.decide(string_audio_data)
frame = count*NUM_SAMPLES/float(FRAMESHIFT)
time = count*NUM_SAMPLES/float(FRAMERATE) # time=frame*frameshift/framerate
logging.info('frame: '+str(frame)+' time: '+str(time)+' prob: '+str(result)) # logging记录字符串,用‘+’连接
save_buffer.append(string_audio_data)
count += 1
#chardet.detect(string_audio_data) #查看编码类型
print "."
filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+".wav"
save_wave_file(filename,save_buffer)
save_buffer = []
print "filename,saved."
def record_stop():
# stop record the wave
sys.exit(0)
def main():
root = Tk()
root.geometry('300x200+200+200')
root.title('record wave')
my_button(root,"Record a wave","clik to record","stop recording",record_wave,record_stop)
root.mainloop()
if __name__ == "__main__":
main()
# error
$ bt_audio_service_open: connect() failed: Connection refused (111)
# 解决: 貌似有多余蓝牙库却没有蓝牙设备
$ sudo apt-get purge bluez-alsa
# Warning
$ ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
# 是由于usr/share/alsa/alsa.conf默认设置
录音
sudo apt-get update #更新软件源,最好使用国内的软件源,如何配置源参考百度。
sudo apt-get upgrade #升级软件包
sudo apt-get install alsa-utils alsa-tools alsa-tools-gui alsamixergui #安装所需软件包
# 查看音频设备
$ arecord -l
> card 0: PCH [HDA Intel PCH], device 0: ALC887-VD Analog [ALC887-VD Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 2: ALC887-VD Alt Analog [ALC887-VD Alt Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
# 机器有多于一个声卡,可以用下面的命令显示出来
$ cat /proc/asound/cards
> 0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf7210000 irq 29
1 [NVidia ]: HDA-Intel - HDA NVidia
HDA NVidia at 0xf7080000 irq 17
# 每一个声卡有一个card number和一个device number,可以用下面命令显示出来
$ aplay -l
> card 0: PCH [HDA Intel PCH], device 0: ALC887-VD Analog [ALC887-VD Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC887-VD Digital [ALC887-VD Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
# 录音
$ arecord -D "plughw:0,0" -f S16_LE -r 16000 -d 5 -t wav file.wav
# -D 选择设备 试过hw:1,0 hw:0,2 只有hw:0,0可以录音
# -f 录音格式 S16_LE代表有符号16位小端序
# -r 采样率
# -t 录音时长
# file.wav 文件名
# 不添加plug会有警示,因为是外置声卡
Warning: rate is not accurate (requested = 16000Hz, got = 44100Hz) please, try the plug plugin
# 验证录音
$ aplay file.wav
一般alsa设置了一个defaults设备,音频播放软件默认使用defaults设备输出声音。defaults设备定义在alsa.conf中,内容如下:
[plain]
#
# defaults
#
# show all name hints also for definitions without hint {} section
defaults.namehint.showall off
# show just basic name hints
defaults.namehint.basic on
# show extended name hints
defaults.namehint.extended off
#
defaults.ctl.card 0
defaults.pcm.card 0
defaults.pcm.device 0
defaults.pcm.subdevice -1
……
defaults会默认匹配card number和device number比较小的声卡。
如果要修改,则修改/etc/asound.conf或~/.asoundrc。比如我要把defaults匹配到card 1,device 0上,则添加一下几行:
[plain]
$ sudo vim /etc/asound.conf
defaults.pcm.card 1
defaults.pcm.device 3
defaults.ctl.card 1
c++录音
https://github.com/aaronaanderson/ofxPortSF
有些可能记录时忘记记录获取信息的网站地址,有不当之处请指正~~
(若非特别声明,文章均为Vanessa的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除)
录音--获取语音流(pyAudio)的更多相关文章
- 从零开始实现基于微信JS-SDK的录音与语音评价功能
最近接受了一个新的需求,希望制作一个基于微信的英语语音评价页面.即点击录音按钮,用户录音说出预设的英文,根据用户的发音给出对应的评价.以下是简单的Demo: ![](reecode/qrcode.pn ...
- Android 音视频深入 十七 FFmpeg 获取RTMP流保存为flv (附源码下载)
项目地址https://github.com/979451341/RtmpSave 这个项目主要代码我是从雷神那弄过来的,不愧是雷神,我就配个环境搞个界面就可以用代码了. 这一次说的是将RTMP流媒体 ...
- 机器人之路的第一小步:录音+语音识别(语音转文字),大小600K(免费下载)!
机器人之路的第一小步:录音+语音识别(语音转文字),大小600K,本人出品! 机器人之路的第一小步:录音+语音识别,准确率还不是特别高,不过普通话标准的话,识别准确率还是不错的,大家可以体验一下,请下 ...
- java获取文件流
CreateTime--2017年9月1日14:49:21 Author:Marydon servlet获取文件流的两种方式 方式一:使用绝对路径(推荐使用) import java.io.Inp ...
- Python 利用 BeautifulSoup 爬取网站获取新闻流
0. 引言 介绍下 Python 用 Beautiful Soup 周期性爬取 xxx 网站获取新闻流: 图 1 项目介绍 1. 开发环境 Python: 3.6.3 BeautifulSoup: ...
- 关于ios 和 android 录音(语音)对聊文件格式问题
关于ios 和 android 录音(语音)对聊文件格式问题 在做语音对讲的时候,将会碰到录制语音格式的问题,这些需要跨平台我们可能需要使用双方平台都支持的格式,或者执行编码转换 解决方式如下: wa ...
- js上传文件获取文件流
上传文件获取文件流 <div> 上传文件 : <input type="file" name = "file" id = "file ...
- HTML5微信jssdk录音播放语音的方法
HTML5微信jssdk录音播放语音的方法需要注意的2个问题1 就是一定要判断1秒内 录音都不算 ps:太短不能录音 2 录音超过1分钟 会发现正在录音突然消失 所以要写wx.onVoiceRecor ...
- 图片上传利用request.getInputStream()获取文件流时遇到的问题
图片上传功能是我们web里面经常用到的,获得的方式也有很多种,这里我用的是request.getInputStream()获取文件流的方式.想要获取文件流有两种方式,附上代码 int length = ...
- 流式思想概述和两种获取Stream流的方式
流式思想概述 整体来看,流式思想类似于工厂车间的生产流水线 当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个模型步骤方案,然后再按照方法去执行他 这张图中展示 ...
随机推荐
- input控制输入保留一位小数
function zlip(obj){ obj.value = obj.value.replace(/[^\d.]/g,""); //清除“数字”和“.”以外的字符 obj.val ...
- Linux-Centon7安装以及配置
环境:MacOS 10.13.6 虚拟机:VirtualBox6.0(VirtualBox-6.0.4-128413-OSX.dmg) Linux:Centos7(CentOS-7-x86_64-Mi ...
- SPA
为什么用SPA 1. 减少服务器压力 如果不用spa 那么每次切换页面的时候,就会向服务器发送一个请求 服务器返回一个html文件 如果使用了SPA 在切换时,不需要请求服务器,只要通过本地 ...
- Chart Parser 中 Earley's 算法的应用
1. 基本概念 1.1 状态 state 上下文无关文法规则 圆点 · (左边是已分析的,右边是未分析的:点在最右端表示完成状态,否则为未完成状态) 状态的起止位置 1.2 基本操作/算子 opera ...
- python基础 (迭代器回顾,生成器,推导式)
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- .NET core RSA帮助类
解决 Operation is not supported on this platform 异常 直接上代码: public class RSAHelper { /// <summary> ...
- GUI学习之十——QFrame和的QAbstractScrollArea学习总结
上一章我们学习了单行的文本框QLineEdit类,下面我们要为多行的文本框的学习坐下准备,总结一下QFrame类和QAbstractScrollArea类 一.QFrame类 1.描述 QFrame的 ...
- python数据结构(二)------元组
元组是不可变序列,因此,元组的操作非常简单,本文就简单介绍一下,并解释下元组存在的意义: 2.2.1 元组的创建 2.2.2 tuple函数 2.2.3 基本元组操作 2.2.4 元组存在的意义 2. ...
- HttpWebRequest.AddRange 支持long类型
很久很久以前,在哪个FAT32格式还流行的年代,文件大小普遍还没超过4G的年代,.Net已经出来了. 而那时候.Net实现的HTTP断点续传协议,还没预料到如此普及(我猜的).那时候的HttpWebR ...
- matplotlib 中文显示问题
matplotlib 默认显示不了中文,如果想显示中文,通过下面代码设置: import matplotlib #指定默认字体 matplotlib.rcParams['font.sans-serif ...