Python初学者实在是不会调这段代码,看看吧,一杯奶茶钱

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("没有检测到有声音的音频帧")

你可以尝试运行修改后的代码,看看是否能正确检测声音并保存有声音部分的文件。如果你有任何疑问,请随时提出。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

援引讯飞星火:
首先,确保已经安装了pyaudiosoundfile库。如果没有安装,可以使用以下命令进行安装:

pip install pyaudio
pip install soundfile

接下来,将代码中的output_filename修改为你希望保存音频文件的路径。例如,将其更改为C:/Users/周佳/Desktop/output_audio.wav

然后,运行代码。程序将开始录音,直到你按下Enter键停止录音。录音结束后,程序将检测到的声音部分保存为音频文件。

如果仍然无法检测到声音,可以尝试调整CHUNK_SIZEFORMATCHANNELSRATE等参数,以获得更好的音频质量。

结合题主疑惑组合了需求,该回答引用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ᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

在你提供的代码中,检测声音部分的逻辑看起来是正确的。然而,你遇到的问题可能是由于阈值的设定不准确导致的。阈值的选择应该基于你所使用的音频数据的特性和背景噪声水平。

你可以尝试根据实际情况调整阈值来检测到更多的声音。以下是一些可能的调整方法:

  1. 提高阈值:尝试增加阈值值,例如将threshold = 0.001改为更大的值,如threshold = 0.01。这将使算法更加严格,只检测到更高能量的声音。

  2. 降低阈值:尝试减小阈值值,例如将threshold = 0.001改为更小的值,如threshold = 0.0001。这将使算法更宽松,能够检测到更低能量的声音。

  3. 动态调整阈值:如果你的音频数据具有变化的背景噪声水平,你可以尝试动态调整阈值。例如,使用一个动态的阈值,基于先前音频帧的能量计算结果来自适应地更新阈值。

另外,确保你的麦克风和音频输入设置是正确的,并且你的系统正常工作。你可以尝试使用其他音频录制软件,如Audacity,来验证你的系统和麦克风是否正常工作。

希望这些调整能帮助你解决问题并成功检测到有声音的部分。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢