我已经编写了一小段python代码(其中大部分都是我自己复制的),如果我的持续时间为0.1,但如果我的持续时间为0.05,我会听到声音中的一些咔嗒声。不知道为什么会这样。
我需要以较低的持续时间播放更多数量的频率,但在这种情况下声音完全搞砸了。附上以下代码:
import numpy as np
import sounddevice as sd
def playArray(pts, time):
samplerate = 44100.0
sd.default.samplerate = samplerate
volume = 10000
count = len(pts)
samples = np.arange(samplerate * time ) / samplerate
wave = []
for freq in pts:
wavelet = volume * np.sin( 2 * np.pi * freq * samples)
wave = np.concatenate([wave, wavelet])
wav_wave = np.array(wave, dtype=np.int16)
sd.play(wav_wave, blocking=True)
pts = np.arange(300, 1500, 10)
playArray(pts, 0.1)
答案 0 :(得分:1)
基于@Matthias评论,我改变了我的代码,将阶段纳入抽样。
以下是更新后的代码:
import numpy as np
import sounddevice as sd
import math
def playArray(pts, time):
samplerate = 44100.0
sd.default.samplerate = samplerate
volume = 10000
total = len(pts)
count = 0
phase = 0.0
samples = np.zeros(math.ceil(samplerate * time * total), dtype = np.float)
for i, val in enumerate(samples):
freq = pts[count]
freqRads = 2 * np.pi * freq / samplerate
phase = phase + freqRads
sampleValue = volume * np.sin(phase)
samples[i] = sampleValue
if ( i > 0 and i % (samplerate * time) == 0):
count = count + 1
wav_wave = np.array(samples, dtype=np.int16)
sd.play(wav_wave, blocking=True)
答案 1 :(得分:0)
如果您只需创建短时间的正弦音,您可能需要查看pydub。
您可以使用包含类的pydub.generators
模块来创建不同的波形,例如sine
,square
,pulse
,sawtooth
等,且数量最少代码。
您可以创建持续时间为几毫秒的波形。
这是一个工作示例,可以创建持续0.05秒(50毫秒)的正弦波。
from pydub import AudioSegment
from pydub.generators import Sine
from pydub.playback import play
frequency = 2000 #in Hz
#create sine wave of given freq
sine_wave = Sine(frequency, sample_rate=44100, bit_depth=16)
#Convert waveform to audio_segment for playback and export
#duation is in millisec
sine_segment = sine_wave.to_audio_segment(duration=50.0)
#Play audio segment
play(sine_segment)
#save / export audio_segment
sine_segment.export("out_sine.wav", format="wav")
音频片段的长度可以使用
找到#Duration in seconds
>>> sine_segment.duration_seconds
0.05
#Duration in milliseconds
>>> len(sine_segment)
50
>>>
有关发电机模块here的更多信息 希望这会有所帮助。