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

如何在Python中根据每分钟心跳数(bpm)生成心跳音效?

实现按指定BPM播放心跳音效的Python函数

你的思路完全可行——用单段心跳MP3文件配合时间控制就能实现需求,以下是两种具体实现方案:

方案一:基于外部MP3音效文件

这是最直接的方式,只需准备一段单次心跳的短音频(比如仅包含“咚”的一声,时长建议0.1-0.3秒),然后通过Python控制播放间隔即可。

步骤1:安装依赖库

推荐用pygame处理音频播放,它跨平台且稳定:

pip install pygame

步骤2:实现函数

import pygame
import time

def play_heartbeat(bpm, audio_path="heartbeat_single.mp3"):
    # 初始化pygame音频模块
    pygame.mixer.init()
    # 加载心跳音频文件
    heartbeat_sound = pygame.mixer.Sound(audio_path)
    # 获取音频时长(秒)
    sound_duration = heartbeat_sound.get_length()
    
    # 计算两次心跳的间隔:总间隔=60秒/BPM - 音频自身时长
    interval = (60 / bpm) - sound_duration
    # 确保间隔不小于0(避免BPM过大导致负数)
    interval = max(interval, 0.01)
    
    try:
        while True:
            heartbeat_sound.play()
            time.sleep(interval)
    except KeyboardInterrupt:
        # 按下Ctrl+C停止播放
        pygame.mixer.quit()
        print("心跳播放已停止")

# 调用示例:每分钟62次心跳
play_heartbeat(62)

注意事项

  • 确保audio_path指向你的单次心跳MP3文件,若文件和脚本同目录,直接写文件名即可
  • 如果用playsound库替代pygame,注意它是阻塞式播放(播放完才会执行下一行代码),此时间隔直接用60/bpm即可,但playsound在部分平台可能有兼容性问题

方案二:直接生成心跳音效(无需外部文件)

如果不想依赖外部音频文件,可以用numpy生成心跳波形,再通过simpleaudio播放:

步骤1:安装依赖库

pip install numpy simpleaudio

步骤2:实现函数

import numpy as np
import simpleaudio as sa
import time

def generate_and_play_heartbeat(bpm):
    # 设置采样率和心跳音效参数
    sample_rate = 44100
    # 生成类似心跳的脉冲音效:短时间的高频脉冲+低频震动
    t_pulse = np.linspace(0, 0.1, int(sample_rate * 0.1), False)
    pulse = np.sin(2 * np.pi * 200 * t_pulse) * np.exp(-t_pulse * 30)  # 高频脉冲
    low_freq = np.sin(2 * np.pi * 50 * t_pulse) * 0.3  # 低频震动
    heartbeat_wave = (pulse + low_freq) * 0.5
    # 转换为16位整数格式(simpleaudio要求的格式)
    audio_data = (heartbeat_wave * 32767).astype(np.int16)
    # 创建音频播放对象
    play_obj = sa.play_buffer(audio_data, 1, 2, sample_rate)
    
    # 计算间隔时间
    interval = 60 / bpm - 0.1  # 减去音效时长0.1秒
    interval = max(interval, 0.01)
    
    try:
        while True:
            play_obj.wait_done()  # 等待当前音效播放完毕
            time.sleep(interval)
            play_obj = sa.play_buffer(audio_data, 1, 2, sample_rate)
    except KeyboardInterrupt:
        play_obj.stop()
        print("心跳播放已停止")

# 调用示例
generate_and_play_heartbeat(62)

两种方案都能精准控制BPM:方案一适合需要真实心跳音效的场景,方案二无需额外文件,适合轻量化需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:25:25