【问题标题】:how to pass edited wav between functions without saving wav in between?如何在函数之间传递编辑的wav而不在两者之间保存wav?
【发布时间】:2020-12-07 13:31:07
【问题描述】:

我有 2 个人的 wav 对话(客户和技术支持) 我有 3 个独立的函数,可以提取 1 个语音,剪切 10 秒并将其转换为嵌入。

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,所以最好应该以某种方式传递。

【问题讨论】:

  • 如果函数在同一个程序中并且它们可以处理类文件对象,那么你可以使用io.BytesIO()在内存中创建文件。
  • 我不知道wfVoiceActivityDetection是什么,但AudioSegment.from_wav()wav中与wav一起使用
  • @furas,你能帮我解决这个问题吗?是缓冲读写吗?如何做到这一点?
  • 我仍然不知道 wfVoiceActivityDetection 是什么 - 所以我无法检查它是否可以与类似文件的对象一起使用。有问题地描述什么是 wfVoiceActivityDetection - 您从哪个模块获得它。
  • @furas,我做到了,谢谢你,检查答案。 wf 是“将 scipy.io.wavfile 导入为 wf”

标签: python audio base64 wav converters


【解决方案1】:

我想通了 - 下面的功能无需保存、缓冲等即可工作。 它接收一个 wav 文件并对其进行编辑,然后直接发送到 get math 嵌入函数:

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(),它只是将它们再次组合到一个轨道中

【讨论】:

  • 干得好,我怀疑不使用io.BytesIO也是可能的
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多