¡Urgente! ! ! ! ¿Cómo hacer una grabadora de audio simple a través de Python, grabar su propio sonido usando muestreo de 8k, codificación de cuantificación de 16 bits y observar sus valores?
desde?sys?import?byteorder
desde?array?import?array
desde?struct?import?pack
importar ?pyaudio
importar?wave
UMBRAL?=?500
CHUNK_SIZE?=?1024
FORMATO?=?pyaudio.paInt16
RATE?=?44100
def?is_silent(snd_data):
"Si es inferior al umbral 'silencioso', devuelve 'Verdadero'"
return?normalize(snd_data):
"Volumen de salida promedio"
MAXIMUM=16384
times=float(MAXIMUM)/ max(abs (i)?para?i?in?snd_data)
r?=?array('h')
para?i?in?snd_data:
r.append(int(i*times))
return?r
def?trim(snd_data):
"Recortar el inicio y final del punto en blanco"
def?_trim(snd_data):
snd_started?False
r=? array('h')
para?i?in?snd_data:
if?not?snd_started?and?abs(i)gt UMBRAL:
snd_started?=?True
r.append(i)
elif?snd_started:
r.append(i)
return?r
#?Trim?to?left?
snd_data?=?_trim(snd_data)
#?_trim(snd_data)
snd_data.reverse()
¿retorno?Inicio y final (coma flotante) de 'snd_data' de longitud 'segundos'"
"Agregar silencio en 'snd_data'. (Número de punto flotante)"
r?=?array('h',? [0?for?i?in?xrange(int(segundos*RATE))])
r.extend(snd_data)
r.extend([0?for?i?in?xrange(int(segundos*RATE))])
retorno?r p >
def?record():
"""
¿Registro? y devuelve los datos como una matriz corta firmada.
Normaliza el audio, recorta el silencio al principio y al final y aumenta 0,5 segundos.
.5 segundos de sonido en blanco para garantizar que dispositivos como VLC puedan reproducir estos sonidos sin que se corten. PyAudio()
transmisión?=? p.open(format=FORMAT,?channels=1,?rate=RATE,
input=True,?output=True, p>
p>
frames_per_buffer=CHUNK_SIZE)
num_silent?=?0
snd_started=?
#?little?endian,? firmado?short p>
snd_data?=?array('h',?).stream.read(CHUNK_SIZE))
if?byteorder?==?' p>
snd_data.byteswap()
r.extend(snd_data)
silent?=?is_silent(snd_data)
if?silent?and ?snd_started:
p>
num_silent? =?1
elif?not?silent?and?not?snd_started:
snd_started?=? Verdadero
si? snd_started?and?num_silent?gt;?30:
romper
sample_width?=?p.get_sample_size(FORMATO)
stream.stop_stream ()
stream.close()
p.terminate()
r?=?normalize(r )
r? =?trim(r)
r?=?add_silence(r,?0.5)
Devuelve sample_width, r
def?record_to_file(path):
"Graba desde el micrófono y envía los datos resultantes a 'path'"
sample_width, data?=?record()
datos?=?pack( ' lt;'? ?('h'*len(datos)),?*datos)
wf?=?wave.open(ruta,?' wb ')
wf .setnnchanels(1)
wf.setampwidth(sample_width)
wf.setframerate(RATE)
wf. writeframes(data)
wf. close()
if?__main__':
print("Por favor, diga algo en el micrófono")
record_to_file('demo.wav ')
print("Completo: el resultado se ha escrito en demo.wav")
Si __main__?