微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在任何一个频道中播放提示音而又不影响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 举报,一经查实,本站将立刻删除。