python的webrtc库如何实现语音端点检测 科大讯飞输入法PC体验版下载:语音+手写+
2018-03-05 出处:网络 整理:zhishizhan.net
延伸:科大讯飞输入法PC体验版下载:语音+手写+键盘
描述:... • 首款“云计算”智能语音输入法 • 语音流式识别,边说边识别 • 语音端点智能检测手写 • 键盘上直接手写,同一界面多种输入 • 笔画顺序随意组合,结果照样准确 • 竖屏叠写,长句手写一气呵成 • 横屏连写,写完左边写右边键盘 • 拼音/英文/字母独立面板 • 底部滑动切换键盘 • 九宫格式表情、标...
现在基于云端语义库的聊天机器人层出不穷,其中最著名的当属amazon的 Alexa/Echo 智能音箱.
国内如雨后春笋般出现了各种搭载语音聊天的智能音箱(如前几天在知乎上广告的若琪机器人)和各类智能机器人产品.国内语音服务提供商主要面对中文语音服务,由于语音不像图像有分辨率等等较为客观的指标,很多时候凭主观判断,所以较难判断各家语音识别和合成技术的好坏.但是我个人认为,国内的中文语音服务和国外的英文语音服务,在某些方面已经有超越的趋势.
通常搭建机器人聊天系统主要包括以下三个方面:
语音转文字(ASR/STT)
语义内容(NLU/NLP)
文字转语音(TTS)
语音转文字(ASR/STT)
在将语音传给云端API之前,是本地前端的语音采集,这部分主要包括如下几个方面:
麦克风降噪
声源定位
回声消除
唤醒词
语音端点检测
音频格式压缩
python 端点检测
由于实际应用中,单纯依靠能量检测特征检测等方法很难判断人声说话的起始点,所以市面上大多数的语音产品都是使用唤醒词判断语音起始.另外加上声音回路,还可以做语音打断.这样的交互方式可能有些傻,每次必须喊一下 唤醒词 才能继续聊天.这种方式聊多了,个人感觉会嘴巴疼:-O .现在github上有snowboy唤醒词的开源库,大家可以登录snowboy官网训练自己的唤醒词模型.
Kitt-AI : Snowboy
Sensory : Sensory
考虑到用唤醒词嘴巴会累,所以大致调研了一下,Python拥有丰富的库,直接import就能食用.这种方式容易受强噪声干扰,适合一个人在家玩玩.
pyaudio: pip install pyaudio 可以从设备节点读取原始音频流数据,音频编码是PCM格式;
webrtcvad: pip install webrtcvad 检测判断一组语音数据是否为空语音;
当检测到持续时间长度 T1 vad检测都有语音活动,可以判定为语音起始;
当检测到持续时间长度 T2 vad检测都没有有语音活动,可以判定为语音结束;
完整程序代码可以从我的github下载
程序很简单,相信看一会儿就明白了
'''
Requirements:
+ pyaudio - `pip install pyaudio`
+ py-webrtcvad - `pip install webrtcvad`
'''
import webrtcvad
import collections
import sys
import signal
import pyaudio
from array import array
from struct import pack
import wave
import time
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK_DURATION_MS = 30 # supports 10, 20 and 30 (ms)
PADDING_DURATION_MS = 1500 # 1 sec jugement
CHUNK_SIZE = int(RATE CHUNK_DURATION_MS / 1000) # chunk to read
CHUNK_BYTES = CHUNK_SIZE 2 # 16bit = 2 bytes, PCM
NUM_PADDING_CHUNKS = int(PADDING_DURATION_MS / CHUNK_DURATION_MS)
# NUM_WINDOW_CHUNKS = int
(240 / CHUNK_DURATION_MS)
NUM_WINDOW_CHUNKS = int
(400 / CHUNK_DURATION_MS) # 400 ms/ 30ms ge
NUM_WINDOW_CHUNKS_END = NUM_WINDOW_CHUNKS 2
START_OFFSET = int(NUM_WINDOW_CHUNKS CHUNK_DURATION_MS 0.5 RATE)
vad = webrtcvad.Vad
(1)
pa = pyaudio.PyAudio()
stream = pa.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
start=False,
# input_device_index=2,
frames_per_buffer=CHUNK_SIZE)
got_a_sentence = False
leave = False
def handle_int(sig, chunk):
global leave, got_a_sentence
leave = True
got_a_sentence = True
def record_to_file(path, data, sample_width):
Records from the microphone and outputs the resulting data to 'path'
# sample_width, data = record()
data = pack('' + ('h' len(data)), data)
wf = wave.open(path, 'wb')
wf.setnchannels
(1)
wf.setsampwidth(sample_width)
wf.setframerate(RATE)
wf.writeframes(data)
wf.close()
def normalize(snd_data):
Average the volume out
MAXIMUM = 32767 # 16384
times = float(MAXIMUM) / max(abs(i) for i in snd_data)
r = array('h')
for i in snd_data:
r.append(int(i times))
return r
signal.signal(signal.SIGINT, handle_int)
while not leave:
ring_buffer = collections.deque(maxlen=NUM_PADDING_CHUNKS)
triggered = False
voiced_frames = []
ring_buffer_flags = [0] NUM_WINDOW_CHUNKS
ring_buffer_index = 0
ring_buffer_flags_end = [0] NUM_WINDOW_CHUNKS_END
ring_buffer_index_end = 0
buffer_in = ''
# WangS
raw_data = array('h')
index = 0
start_point = 0
StartTime = time.time()
print( recording: )
stream.start_stream()
while not got_a_sentence and not leave:
chunk = stream.read(CHUNK_SIZE)
# add WangS
raw_data.extend(array('h', chunk))
index += CHUNK_SIZE
TimeUse = time.time() - StartTime
active = vad.is_speech(chunk, RATE)
sys.stdout.write('1' if active else '_')
ring_buffer_flags[ring_buffer_index] = 1 if active else 0
ring_buffer_index += 1
ring_buffer_index %= NUM_WINDOW_CHUNKS
ring_buffer_flags_end[ring_buffer_index_end] = 1 if active else 0
ring_buffer_index_end += 1
ring_buffer_index_end %= NUM_WINDOW_CHUNKS_END
# start point detection
if not triggered:
ring_buffer.append(chunk)
num_voiced = sum(ring_buffer_flags)
if num_voiced 0.8 NUM_WINDOW_CHUNKS:
sys.stdout.write(' Open ')
triggered = True
start_point = index - CHUNK_SIZE 20 # start point
# voiced_frames.extend(ring_buffer)
ring_buffer.clear()
# end point detection
else:
# voiced_frames.append(chunk)
ring_buffer.append(chunk)
num_unvoiced = NUM_WINDOW_CHUNKS_END - sum(ring_buffer_flags_end)
if num_unvoiced 0.90 NUM_WINDOW_CHUNKS_END or TimeUse 10:
sys.stdout.write(' Close ')
triggered = False
got_a_sentence = True
sys.stdout.flush()
sys.stdout.write('\n')
# data = b''.join(voiced_frames)
stream.stop_stream()
print( done recording)
got_a_sentence = False
# write to file
raw_data.reverse()
for index in range(start_point):
raw_data.pop()
raw_data.reverse()
raw_data = normalize(raw_data)
record_to_file(recording.wav, raw_data, 2)
leave = True
stream.close()
程序运行方式sudo python vad.py
分享给小伙伴们:
相关推荐
科大讯飞输入法PC体验版:语音+手写+键盘主题:科大讯飞输入法PC体验版:语音+手写+键盘
描述:... • 首款“云计算”智能语音输入法 • 语音流式识别,边说边识别 • 语音端点智能检测手写 • 键盘上直接手写,同一界面多种输入 • 笔画顺序随意组合,结果照样准确 • 竖屏叠写,长句手写一气呵成 • 横屏连写,写完左边写右边键盘 • 拼音/英文/字母面板 • 底部滑动切换键盘 • 九宫格式表情、标...
如何用声音来控IE浏览器主题:如何用声音来控IE浏览器
描述:...算机的来做。通过搜索很快找到了解决方。使用Microsoft Speech SDK+Python+PythonWin。虽然微软的语音识别引擎已经很强大了,但是要用它来字幕还有很长的路要走。字幕做不成了,不过用它来控浏览器还是错错有余的。发现使用语音功能作IE浏览器还是非常方便,只要设置好语句,IE浏览器就可以自动进行相关的作。下面是我已经实现的一些功能。(=符号前面是你要说...
Python模拟登陆实现码 回调函数的意义以及python实现实例 AS3与JS之间的简单自主题:Python模拟登陆实现码 回调函数的意义以及python实现实例 AS3与JS之间的简单自
描述:...点而已。opener = urllib2.build_opener(handler)。然后我们就可以正常的使用opener来访问网络了。小例实现的功能是模拟登录到理工的。码如下:# coding:UTF-8import urllib,urllib2,cookielibfilename = r'F:\pachong\gaoqing\dlutcookie.txt'# show cookie and save to localcookie = cookielib.MozillaCookieJar()handler = urllib2.HTTPCookieProcessor(cookie)opener = urllib2.build_opener(handler)# 记得使用urllib模块进行参数的encodep...
使用ctop在命令行中检测Linux容器能主题:使用ctop在命令行中检测Linux容器能
描述:...进行评估。基于所的数据,它可以尝试推测下层的容器技术。ctop也有助于在低内存环境中检测出谁在消耗大量的内存。功能ctop的一些功能如下: 收集CPU、内存和块输入输出的度量值 收集与拥有者、容器技术和任务统计相关的 通过任意栏对排序 以树状视图显示 折叠/展开cgroup树 选择并cgroup/容器 选择显示数据新的时间窗口 暂停新数据 检测基于system...
回调函数的意义以及python实现实例 AS3与JS之间的简单自定义参数通讯主题:回调函数的意义以及python实现实例 AS3与JS之间的简单自定义参数通讯
描述:...树,一是比较慢,二是比较耗内存,而SAX流式读取XML,比较快,占用内存少,但需要实现回调函数(handler)。当时就犯了病,被一个不是很知道的名词引起了兴趣--回调函数,后搜索学了一下,感觉需要写个什么来一下顺便加深映象,此处引用了不少各位神的经验,篇幅所限就不一一感谢了。回调函数(callback),百科的解释是这样的:回调函数就...
flash基础教程:逐帧动画、形变动画、运动动画概念及别介绍主题:flash基础教程:逐帧动画、形变动画、运动动画概念及别介绍
描述:...更改每一个连续帧在舞台上的内容来建立的动画。形状补间动画——是在两个关键帧端点之间,通过改变基本图形的形状或色变化,并由程序自动创建中间过程的形状变化而实现的动画。运动补间动画——是在两个关键帧端点之间,通过改变舞台上实例的位置、大小、旋转角度、色变化等等属,并由程序自动创建中间过程的运动变化而实现的动画。2. ...
搞笑图片