Воспроизведение звука на двух устройствах одновременно с использованием python библиотеки звукового устройства с использованием потоков - PullRequest
0 голосов
/ 23 января 2020

Я хочу написать скрипт, который будет воспроизводить звуки на двух устройствах одновременно, используя python, будет два звука: 1. Длинный звук (играет на динамике) 2. Короткий звук (играет на гарнитуре) оба должны воспроизводиться одновременно, но коротко звук имеет тенденцию воспроизводиться через некоторый интервал, который мы можем установить самостоятельно Я попытался сделать это с помощью библиотеки звуковых устройств, используя многопоточный подход. Сценарий приведен ниже. Проблема, с которой я сталкиваюсь, заключается в том, что при одновременном воспроизведении на двух устройствах возникает промежуток, возникающий при воспроизведении коротких звуков через интервал, но при одновременном воспроизведении двух звуков на одном Устройство результаты в порядке. Я хотел бы знать только подход или любой другой метод или решение этого подхода, для меня очень важно завершить его. Любая помощь будет очень полезна, и заранее спасибо

import threading
import time
import sounddevice as sd
import soundfile as sf 
import os

sound_folder = "C:\\Users\\HP\\Documents\\GitHub\\multi_sound_device\\Sound file"   #For getting file

def good_filepath(path):
    print(path,str(path).endswith(".wav") and (not str(path).startswith(".")))
    return str(path).endswith(".wav") and (not str(path).startswith("."))

sound_file_paths = [
    os.path.join(sound_folder, path) for path in sorted(filter(lambda path: good_filepath(path), os.listdir(sound_folder)))
]

#Above is to fetch sounds file

DATA_TYPE = "float32"
def load_sound_file_into_memory(path,dict_n):
    audio_data = sf.read(path,dtype=DATA_TYPE)
    file_name = path.split("\\")[-1].split('.')[0]
    dict_n[file_name] = audio_data
    return audio_data

dict_n = {}
file = [load_sound_file_into_memory(path,dict_n) for path in sound_file_paths]

long_sound,fs = dict_n['casio'][0],dict_n['casio'][1]
short_sound = dict_n['drum'][0]

def play_long_sound(long_sound,fs,snd):
    print('its_playing')
    snd.play(long_sound,fs,device = snd.query_devices(4)['name'])

def play_short_sound(short_sound,interval,fs,snd):
    while True:
        print("Played after",interval,":secs")
        stream = snd.OutputStream(device=snd.query_devices(7)['name'], samplerate=48000, dtype='float32')
        stream.start()
        stream.write(short_sound)
        stream.close()
        time.sleep(interval)

if __name__ == "__main__":
    long_t = threading.Thread(target = play_long_sound,args=(long_sound,fs,sd))
    short_t = threading.Thread(target = play_short_sound,args=(short_sound,9,fs,sd))
    long_t.start()
    short_t.start()
    long_t.join()
    short_t.join()
    print("exiting")
...