Python初学者,导师要求完成一个项目,能够监测声音,并输出程序运行时检测到的有声音部分的文件。用gpt也调了,永远显示没有检测到音频,该如何修改代码呢,谢谢各位了
import pyaudio
import numpy as np
import soundfile as sf
# 参数设置
CHUNK_SIZE = 1024 # 音频帧的大小
FORMAT = pyaudio.paInt16 # 采样格式为16位整数
CHANNELS = 1 # 单声道
RATE = 44100 # 采样率
# 初始化 PyAudio
p = pyaudio.PyAudio()
# 打开音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK_SIZE)
# 计算瞬时能量函数
def compute_energy(data):
return np.sum(data ** 2) / len(data)
# 设置能量阈值
threshold = 0.001
# 保存音频的相关设置
output_filename = 'C:/Users/周佳/Desktop/output_audio.wav'
output_frames = []
# 开始读取音频流
stream.start_stream()
print("开始录音...")
# 控制录音结束
input("按 Enter 停止录音:")
# 停止读取音频流
stream.stop_stream()
stream.close()
p.terminate()
print("录音结束,保存音频...")
# 将有声音的部分保存到output_frames中
try:
while True:
audio_data = np.frombuffer(stream.read(CHUNK_SIZE), dtype=np.int16)
# 计算能量
energy = compute_energy(audio_data)
# 如果能量超过阈值,表示有声音
if energy > threshold:
# 将有声音的部分保存到output_frames中
output_frames.append(np.copy(audio_data)) # 使用np.copy()复制音频帧数据
except OSError:
pass
# 将output_frames转换为一维数组
if len(output_frames) > 0:
output_data = np.concatenate(output_frames)
# 保存output_data为音频文件
sf.write(output_filename, output_data, RATE)
print("音频保存成功:", output_filename)
else:
print("没有检测到有声音的音频帧")
得加个录音线程
import pyaudio
import numpy as np
import soundfile as sf
import threading
# 参数设置
CHUNK_SIZE = 1024 # 音频帧的大小
FORMAT = pyaudio.paInt16 # 采样格式为16位整数
CHANNELS = 1 # 单声道
RATE = 44100 # 采样率
# 初始化 PyAudio
p = pyaudio.PyAudio()
# 打开音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK_SIZE)
# 计算瞬时能量函数
def compute_energy(data):
return np.sum(data ** 2) / len(data)
# 设置能量阈值
threshold = 0.001
# 保存音频的相关设置
output_filename = 'e:/output_audio.wav'
output_frames = []
# 用于标识录音是否终止的变量
recording = True
# 录音线程
def record_audio():
while recording:
audio_data = np.frombuffer(stream.read(CHUNK_SIZE), dtype=np.int16)
# 计算能量
energy = compute_energy(audio_data)
# 如果能量超过阈值,表示有声音
if energy > threshold:
output_frames.append(audio_data)
# 启动录音线程
recording_thread = threading.Thread(target=record_audio)
recording_thread.start()
print("开始录音...")
# 控制录音结束
input("按 Enter 停止录音:")
recording = False
# 停止读取音频流
stream.stop_stream()
stream.close()
p.terminate()
print("录音结束,保存音频...")
# 将output_frames转换为一维数组
if len(output_frames) > 0:
output_data = np.concatenate(output_frames)
# 保存output_data为音频文件
sf.write(output_filename, output_data, RATE)
print("音频保存成功:", output_filename)
else:
print("没有检测到有声音的音频帧")
引用 皆我百晓生 小程序回复内容作答:
可以尝试修改代码如下:
import pyaudio
import numpy as np
import soundfile as sf
# 参数设置
CHUNK_SIZE = 1024 # 音频帧的大小
FORMAT = pyaudio.paInt16 # 采样格式为16位整数
CHANNELS = 1 # 单声道
RATE = 44100 # 采样率
# 初始化 PyAudio
p = pyaudio.PyAudio()
# 打开音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK_SIZE)
# 计算瞬时能量函数
def compute_energy(data):
return np.sum(data ** 2) / len(data)
# 设置能量阈值
threshold = 0.001
# 保存音频的相关设置
output_filename = 'output_audio.wav'
output_frames = []
# 控制录音结束
is_recording = False
def callback(in_data, frame_count, time_info, status):
audio_data = np.frombuffer(in_data, dtype=np.int16)
energy = compute_energy(audio_data)
if energy > threshold:
output_frames.append(np.copy(audio_data))
is_recording = True
else:
if is_recording:
is_recording = False
sf.write(output_filename, np.concatenate(output_frames), RATE)
output_frames.clear()
return None, pyaudio.paContinue
# 开始读取音频流
stream.start_stream()
print("开始录音...")
# 创建回调函数来处理音频流
stream.set_callback(callback)
# 控制录音结束
input("按 Enter 停止录音:")
# 停止读取音频流
stream.stop_stream()
stream.close()
p.terminate()
print("录音结束,保存音频...")
其中,我们使用了一个callback
回调函数来处理音频流,每次读取一帧音频数据时都会调用这个回调函数。在回调函数中,我们计算了音频数据的能量,并根据能量是否超过阈值来判断是否有声音。如果有声音,则将这部分音频数据保存到output_frames
中,如果没有声音并且之前有保存过有声音的音频数据,则将output_frames
中的音频数据保存到文件,并清空output_frames
。
这样就可以实时检测声音并且最后输出只包含有声音部分的文件。记得修改output_filename
为你希望保存的文件路径。
问题点:没有检测到音频
分析思路: 由于该代码在流程上分两部分,一个部分是录音,一个部分是过滤音频.最好拆分进行.
需要确认哪个环节出的问题,才好针对性解决问题.
需要确认录音部分可以正常进行,再去分析过滤音频的环节是否正常.
你再试试
import pyaudio
import numpy as np
import soundfile as sf
import time
# 参数设置
CHUNK_SIZE = 1024 # 音频帧的大小
FORMAT = pyaudio.paInt16 # 采样格式为16位整数
CHANNELS = 1 # 单声道
RATE = 44100 # 采样率
# 初始化 PyAudio
p = pyaudio.PyAudio()
# 打开音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK_SIZE)
# 计算瞬时能量函数
def compute_energy(data):
return np.sum(data ** 2) / len(data)
# 设置能量阈值
threshold = 0.001
# 保存音频的相关设置
output_filename = 'output_audio.wav'
output_frames = []
# 开始读取音频流
stream.start_stream()
print("开始录音...")
# 记录声音开始时间
sound_start_time = None
# 持续监测声音
try:
while True:
audio_data = np.frombuffer(stream.read(CHUNK_SIZE), dtype=np.int16)
# 计算能量
energy = compute_energy(audio_data)
# 如果能量超过阈值,表示有声音
if energy > threshold:
if sound_start_time is None:
sound_start_time = time.time()
# 将有声音的部分保存到output_frames中
output_frames.append(np.copy(audio_data)) # 使用np.copy()复制音频帧数据
else:
# 如果没有声音,但之前有声音,说明声音结束,保存音频
if sound_start_time is not None:
sound_end_time = time.time()
if sound_end_time - sound_start_time >= 1.0: # 如果持续时间超过1秒,保存音频
if len(output_frames) > 0:
output_data = np.concatenate(output_frames)
# 保存output_data为音频文件
sf.write(output_filename, output_data, RATE)
print("音频保存成功:", output_filename)
else:
print("没有检测到有声音的音频帧")
sound_start_time = None
except KeyboardInterrupt:
pass
# 停止读取音频流
stream.stop_stream()
stream.close()
p.terminate()
print("录音结束")
为什么你开始和录音结束,直接并没有任何代码?这能录音才怪呢
【以下回答由 GPT 生成】
import pyaudio
import numpy as np
import soundfile as sf
# 参数设置
CHUNK_SIZE = 1024 # 音频帧的大小
FORMAT = pyaudio.paInt16 # 采样格式为16位整数
CHANNELS = 1 # 单声道
RATE = 44100 # 采样率
# 初始化 PyAudio
p = pyaudio.PyAudio()
# 打开音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK_SIZE)
# 计算瞬时能量函数
def compute_energy(data):
return np.sum(data ** 2) / len(data)
# 设置能量阈值
threshold = 0.001
# 保存音频的相关设置
output_filename = 'C:/Users/周佳/Desktop/output_audio.wav'
output_frames = []
# 开始读取音频流
stream.start_stream()
print("开始录音...")
# 控制录音结束
input("按 Enter 停止录音:")
# 停止读取音频流
stream.stop_stream()
stream.close()
p.terminate()
print("录音结束,保存音频...")
# 将有声音的部分保存到output_frames中
try:
while True:
audio_data = np.frombuffer(stream.read(CHUNK_SIZE), dtype=np.int16)
# 计算能量
energy = compute_energy(audio_data)
# 如果能量超过阈值,表示有声音
if energy > threshold:
# 将有声音的部分保存到output_frames中
output_frames.append(audio_data)
except OSError:
pass
# 将output_frames转换为一维数组
if len(output_frames) > 0:
output_data = np.concatenate(output_frames)
# 保存output_data为音频文件
sf.write(output_filename, output_data, RATE)
print("音频保存成功:", output_filename)
else:
print("没有检测到有声音的音频帧")
你可以尝试运行修改后的代码,看看是否能正确检测声音并保存有声音部分的文件。如果你有任何疑问,请随时提出。
【相关推荐】
援引讯飞星火:
首先,确保已经安装了pyaudio
和soundfile
库。如果没有安装,可以使用以下命令进行安装:
pip install pyaudio
pip install soundfile
接下来,将代码中的output_filename
修改为你希望保存音频文件的路径。例如,将其更改为C:/Users/周佳/Desktop/output_audio.wav
。
然后,运行代码。程序将开始录音,直到你按下Enter键停止录音。录音结束后,程序将检测到的声音部分保存为音频文件。
如果仍然无法检测到声音,可以尝试调整CHUNK_SIZE
、FORMAT
、CHANNELS
和RATE
等参数,以获得更好的音频质量。
结合题主疑惑组合了需求,该回答引用ChatGPT,希望对题主有所帮助:
以下是代码程序实时检测声音直到程序终止,并且最后输出的文件只包含有声音的部分,不包含没声音的部分:
import pyaudio
import numpy as np
import soundfile as sf
# 参数设置
CHUNK_SIZE = 1024 # 音频帧的大小
FORMAT = pyaudio.paInt16 # 采样格式为16位整数
CHANNELS = 1 # 单声道
RATE = 44100 # 采样率
# 初始化 PyAudio
p = pyaudio.PyAudio()
# 打开音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK_SIZE)
# 计算瞬时能量函数
def compute_energy(data):
return np.sum(data ** 2) / len(data)
# 设置能量阈值
threshold = 0.001
# 保存音频的相关设置
output_filename = 'output_audio.wav'
output_frames = []
# 开始读取音频流
stream.start_stream()
try:
print("开始录音...")
while True:
audio_data = np.frombuffer(stream.read(CHUNK_SIZE), dtype=np.int16)
# 计算能量
energy = compute_energy(audio_data)
# 如果能量超过阈值,表示有声音
if energy > threshold:
# 将有声音的部分保存到output_frames中
output_frames.append(np.copy(audio_data)) # 使用np.copy()复制音频帧数据
except KeyboardInterrupt:
# 用户按下 Ctrl+C 终止程序时执行
print("程序终止")
finally:
# 停止读取音频流
stream.stop_stream()
stream.close()
p.terminate()
print("录音结束,保存音频...")
# 将output_frames转换为一维数组
if len(output_frames) > 0:
output_data = np.concatenate(output_frames)
# 保存output_data为音频文件
sf.write(output_filename, output_data, RATE)
print("音频保存成功:", output_filename)
else:
print("没有检测到有声音的音频帧")
注意,以上代码使用了 try-except-finally 块来确保程序能够正常地停止并关闭音频输入流。当用户按下 Ctrl+C 终止程序时,程序会执行 finally 块中的代码,关闭音频输入流。同时,输出的音频文件名为 output_audio.wav,并保存在当前目录下。若需要修改文件名或保存路径,请修改 output_filename 的值。
你的代码是没问题的,可以调整阈值再试试!!
以下回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在你提供的代码中,检测声音部分的逻辑看起来是正确的。然而,你遇到的问题可能是由于阈值的设定不准确导致的。阈值的选择应该基于你所使用的音频数据的特性和背景噪声水平。
你可以尝试根据实际情况调整阈值来检测到更多的声音。以下是一些可能的调整方法:
提高阈值:尝试增加阈值值,例如将threshold = 0.001
改为更大的值,如threshold = 0.01
。这将使算法更加严格,只检测到更高能量的声音。
降低阈值:尝试减小阈值值,例如将threshold = 0.001
改为更小的值,如threshold = 0.0001
。这将使算法更宽松,能够检测到更低能量的声音。
动态调整阈值:如果你的音频数据具有变化的背景噪声水平,你可以尝试动态调整阈值。例如,使用一个动态的阈值,基于先前音频帧的能量计算结果来自适应地更新阈值。
另外,确保你的麦克风和音频输入设置是正确的,并且你的系统正常工作。你可以尝试使用其他音频录制软件,如Audacity,来验证你的系统和麦克风是否正常工作。
希望这些调整能帮助你解决问题并成功检测到有声音的部分。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢