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

IPython Audio:列表拼接和弦仅播放单段而非依次播放问题

问题分析与解决方案

问题原因

你当前的错误在于:added_sample += h是把多个和弦的音轨列表直接合并,比如H0有3个音轨、H7有3个音轨,合并后变成12个独立音轨,但每个音轨的时长还是2秒,所以播放器会同时播放这12个音轨,总时长仍为2秒——这是叠加音轨,不是按时间顺序播放和弦。

要实现依次播放,需要在时间维度上拼接每个和弦的音轨数据,而不是增加音轨数量。

修正后的代码实现

首先优化生成音频的逻辑,用numpy数组替代嵌套列表,更高效且方便拼接操作:

import IPython.display as ipd
import numpy as np

# 修正函数:用numpy.sin支持数组输入,避免循环生成列表
def f_k(f_0, k):
    return f_0 * 2 ** ((k % 12)/12)

def h_k(k, f0, t):
    return np.sin(2 * np.pi * f_k(f0, k) * t)

F = 44000
T = 2
f0 = 440
N = F * T
t = np.linspace(0, T, N)  # 提前生成时间数组,重复使用

# 生成各和弦的多轨数组(shape: [音轨数, 时间点数])
H0 = np.array([h_k(k, f0, t) for k in [0,4,7]])
H5 = np.array([h_k(k, f0, t) for k in [5,9,12]])
H7 = np.array([h_k(k, f0, t) for k in [7, 11, 14]])
H9 = np.array([h_k(k, f0, t) for k in [5,9,16]])

# 按时间维度拼接(axis=1对应时间轴)
added_sample = np.concatenate([H0, H7, H9, H5], axis=1)

# 播放总时长8秒的音频
ipd.Audio(added_sample, rate=F)

补充说明

如果需要将每个和弦的多轨混合成单轨后再依次播放,可以这样修改:

# 将每个和弦的多轨求和混合为单轨
H0_mono = H0.sum(axis=0)
H5_mono = H5.sum(axis=0)
H7_mono = H7.sum(axis=0)
H9_mono = H9.sum(axis=0)

# 拼接单轨音频
added_sample_mono = np.concatenate([H0_mono, H7_mono, H9_mono, H5_mono])
ipd.Audio(added_sample_mono, rate=F)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:55:16