python信号端点检测_python的webrtc库实现语音端点检测

2023-11-09

引言

语音端点检测最早应用于电话传输和检测系统当中,用于通信信道的时间分配,提高传输线路的利用效率.端点检测属于语音处理系统的前端操作,在语音检测领域意义重大.

但是目前的语音端点检测,尤其是检测 人声 开始和结束的端点始终是属于技术难点,各家公司始终处于 能判断,但是不敢保证 判别准确性 的阶段.

现在基于云端语义库的聊天机器人层出不穷,其中最著名的当属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('

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

欢迎拍砖

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python信号端点检测_python的webrtc库实现语音端点检测 的相关文章

  • 小白数学建模模型入门(二)

    数学建模模型入门 二 1 图论模型 Dijkstra算法 应用于求初始点到其他所有顶点的最短路径 本质是一种标号法 给赋权图的每一个顶点记一个数 称为顶点的标号 临时标号 称T标号 固定标号 称为P标号 T标号表示从始顶点到该标点的最短路长
  • The last packet sent successfully to the server was 0 milliseconds ago

    今天在弄数据库迁移及部署到客户服务器时 发现启动成功了 但是数据请求超时 赶紧打开日志看一下 报了这样的错 The last packet sent successfully to the server was 0 milliseconds
  • &和&&的区别(单与和双与的区别)

    和 都可以用作逻辑与的运算符 为短路与 不是短路与 可以作为整数的位运算符 举两个例子 1 对于if str null str equals 这个表达式 当str null 时 后面的表达式就不会执行 也不会出现NullPointerExc
  • 跨平台编程开发工具Xojo 2023 Release mac中文版功能介绍

    Xojo mac是一款跨平台的软件开发工具 它允许开发人员使用一种编程语言来创建应用程序 然后可以在多个操作系统上运行 Xojo 2023是Xojo开发工具的最新版本 它提供了许多功能和改进 以帮助开发人员更轻松地构建高质量的应用程序 Xo
  • 转载super resolution 超分辨率 的一些论文和代码

    1 CVPR 2019 神奇的超分辨率算法DPSR 应对图像模糊降质 code 2 从SRCNN到EDSR 总结深度学习端到端超分辨率方法发展历程 3 超分辨率在人脸识别中的工业应用 商汤算法一骑绝尘 打造公安人脸识别智能核心 4 人脸超分
  • linux开放端口命令tcp,linux开放端口命令

    linux系统中控制端口的开启与关闭可以由命令来执行 下面由学习啦小编为大家整理了linux下开放端口命令的相关知识 希望对大家有所帮助 linux开放端口命令1 打开指定端口 sbin iptables I INPUT p tcp dpo
  • 数据、常量和变量 2014-3-19总结

    今天学习了数据 常量和变量 一 数据 数据分为两种 静态数据和动态数据 1 静态数据 1 概念 静态数据是指一些永久性的数据 硬盘内存比较大 所以一般的存储在硬盘中 2 存储的时长 计算机关闭之后再开启 这些数据依旧还在 只要你不主动删掉或
  • Backtrader量化&回测11——策略信号Indicator

    对于程序来讲 该有的代码一行都不会少 但是把代码分块就可以很直观的阅读或修改代码 使用Indicator可以将策略的信号从策略类Strategy中脱离出来 方便策略进行协调与控制 文章目录 策略信号 示例代码 策略信号 官网中对于Indic
  • Pycharm 的使用技巧( 启动界面弹出Tips的内容翻译)

    Pycharm 启动界面弹出Tips的部分内容翻译 1 ctrl N 打开类的查找框 2 在拼写类的名字时可以用ctrl 空格来补充未写完的部分 活着弹出可选项 在两次点击ctrl 空格时 将在补充完类的拼写的同时自动添加导入该类的语句 3
  • 手撕boost/buck

    手撕Boost Boost公式推导及实验验证 手撕Buck Buck公式推导过程 Boost Boost的拓扑结构 在开关导通的时候 电感两端电压U Vi不变 电感量L也是常数 di dt U L 常数 电流随时间线性变化 如果我们规定电流
  • MySQL高级篇之视图

    视图 1 介绍 视图 View 是一种虚拟存在的表 视图中的数据并不在数据库中实际存在 行和列数据来自定义视图的查询中使用的表 并且是在使用视图时动态生成的 通俗的讲 视图只保存了查询的SQL逻辑 不保存查询结果 所以我们在创建视图的时候
  • IDEA创建mybatis的xml文件

    当我们用IDEA写项目写mybatis的mapper 直接去新建xml文件的时候发现没有这个选项 我们需要去创建一个xml的file模板 这样我们去新建的时候就很方便了 1 File gt Settings 2 Editor gt File
  • Opencv画图函数整理 及 cvCircle cvLine 只能画出黑白两种颜色问题 解决

    一句话 用这些画图函数在RGB图上画 则能画出来彩色 如果您在灰度图上画 则无论怎么设置color都只能画出黑白两种颜色 就这一句话搞了我一个晚上 惭愧 Opencv绘图函数 http www opencv org cn index php
  • C语言函数大全--h开头的函数

    h开头的函数或宏 1 hypot hypotf hypotl 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 HUGE VAL HUGE VALF HUGE VALL 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 ha
  • linux安装gitlab并修改gitlab默认端口号

    安装系统 centos 6 5 官网安装地址 https about gitlab com install centos 6 可以先根据官网安装步骤进行安装 分别执行以下命令 1 打开http访问和ssh访问 sudo yum instal
  • Premiere Pro 2022

    第1章 视频编辑的基础知识 1 1 视频编辑术语 帧 视频的基础单位 可以理解为一张静态图片就是一帧 关键帧 是素材中的特定帧 标记为进行特殊的编辑或其他操作 以便控制完成动画的流 回放或其他特性 帧速率 代表每秒播放帧的数量 单位是每秒多
  • 机器学习、计算机视觉和深度学习

    机器学习 计算机视觉和深度学习 1 什么是机器学习 2 机器学习的类型 3 什么是计算机视觉 4 计算机视觉的机器学习应用 5 总结 参考 这篇博客将简要介绍 机器学习和用于计算机视觉的机器学习 想象一下 你可以使用人脸检测算法在图像或视频
  • 为 Prometheus Node Exporter 加上认证

    这篇文章主要是为了庆祝 Node Exporter 终于迎来了 v1 0 0 版本 Prometheus https prometheus io 是最早由 SoundCloud 开源的监控告警解决方案 并已经成长为继 Kubernetes
  • W2NER详解

    论文 https arxiv org pdf 2112 10070 pdf 代码 https github com ljynlp W2NER 文章目录 W2NER 介绍 模型架构 解码 源码介绍 数据输入格式 模型代码 参考资料 W2NER

随机推荐

  • jvm学习笔记_简单了解jvm

    一 基本概念 JVM 是可运行 Java 代码的假想计算机 包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收 堆 和 一个存储方法域 JVM 是运行在操作系统之上的 它与硬件没有直接的交互 二 运行过程 我们都知道java源文件 通过
  • java调用天地图api获取地理信息

    目录 1 注册账号登录 2 创建应用 获取key 3 查看接口示例 4 调用接口 4 1地理编码查询 4 2逆地理编码查询 天地图网址 天地图API 1 注册账号登录 2 创建应用 获取key 3 查看接口示例 4 调用接口 4 1地理编码
  • ctfshow web入门 web14

    根据题目提示查看源代码 发现编辑器路径 在url中输入 editor得到 点击文件上传发现文件空间可能有内容 editor attached file var www html nothinghere fl000g txt 访问 fl000
  • WSL2安装图形化界面

    文章目录 安装图形化界面 安装图形化界面 由于WSL2 Ubuntu默认不安装图形化界面 所以需手动安装 apt get install xfce4 使用windows powershell 查看WSL使用的IP地址 ipconfig 进入
  • vant list加载 empty空状态

  • 时序预测

    时序预测 MATLAB实现基于均方误差节点搜索优化BP神经网络的时间序列预测 多指标评价 多节点计算 目录 时序预测 MATLAB实现基于均方误差节点搜索优化BP神经网络的时间序列预测 多指标评价 多节点计算 预测效果 基本介绍 模型描述
  • python协程

    协程是实现并发编程的一种方式 一说并发 你肯定想到了多线程 多进程模型 没错 多线程 多进程 正是解决并发问题的经典模型之一 最初的互联网世界 多线程 多进程在服务器并发中 起到举足轻重的作用 随着互联网的快速发展 你逐渐遇到了 C10K
  • aviator表达式教程

    Aviator是一个轻量级 高性能的Java表达式执行引擎 它动态地将表达式编译成字节码并运行 特性包括 支持绝大多数运算操作符 包括算术操作符 关系运算符 逻辑操作符 位运算符 正则匹配操作符 三元表达式 支持操作符优先级和括号强制设定优
  • 微信小程序开发前端基础知识

    文章目录 一 简介 1 是什么 2 为什么 二 准备工作 1 环境准备 1 1 注册账号 1 2 获取APPID 1 3 开发工具 2 创建微信小程序 三 组件 1 目录及其作用介绍 2 页面操作 3 view 块级元素 4
  • Oracle Calendar

    声明 本文为转载 如果有侵犯知识版本 请通知本人 本人将即刻停止侵权行为 参考网址 http code geekinterview com oracle oracle calendar sql html 1 SELECT Initcap T
  • ROS:bag数据包内容提取——雷达点云数据和imu数据

    通常在利用ros采集传感器数据时 我们会得到一个包含多个传感器数据的bag数据包 下面将会介绍从bag数据包提取雷达点云数据和imu数据的方法 系统版本 Ubuntu20 04 ROS版本 Noetic 先觉条件 查看bag数据包中雷达点云
  • Python爬虫从入门到精通:(17)协程_Python涛哥

    协程 本节的概念需要重点理解和实际操作 我们需要安装asynico库 pip install asyncio 学习之前我们先来看下这段代码 import time def get request url print 正在请求的url url
  • nginx---四层七层代理

    理论部分 所谓四层负载均衡 也就是主要通过报文中的目标地址和端口 再加上负载均衡设备设置的服务器选择方式 决定最终选择的内部服务器 它一般走的是tcp udp协议 所谓七层负载均衡 也称为 内容交换 也就是主要通过报文中的真正有意义的应用层
  • 2022年4月23日第十三届省赛蓝桥杯真题答案_python_第五题_统计未被污染的海域

    第五题如约而至哈 和第六题差不多 但比第六题简单 好 上题目 题目 有一片海域划分为N M个方格 其中有些海域已被污染 用0表示 有些海域没被污染 用1表示 请问这片N M海域中有几块是没被污染的独立海域 没被污染的独立海域是指该块海域上下
  • Obsidian流程图

    下载的obsidian进行安装时自动在C盘建立文件夹 但是该文件夹大小不大 关于在obsidian中安装插件 参考以下文章进行操作 https zhuanlan zhihu com p 403001135 我自己弄mermaid这个插件时
  • CSDN不再更新,后续文章在掘金发布

    掘金地址 方大可的主页
  • 用手机版python爬虫_Python爬虫也能用手机进行抓包?没错!这个技巧我只告诉你...

    今天要说说怎么在我们的手机抓包 我们知道了 HTTP 的请求方式 以及在 Chrome 中摸清了一些套路 但是 除了对数据进行解析之外 有时候我们想 对请求的数据或者响应的数据进行篡改 怎么做呢 我们经常在用的手机 手机里面的数据 怎么对它
  • Memcached 学习笔记(三)——多节点测试

    Memcached 学习笔记 三 多节点测试 一 启动两个 或者多个 节点 memcached d p 11212 u nobody c 1024 m 64 memcached d p 11213 u nobody c 1024 m 64
  • 跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist)

    跳跃列表 skipList 压缩列表 zipList 和快速列表 quicklist 都是Redis底层重要的数据结构 跳跃列表 skipList Redis使用跳跃表作为有序集合键的底层实现之一 通过在每个节点中维持多个指向其他节点的指针
  • python信号端点检测_python的webrtc库实现语音端点检测

    引言 语音端点检测最早应用于电话传输和检测系统当中 用于通信信道的时间分配 提高传输线路的利用效率 端点检测属于语音处理系统的前端操作 在语音检测领域意义重大 但是目前的语音端点检测 尤其是检测 人声 开始和结束的端点始终是属于技术难点 各