python声音捕获_使用Python检测和录制音频

news/2024/7/5 5:50:41

感谢cryo的改进版本,我基于下面的测试代码:

#Instead of adding silence at start and end of recording (values=0) I add the original audio . This makes audio sound more natural as volume is >0. See trim()

#I also fixed issue with the previous code - accumulated silence counter needs to be cleared once recording is resumed.

from array import array

from struct import pack

from sys import byteorder

import copy

import pyaudio

import wave

THRESHOLD = 500  # audio levels not normalised.

CHUNK_SIZE = 1024

SILENT_CHUNKS = 3 * 44100 / 1024  # about 3sec

FORMAT = pyaudio.paInt16

FRAME_MAX_VALUE = 2 ** 15 - 1

NORMALIZE_MINUS_ONE_dB = 10 ** (-1.0 / 20)

RATE = 44100

CHANNELS = 1

TRIM_APPEND = RATE / 4

def is_silent(data_chunk):

"""Returns 'True' if below the 'silent' threshold"""

return max(data_chunk) < THRESHOLD

def normalize(data_all):

"""Amplify the volume out to max -1dB"""

# MAXIMUM = 16384

normalize_factor = (float(NORMALIZE_MINUS_ONE_dB * FRAME_MAX_VALUE)

/ max(abs(i) for i in data_all))

r = array('h')

for i in data_all:

r.append(int(i * normalize_factor))

return r

def trim(data_all):

_from = 0

_to = len(data_all) - 1

for i, b in enumerate(data_all):

if abs(b) > THRESHOLD:

_from = max(0, i - TRIM_APPEND)

break

for i, b in enumerate(reversed(data_all)):

if abs(b) > THRESHOLD:

_to = min(len(data_all) - 1, len(data_all) - 1 - i + TRIM_APPEND)

break

return copy.deepcopy(data_all[_from:(_to + 1)])

def record():

"""Record a word or words from the microphone and

return the data as an array of signed shorts."""

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, output=True, frames_per_buffer=CHUNK_SIZE)

silent_chunks = 0

audio_started = False

data_all = array('h')

while True:

# little endian, signed short

data_chunk = array('h', stream.read(CHUNK_SIZE))

if byteorder == 'big':

data_chunk.byteswap()

data_all.extend(data_chunk)

silent = is_silent(data_chunk)

if audio_started:

if silent:

silent_chunks += 1

if silent_chunks > SILENT_CHUNKS:

break

else:

silent_chunks = 0

elif not silent:

audio_started = True

sample_width = p.get_sample_size(FORMAT)

stream.stop_stream()

stream.close()

p.terminate()

data_all = trim(data_all)  # we trim before normalize as threshhold applies to un-normalized wave (as well as is_silent() function)

data_all = normalize(data_all)

return sample_width, data_all

def record_to_file(path):

"Records from the microphone and outputs the resulting data to 'path'"

sample_width, data = record()

data = pack('

wave_file = wave.open(path, 'wb')

wave_file.setnchannels(CHANNELS)

wave_file.setsampwidth(sample_width)

wave_file.setframerate(RATE)

wave_file.writeframes(data)

wave_file.close()

if __name__ == '__main__':

print("Wait in silence to begin recording; wait in silence to terminate")

record_to_file('demo.wav')

print("done - result written to demo.wav")


http://www.niftyadmin.cn/n/612071.html

相关文章

linux下解包bin二进制文件_linux下如何使用docker二进制文件安装

原标题&#xff1a;linux下如何使用docker二进制文件安装1,下载二进制文件https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.tgz2,解压二进制文件tar xzvf docker-18.03.1-ce.tgz3,复制二进制文件到/usr/bin目录下cp docker/* /usr/bin/4,检查是否安…

从富文本中截取图片_搞来了一款科研神器OCR文本识别翻译神器

removing barriers on the way of knowledge---摘自sci-hub的首页知识无国界&#xff0c;希望也不再用于套路今天小编发现了一款可以OCR文本识别&#xff0c;同时自动翻译的科研神器&#xff0c;分分钟搞定PDF文本识别、sci论文翻译&#xff0c;用起来特别6(注意这个软件杀毒软…

交叉表示例

假设有张学生成绩表(CJ)如下 [姓名] [学科] [成绩] 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 82 王五 数学 60 想变成 [姓名] [语文] [数学] [物理] 张三 80 90 85 李四 85 92 82 王五 null 60 null declare sql varchar(4000) set sql s…

佳能g2810打印机扫描怎么用_佳能激光打印机怎么样 佳能激光打印机多少钱【详解】...

佳能激光打印机在我们的工作中提供了便捷&#xff0c;而且能够快速的打印出用户们想要的图像和资料内容&#xff0c;所以很多人选择购买该品牌打印机。可是佳能激光打印机 怎么样 呢&#xff1f;我们在选择佳能打印机的时候要注意&#xff0c;应该如何更好的选择&#xff0c…

电池pack结构_动力电池成本结构分析

导读&#xff1a;新能源车的发展既有赖于政策的推动&#xff0c;也需要动力电池持续降本的支持&#xff0c;本周专题我们研究了动力电池的成本结构。我们在动力电池成 本模型里将 PACK 成本拆分成材料成本和生产成本&#xff0c;其中材料成本又包括电芯材料、模组材料及 PACK 材…

内核aio_理解 Java 三种IO模型 BIO/ NIO/ AIO,面试必考问题!

↑ 点击上面 “时代Java”关注我们&#xff0c;关注新技术&#xff0c;学习新知识&#xff01;Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候&#xff0c;不需要关心操作系统层面的知识&#xff0c;也不需要根据不…

90土壤分类中英文_彩虹之花——鸢尾的园艺分类及应用

引言&#xff1a;古希腊语中“鸢尾”一词意为彩虹&#xff0c;与美丽的自然现象相比&#xff0c;鸢尾花朵的色彩则更加丰富。鸢尾因花美丽和香气独特而受赞赏&#xff0c;鸢尾根提取物可用于香水&#xff0c;葡萄酒&#xff0c;伏特加酒和糖果的生产。全世界鸢尾的种类超过六万…

公众号滑动图代码_微信公众号图文中的图片如何实现上下左右的滑动效果?

大家先看图&#xff0c;这是一张滑动效果的图片&#xff0c;这个样式放到微信图文里面&#xff0c;可以上下滑动&#xff0c;也可以左右滑动。(左右滑动样式)(上下滑动样式)我们在做微信排版的时候&#xff0c;可以用到这个样式&#xff0c;不仅好看而且能节省很多空间&#xf…