import sounddevice as sd
import soundfile as sf
import threading
event = threading.Event()
data, fs = sf.read("test.wav", always_2d=True)
current_frame = 0
def callback(outdata, frames, time, status):
global current_frame
if status:
print(status)
chunksize = min(len(data) - current_frame, frames)
outdata[:chunksize] = data[current_frame:current_frame + chunksize]
if chunksize < frames:
outdata[chunksize:] = 0
raise sd.CallbackStop()
current_frame += chunksize
stream = sd.OutputStream(
samplerate=fs, device=None, channels=data.shape[1],
callback=callback, finished_callback=event.set)
with stream:
event.wait() # Wait until playback is finished
录制语音
import queue
import sys
import sounddevice as sd
import soundfile as sf
q = queue.Queue()
def callback(indata, frames, time, status):
"""This is called (from a separate thread) for each audio block."""
if status:
print(status, file=sys.stderr)
q.put(indata.copy())
# soundfile expects an int, sounddevice provides a float:
samplerate = 16000
channels = 1
# Make sure the file is opened before recording anything:
with sf.SoundFile("test.wav", mode='w', samplerate=samplerate,channels=channels) as file:
with sd.InputStream(samplerate=samplerate, device=None,channels=channels, callback=callback):
print('#' * 80)
print('press Ctrl+C to stop the recording')
print('#' * 80)
while True:
file.write(q.get())
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)