import sounddevice as sd
import soundfile as sf
import threading
event = threading.Event()
data, fs = sf.read("test.wav", always_2d=True)
current_frame =0defcallback(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:]=0raise 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()defcallback(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)asfile:with sd.InputStream(samplerate=samplerate, device=None,channels=channels, callback=callback):print('#'*80)print('press Ctrl+C to stop the recording')print('#'*80)whileTrue:file.write(q.get())