Merge pull request #211 from wkyo/master
录音小工具代码规范化与重命名speech-recorder.py -> speech_recorder.py
This commit is contained in:
commit
b0ea8b214b
|
@ -1,49 +0,0 @@
|
|||
import wave
|
||||
from pyaudio import PyAudio,paInt16
|
||||
|
||||
framerate=16000
|
||||
NUM_SAMPLES=2000
|
||||
channels=1
|
||||
sampwidth=2
|
||||
TIME=10
|
||||
def save_wave_file(filename,data):
|
||||
'''save the date to the wavfile'''
|
||||
wf=wave.open(filename,'wb')
|
||||
wf.setnchannels(channels)
|
||||
wf.setsampwidth(sampwidth)
|
||||
wf.setframerate(framerate)
|
||||
wf.writeframes(b"".join(data))
|
||||
wf.close()
|
||||
|
||||
def my_record():
|
||||
pa=PyAudio()
|
||||
stream=pa.open(format = paInt16,channels=1,
|
||||
rate=framerate,input=True,
|
||||
frames_per_buffer=NUM_SAMPLES)
|
||||
my_buf=[]
|
||||
count=0
|
||||
while count<TIME*8:#控制录音时间
|
||||
string_audio_data = stream.read(NUM_SAMPLES)
|
||||
my_buf.append(string_audio_data)
|
||||
count+=1
|
||||
print('.')
|
||||
save_wave_file('01.wav',my_buf)
|
||||
stream.close()
|
||||
|
||||
chunk=2014
|
||||
def play():
|
||||
wf=wave.open(r"01.wav",'rb')
|
||||
p=PyAudio()
|
||||
stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=
|
||||
wf.getnchannels(),rate=wf.getframerate(),output=True)
|
||||
while True:
|
||||
data=wf.readframes(chunk)
|
||||
if data=="":break
|
||||
stream.write(data)
|
||||
stream.close()
|
||||
p.terminate()
|
||||
|
||||
if __name__ == '__main__':
|
||||
my_record()
|
||||
print('Over!')
|
||||
play()
|
|
@ -0,0 +1,83 @@
|
|||
import pyaudio
|
||||
import wave
|
||||
|
||||
|
||||
def record_wave(wavfile,
|
||||
duration=10,
|
||||
channels=1,
|
||||
sampling_rate=16000,
|
||||
sampling_bits=16,
|
||||
chunk_size=1024,
|
||||
keyboard_interrupt='keep_audio'):
|
||||
"""Record audio using the default audio device by PyAudio and Wave"""
|
||||
|
||||
format_ = None
|
||||
if sampling_bits == 8:
|
||||
format_ = pyaudio.paInt8
|
||||
if sampling_bits == 16:
|
||||
format_ = pyaudio.paInt16
|
||||
elif sampling_bits == 24:
|
||||
format_ = pyaudio.paInt24
|
||||
elif sampling_bits == 32:
|
||||
format_ = pyaudio.paFloat32
|
||||
else:
|
||||
raise ValueError('Unsupported sampling bits')
|
||||
|
||||
p = pyaudio.PyAudio()
|
||||
stream = p.open(format=format_,
|
||||
channels=channels,
|
||||
rate=sampling_rate,
|
||||
input=True,
|
||||
frames_per_buffer=chunk_size)
|
||||
|
||||
frames = []
|
||||
|
||||
print('Start to record with {}-seconds audio\n'
|
||||
'Type Ctrl-C to get an early stop (a shorter audio)'
|
||||
.format(duration))
|
||||
try:
|
||||
for _ in range(0, int(sampling_rate / chunk_size * duration)):
|
||||
data = stream.read(chunk_size)
|
||||
frames.append(data)
|
||||
print('.', end='', flush=True)
|
||||
except KeyboardInterrupt:
|
||||
if keyboard_interrupt == 'keep_audio':
|
||||
used_seconds = int(len(frames) * chunk_size / sampling_rate)
|
||||
print('\n-*- Early stop with {} seconds'.format(used_seconds))
|
||||
else:
|
||||
raise
|
||||
print('\nRecording finished')
|
||||
|
||||
stream.stop_stream()
|
||||
stream.close()
|
||||
p.terminate()
|
||||
|
||||
print('Convert PCM frames to WAV... ', end='')
|
||||
wf = wave.open(wavfile, 'wb')
|
||||
wf.setnchannels(channels)
|
||||
wf.setsampwidth(p.get_sample_size(format_))
|
||||
wf.setframerate(sampling_rate)
|
||||
wf.writeframes(b''.join(frames))
|
||||
wf.close()
|
||||
print('OK')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
|
||||
|
||||
parser = ArgumentParser(description='Simple Wave Audio Recorder',
|
||||
formatter_class=ArgumentDefaultsHelpFormatter)
|
||||
parser.add_argument('-d', '--duration', type=int,
|
||||
default=10, help='maximum duration in seconds')
|
||||
parser.add_argument('-r', '--sampling-rate', type=int,
|
||||
default=16000, help='sampling rate')
|
||||
parser.add_argument('-b', '--sampling-bits', type=int,
|
||||
default=16, choices=(8, 16, 24, 32), help='sampling bits')
|
||||
parser.add_argument('-c', '--channels', type=int,
|
||||
default=1, help='audio channels')
|
||||
parser.add_argument('output', nargs='?', default='output.wav', help='audio file to store audio stream')
|
||||
args = parser.parse_args()
|
||||
record_wave(args.output, duration=args.duration,
|
||||
channels=args.channels,
|
||||
sampling_bits=args.sampling_bits,
|
||||
sampling_rate=args.sampling_rate)
|
Loading…
Reference in New Issue