使用pyaudio播放的声音似乎正确,但太短

2024-10-02 04:35:30 发布

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

我正在制作一个小程序来传递一个简单的调幅正弦声音。这种声音被称为ASSR,代表听觉稳态反应,这是一种可复制的大脑活动反应。我选择使用pyaudio,但它的文档记录非常差。如果您知道其他库可以播放numpy阵列/声音,我正在听;)

发出的声音是1000 Hz载波正弦声音,振幅调制为40 Hz。我的问题如下:当我用pyaudio播放声音时它不会持续1秒。它仅持续约500毫秒。然而,阵列.signal的长度为44100个元素,采样频率为44100 Hz。此外,如果我用scipy将数组保存到一个.wav文件中,我会得到一个1s的录音,它的声音与pyaudio提供的500毫秒的声音完全相同

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pyaudio
import numpy as np
from scipy.io.wavfile import write

class Sound:
    def __init__(self, fs=44100, duration=1.0):
        self.fs = int(fs)
        self.duration = duration
        self.t = np.linspace(0, duration, int(duration*fs), endpoint=False)
        self.signal = None
    
    def play(self):
        p = pyaudio.PyAudio()
        stream = p.open(format=pyaudio.paFloat32,
                        channels=1,
                        rate=self.fs,
                        output=True)
        try:
            stream.write(self.signal)
        except:
            raise
        finally:
            stream.stop_stream()
            stream.close()
        p.terminate()
        
    def write(self, fname):
        data = np.int16(self.signal/np.max(np.abs(self.signal)) * 32767) # Scale
        write(fname, self.fs, data)
    
class ASSR(Sound):
    def __init__(self, fc, fm, fs=44100, duration=1.0):
        super().__init__(fs, duration)
        self.fc = fc
        self.fm = fm
    
    def classical_AM(self):
        self.assr_amplitude = (1-np.sin(2*np.pi*self.fm*self.t))
        self.signal = self.assr_amplitude * np.sin(2*np.pi*self.fc*self.t)
        self.signal = self.signal / np.max(self.signal) # Nomalized in [-1, 1]
        self.signal = self.signal.astype(np.float32)
        
if __name__ == '__main__':
    sound = ASSR(fc=1000, fm=40)
    sound.classical_AM()
    sound.play()

你可以在上面找到一个极简复制的例子。我的代码有点长,因为我实现了一些错误检查和一些声音的替代方程


Tags: importself声音streamsignaldefnpfs
1条回答
网友
1楼 · 发布于 2024-10-02 04:35:30

我认为解决方案是将信号数组转换为字节

stream.write(signal.tobytes())

如果有人对此有文档/解释,以建立对此修复的更多信心,请添加它

相关问题 更多 >

    热门问题