前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Python的自动录音功能程序开发

基于Python的自动录音功能程序开发

原创
作者头像
和泉纱雾
发布2024-09-18 21:55:27
971
发布2024-09-18 21:55:27

本想在猪八戒里面提交一下的。但是经验不够,提交不了。算了就发在这了。哎我也是借助了ai

代码语言:javascript
复制
import pyaudio
import wave
import numpy as np
import time

# 音频参数设置
CHUNK = 1024  # 每次读取的帧数
FORMAT = pyaudio.paInt16  # 采样格式
CHANNELS = 1  # 单声道
RATE = 16000  # 采样率
THRESHOLD = 500  # 声音阈值,根据实际情况调整
SILENCE_THRESHOLD = 0.8  # 持续静音时间比例
SILENCE_CHUNKS = int(RATE / CHUNK * SILENCE_THRESHOLD)  # 连续多少帧无声则认为结束说话
MIN_RECORD_SECONDS = 1  # 最小录音时长(秒)
RECORDING_FILE = "output.wav"  # 输出文件名

# 初始化 PyAudio 对象
p = pyaudio.PyAudio()

# 打开数据流
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)


def is_silent(data):
    """检查是否为静音"""
    return np.max(np.frombuffer(data, dtype=np.int16)) < THRESHOLD


def record_audio(stream, filename):
    """录音并保存为 WAV 文件"""
    print("开始录音...")
    frames = []
    silent_count = 0
    start_time = time.time()
    try:
        while True:
            data = stream.read(CHUNK)
            if is_silent(data):
                silent_count += 1
                if silent_count > SILENCE_CHUNKS:
                    break
            else:
                silent_count = 0
            frames.append(data)
    except KeyboardInterrupt:
        print("录音被中断")
    finally:
        end_time = time.time()
        elapsed_time = end_time - start_time
        if elapsed_time >= MIN_RECORD_SECONDS and frames:
            # 保存录音文件
            with wave.open(filename, 'wb') as wf:
                wf.setnchannels(CHANNELS)
                wf.setsampwidth(p.get_sample_size(FORMAT))
                wf.setframerate(RATE)
                wf.writeframes(b''.join(frames))
            print(f"录音结束,文件已保存至 {filename}")
        else:
            print("录音时间过短,未保存文件")


# 主循环
try:
    counter = 1
    while True:
        # 检测到声音时开始录音
        while not is_silent(stream.read(CHUNK)):
            time.sleep(0.1)  # 短暂休眠,避免 CPU 占用过高

        # 开始录音
        record_audio(stream, f"output_{counter}.wav")

        # 增加一些延迟,避免频繁触发录音
        time.sleep(2)  # 增加一些延迟,避免频繁触发录音

        counter += 1
except KeyboardInterrupt:
    print("程序被中断")
finally:
    stream.stop_stream()
    stream.close()
    p.terminate()
    print("资源已释放")

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档