2201_76139068 2023-09-15 09:45 采纳率: 100%
浏览 24
已结题

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

  • 写回答

9条回答 默认 最新

  • cjh4312 2023-09-15 11:17
    关注

    得加个录音线程

    
    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("没有检测到有声音的音频帧")
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 9月23日
  • 已采纳回答 9月15日
  • 创建了问题 9月15日

悬赏问题

  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop