wav를 저장하지 않고 함수간에 편집 된 wav를 전달하는 방법은 무엇입니까?
2 명의 wav 대화 (고객 및 기술 지원)가 있습니다. 1 개의 음성을 추출하고 10 초를 잘라내어 임베딩으로 변환하는 3 개의 별도 기능이 있습니다.
def get_customer_voice(file):
print('getting customer voice only')
wav = wf.read(file)
ch = wav[1].shape[1]#customer voice always in 1st track
sr = wav[0]
c1 = wav[1][:,1]
#print('c0 %i'%c0.size)
if ch==1:
exit()
vad = VoiceActivityDetection()
vad.process(c1)
voice_samples = vad.get_voice_samples()
#this is trouble - how to pass it without saving anywhere as wav?
wf.write('%s_customer.wav'%file,sr,voice_samples)
아래 기능은 위의 기능에서 10 초의 wav 파일을 자릅니다.
import sys
from pydub import AudioSegment
def get_customer_voice_10_seconds(file):
voice = AudioSegment.from_wav(file)
new_voice = voice[0:10000]
file = str(file) + '_10seconds.wav'
new_voice.export(file, format='wav')
if __name__ == '__main__':
if len(sys.argv) < 2:
print('give wav file to process!')
else:
print(sys.argv)
get_customer_voice_10_seconds(sys.argv[1])
일부 디렉토리에 저장하지 않고 wav 또는 다른 형식으로 전달하는 방법은 무엇입니까? 그것은 rest api에서 사용될 것입니다. 저는 그것이 그 wav를 어디에 저장할지 모르겠습니다. 그래서 가급적이면 어떻게 든 전달되어야합니다.
답변
1 ERJAN
나는 그것을 알아 냈다-아래 함수는 저장, 버퍼링 등없이 작동한다. 그것은 wav 파일을 받고 그것을 편집하고 단지 get math embedding 함수로 곧바로 보낸다.
def get_customer_voice_and_cutting_10_seconds_embedding(file):
print('getting customer voice only')
wav = read(file)
ch = wav[1].shape[1]
sr = wav[0]
c1 = wav[1][:,1]
vad = VoiceActivityDetection()
vad.process(c1)
voice_samples = vad.get_voice_samples()
audio_segment = AudioSegment(voice_samples.tobytes(), frame_rate=sr,sample_width=voice_samples.dtype.itemsize, channels=1)
audio_segment = audio_segment[0:10000]
file = str(file) + '_10seconds.wav'
return get_embedding(file)
핵심은 오디오 세그먼트의 tobytes ()이며, 다시 한 트랙에 모두 모입니다.