如果你想尝试用树莓派打造一款语音对话机器人,那么你肯定避免不了一点,录音!
前言:
我之前的文章中提到过alsa的arecord录制,录音时间固定,当程序运行一次后就会出现arecord资源被占用的情况,除非你把这个进程kill掉。然后事实上,你不可能每次运行完就手动kill一次,那样太麻烦了。
后来我用pyaudio,完美解决了上述的问题。直到今天,我遇到了语音活性检测VAD···
科普来了~
语音活性检测 (Voice activity detection,VAD), 也称为 speech activity detection or speech detection, 是一项用于语音处理的技术,目的是检测语音信号是否存在。VAD技术主要用于语音编码和语音识别。
在本篇文章中用到的是WebRTC之VAD算法。
其主要功能:
- 自动打断
- 去掉语音中的静音成分
- 获取输入语音中有效语音
- 去除噪声,对语音进行增强
# coding=utf-8
import webrtcvad # 检测判断一组语音数据是否为空语音;
import collections
import sys
import signal
import pyaudio # 从设备节点读取原始音频流数据,音频编码是PCM格式
from array import array
from struct import pack
import wave
import time
import os
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK_DURATION_MS = 30 # //检验音频帧长度,只支持10/20/30ms
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
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)), *
109



被折叠的 条评论
为什么被折叠?



