如何在任何一个频道中播放提示音而又不影响python?

问题描述

我想出了一个使用立体声进行导航的项目。例如向左转,它在左声道上发出更快的哔哔声,而在右声道上发出更低的哔哔声。

这是我的python代码

import simpleaudio as sa
import numpy as np
import time
import threading

# beep.play()
# beep.test()
# beep.stop()
# beep.setLR(distance)

class Beep:
    def __init__(self,freq = 3520.0,sample_rate = 48000,T = 0.05):
        self.freq = freq
        self.sample_rate = sample_rate
        self.T = T
        t = np.linspace(0,T,int(T * sample_rate),False)
        note = np.sin(freq * t * 2 * np.pi)
        audio = (note * 32767 / np.max(np.abs(note))).astype(np.int16)        
        audio_length = audio.shape[0]

        self.audio = [np.zeros((audio_length,2),dtype=np.int16),np.zeros((audio_length,dtype=np.int16)]

        self.audio[0][:,0] = audio
        self.audio[1][:,1] = audio

        self.__distance = (None,None)
        self.__threads = [None,None]
        self.__isPlaying = [False,False]

    def test(self):
        for _ in range(2):
            for i in range(2):
                play_obj = sa.play_buffer(self.audio[i],2,self.sample_rate)
                play_obj.wait_done()

            time.sleep(self.T*2)
    
    def __routine(self,isRight=0):
        while self.__isPlaying[isRight]:
            if type(self.__distance[isRight]) != type(None):
                play_obj = sa.play_buffer(self.audio[isRight],self.sample_rate)
                play_obj.wait_done()
                time.sleep(self.T * self.__distance[isRight])

    def setLR(self,distance):
        if len(distance) != 2:
            raise Exception('distance must be a pair of left and right distance')
        self.__distance = distance

    def play(self):
        self.__isPlaying = [True,True]
        for i in range(2):
            self.__threads[i] = threading.Thread(target=self.__routine,args=(i,))
            self.__threads[i].start()

    def stop(self):
        self.__isPlaying = [False,False]

但是在我的实现中,当一侧发出蜂鸣声而另一侧没有发出哔声时,声音会发生碰撞,而另一次发出的哔声会静音。听起来好像被切断了。

如何正确实施独立的侧面哔哔声,当同时(或几乎同时)播放时,不会打扰另一个通道?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)