在python中同时播放多个声音 [英] Play multiple sounds at the same time in python

查看:258
本文介绍了在python中同时播放多个声音的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究一种从样本列表中播放声音的方法,我发现一些可以做到这一点的模块.

I have been looking into a way to play sounds from a list of samples, and I found some modules that can do this.

我正在使用 AudioLazy 模块使用以下脚本播放声音:

I am using AudioLazy module to play the sound using the following script:

from audiolazy import AudioIO

sound = Somelist
with AudioIO(True) as player:
  player.play(sound, rate=44100)

此代码的问题在于,它会停止整个应用程序,直到声音停止播放为止,而我不能同时播放多个声音.

The problem with this code is that it stop the whole application till the sound stop playing and I can't play multiple sound at the same time.

我的程序是交互式的,所以我想要能够同时播放多个声音,例如,我可以运行此脚本,该脚本将播放5秒的声音,然后在第二秒播放5秒再次发出声音.

My program is interactive so what I want is to be able to play multiple sound at the same time,So for instance I can run this script which will play a 5 second sound then at the second 2 I can play a 5 second sound again.

我不希望整个程序在声音播放完毕之前停止播放.

And I don't want the whole program to stop till the sound finish playing.

推荐答案

这是使用 pydub .

使用AudioSegment模块的overlay功能,您可以很容易地superimpose多个音频相互连接.

Using overlay function of AudioSegment module, you can very easily superimpose multiple audio on to each other.

这里是一个工作代码,用于组合三个音频文件.使用相同的概念,您可以将多个音频彼此组合.

Here is a working code to combine three audio files. Using same concept you can combine multiple audio onto each other.

overlay函数的更多信息此处

pydub也支持多种音频格式.

pydub supports multiple audio formats as well.

from pydub import AudioSegment
from pydub.playback import play

audio1 = AudioSegment.from_file("chunk1.wav") #your first audio file
audio2 = AudioSegment.from_file("chunk2.wav") #your second audio file
audio3 = AudioSegment.from_file("chunk3.wav") #your third audio file

mixed = audio1.overlay(audio2)          #combine , superimpose audio files
mixed1  = mixed.overlay(audio3)          #Further combine , superimpose audio files
#If you need to save mixed file
mixed1.export("mixed.wav", format='wav') #export mixed  audio file
play(mixed1)                             #play mixed audio file


以下是根据我们的讨论进行的更新.
首先,我们创建44KHz信号并保存到sound.wav
下一步读取wave文件并将信号保存到文本文件
然后创建输入信号的三个变体以测试覆盖.
原始信号具有dtype int16
然后我们创建三个音频片段 然后按照上述方式混合/叠加. wav信号数据存储在test.txt


Here are updates as per our discussions.
First we create 44KHz signal and save to sound.wav
Next Read wave file and save signal to text file
Then create three variations of input signal to test overlay.
Original signal has dtype int16
Then we create three audio segments then mix/overlay as above. wav signal data is stored in test.txt

修改后的代码

import numpy as np
from scipy.io.wavfile import read
from pydub import AudioSegment
from pydub.playback import play
import wave, struct, math


#Create 44KHz signal and save to 'sound.wav'
sampleRate = 44100.0 # hertz
duration = 1.0       # seconds
frequency = 440.0    # hertz

wavef = wave.open('sound.wav','w')
wavef.setnchannels(1) # mono
wavef.setsampwidth(2) 
wavef.setframerate(sampleRate)

for i in range(int(duration * sampleRate)):
    value = int(32767.0*math.cos(frequency*math.pi*float(i)/float(sampleRate)))
    data = struct.pack('<h', value)
    wavef.writeframesraw( data )

wavef.writeframes('')
wavef.close()

#Read wave file and save signal to text file
rate, signal = read("sound.wav")

np.savetxt('test.txt', signal, delimiter=',')   # X is an array


#load wav data from text file
wavedata1 = np.loadtxt("test.txt", comments="#", delimiter=",", unpack=False, dtype=np.int16)

#Create variation of signal
wavedata2 = np.loadtxt("test.txt", comments="#", delimiter=",", unpack=False, dtype=np.int32)

#Create variation of signal
wavedata3 = np.loadtxt("test.txt", comments="#", delimiter=",", unpack=False, dtype=np.float16)

#create first audio segment
audio_segment1 = AudioSegment( 
    wavedata1.tobytes(), 
    frame_rate=rate,
    sample_width=2, 
    channels=1
)

#create second audio segment
audio_segment2 = AudioSegment( 
    wavedata2.tobytes(), 
    frame_rate=rate,
    sample_width=2, 
    channels=1
)

#create third audio segment
audio_segment3 = AudioSegment( 
    wavedata3.tobytes(), 
    frame_rate=rate,
    sample_width=2, 
    channels=1
)

# Play audio (requires ffplay, or pyaudio):
play(audio_segment1)
play(audio_segment2)
play(audio_segment3)

#Mix three audio segments
mixed1 = audio_segment1.overlay(audio_segment2)          #combine , superimpose audio files
mixed2  = mixed1.overlay(audio_segment3)          #Further combine , superimpose audio files
#If you need to save mixed file
mixed2.export("mixed.wav", format='wav') #export mixed  audio file
play(mixed2)                             #play mixed audio file

这篇关于在python中同时播放多个声音的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆