Pyaudio/Numpy串联音符仅仅扩展了前N个音符

2024-05-06 12:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pyaudio生成我自己的笔记,但是我遇到了一个初学者的错误。我可以生成纯sin-wav音调并按顺序播放它们,但是如果我尝试将它们串联起来,我不会连续播放三个音符,而是让原来的音符播放三次

import numpy as np
import pyaudio

def play_note(note):
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paFloat32,
                      channels=1,
                      rate=44100,
                      output=True)
    stream.write(np.asarray(note, dtype=np.float32))
    stream.stop_stream()
    stream.close()
    p.terminate()

sampling_rate = 44100
seconds = 1
x = np.arange(sampling_rate * seconds)

freqs = [440,660,880]

notes = []

for freq in freqs:
    note = 100*np.sin(2 * np.pi * freq * x /sampling_rate)
    notes.append(note)

# This is the behavior I want
for note in notes:
    play_note(note)

# I would expect this to behave similarly, but without the gaps. It doesn't.
note = np.concatenate(notes)
play_note(note)

Tags: importforplaystreamratenpsinnote
1条回答
网友
1楼 · 发布于 2024-05-06 12:42:29

我使用pyaudio0.2.11(在macos10.12.6上运行)得到了相同的结果。我可以通过将参数frames_per_buffer=1添加到p.open()num_frames=len(note)添加到stream.write()来修复它:

def play_note(note):
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paFloat32,
                      channels=1,
                      rate=44100,
                      output=True,
                      frames_per_buffer=1)
    stream.write(np.asarray(note, dtype=np.float32), num_frames=len(note))
    stream.stop_stream()
    stream.close()
    p.terminate()

我没有进一步的调查来回答为什么原始版本不起作用,或者为什么这个更改会修复它。也许一个pyaudio大师会给出一个更彻底的答案

相关问题 更多 >