You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pydub为按键序列添加幅度调整与淡入淡出,让音频更自然?

让Pydub生成的按键音频更贴近真实效果

我编写了一个检测键盘按键并通过Pydub生成音频文件的程序。在Audacity中对比手机录制的真实按键音频与程序生成的音频时,明显发现前者在较长的按键序列中存在幅度峰值以及淡入淡出效果,但生成的音频没有此效果。请问是否可以通过Pydub检测并调整按键序列的幅度,让生成的音频听起来更自然?

现有代码

主程序代码

def getTimestamp():
  return round(time.time()*1000)

if __name__ == "__main__":
  recording = {}
  start, stop = (0, 0)
  running = False
  while True:
    if keyboard.is_pressed("f10"):
      start = getTimestamp()
      print("Recording...")
      running = True
    if keyboard.is_pressed("f12"):
      stop = getTimestamp()
      print("Stopped recording!")
      break
    if running:
      current_time = getTimestamp() - start
      recording[current_time] = keyboard.read_key()
  # 创建音频文件
  createSound("./test.wav", start, stop, recording)
  print("Done!")

createSound函数代码

from pydub import AudioSegment

def createSound(filename, start, stop, recording):
  # 创建空音轨
  track = AudioSegment.silent(duration=(stop-start))
  for timestamp, key in recording.items():
    keypress = AudioSegment.from_file("./click.wav")
    # 将按键音叠加到音轨
    track = track.overlay(keypress, position=int(timestamp))
  # 导出音频文件
  track.export(filename, format="wav")

解决方案:添加淡入淡出与动态音量调整

当然可以实现,通过Pydub的内置方法就能模拟真实按键的音量变化特性,具体修改如下:

修改后的createSound函数

from pydub import AudioSegment
import random

def createSound(filename, start, stop, recording):
    # 创建空音轨
    track = AudioSegment.silent(duration=(stop-start))
    # 预设参数:可根据实际按键声音调整
    base_volume = 0  # 基础音量(0为原音频音量,单位dB)
    fade_in_ms = 10  # 淡入时长,模拟按键按下的过程
    fade_out_ms = 20  # 淡出时长,模拟按键释放的过程
    last_press_time = -1000  # 记录上一次按键时间,初始值设为更早时间

    # 按时间顺序处理按键(字典遍历顺序不固定,必须排序)
    for timestamp, key in sorted(recording.items(), key=lambda x: int(x[0])):
        keypress = AudioSegment.from_file("./click.wav")
        
        # 1. 添加淡入淡出效果
        keypress = keypress.fade_in(fade_in_ms).fade_out(fade_out_ms)
        
        # 2. 根据按键间隔动态调整音量
        time_gap = int(timestamp) - last_press_time
        # 连续快速按键时(间隔<50ms),降低音量模拟真实按压的力度变化
        if time_gap < 50:
            adjusted_volume = base_volume - 3
        else:
            adjusted_volume = base_volume
        keypress = keypress + adjusted_volume
        
        # 3. 随机添加幅度峰值,模拟真实按键的力度波动
        if random.random() < 0.1:  # 10%概率出现音量峰值
            keypress = keypress + 2
        
        # 叠加到音轨
        track = track.overlay(keypress, position=int(timestamp))
        
        # 更新上一次按键时间
        last_press_time = int(timestamp)
    
    # 导出最终音频
    track.export(filename, format="wav")

关键修改说明

  • 淡入淡出效果:通过fade_in()和fade_out()模拟真实按键从按压到释放的音量渐变,避免音频突然出现或消失,让声音更自然。
  • 动态音量调整:连续快速按键时,手指的按压连贯性会导致音量略有降低,通过判断按键间隔调整音量,模拟这种真实场景下的幅度变化。
  • 随机幅度峰值:通过随机函数给部分按键增加音量,模拟真实按键时偶尔出现的力度峰值。
  • 按键排序:原代码中字典的遍历顺序不固定,添加sorted()确保按键按时间顺序处理,避免音频叠加顺序错误。

内容的提问来源于stack exchange,提问作者Habebit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:31:03