Объедините wav-файлы, используя pydub в Django, и сохраните вывод в модель FileField. - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть аудиофайлы .wav, хранящиеся в моей базе данных Django с использованием пользовательской модели AudioInfo, которая имеет следующие параметры:

1) «текст» (строка, представляющая соответствующий контент аудиофайла), например, «howdy "

2)" audio "(соответствующий аудиофайл .wav), например," howdy.wav "

3)" duration (длительность аудиофайла), например, "0.7333"

models.py

class AudioInfoManager(models.Manager):

    def get_by_text(self, text):
        qs = self.get_queryset().filter(text=text) 
        if len(qs) == 0:
            return None
        return qs[0]

    def create_problem_audio(self, text, audio, duration):
        problem_audio = self.create(text=text, audio=audio, duration=duration)
        return problem_audio

class AudioInfo(models.Model):
    text        = models.TextField(unique=True)
    audio       = models.FileField(upload_to=upload_audio_info_path)
    duration    = models.FloatField()

    objects     = AudioInfoManager()

В моем файле views.py я хочу получить два аудиофайла (например," howdy.wav "и" partner.wav ") из моей модели AudioInfo,объедините файлы в один файл "howdy_partner.wav" и передайте его в качестве параметра методу AudioInfoManager "create_problem_audio" для создания и сохранения нового экземпляра AudioInfo в базе данных. Обратите внимание, что я не хочу экспортировать новый "howdy_partner".wav "файл где угодно, но не в базе данных. Сейчас это моя попытка использовать пакет pydub:

views.py

from .models import AudioInfo
from pydub import AudioSegment
from django.core.files.base import ContentFile

howdy_audio_info = AudioInfo.objects.get_by_text('howdy')
howdy_audio = howdy_audio_info.audio # .wav audio file that says "howdy"

partner_audio_info = AudioInfo.objects.get_by_text('partner')
partner_audio = partner_audio_info.audio # .wav audio file that says "partner"

# now I want to combine the two audio files to create a "howdy partner" audio file
howdy_audio_segment = AudioSegment.from_wav(howdy_audio)
partner_audio_segment = AudioSegment.from_wav(partner_audio)
howdy_partner_audio_segment = howdy_audio_segment + partner_audio_segment

# and then I want to save it to my AudioInfo model
# NOTE: this line fails because I can't generate a ContentFile using an AudioSegment
howdy_partner_audio = ContentFile(howdy_partner_audio_segment, 'howdy_partner.wav')
howdy_partner_audio_duration = howdy_partner_audio_segment.duration_seconds

howdy_partner_audio_info = AudioInfo.objects.create_problem_audio(
                               text="Howdy partner.",
                               audio=howdy_partner_audio, 
                               duration=howdy_partner_audio_duration
                           )

Однако это не удается, потому что я не могу сгенерироватьContentFile с использованием AudioSegment (я белиМне нужны двоичные данные в формате .wav).Я также попытался использовать howdy_partner_audio_segment.raw_data, но это не сработало, поскольку он просто возвращает двоичную строку без какого-либо форматирования .wav.В документации pydub говорится, что я могу экспортировать файл, выполнив:

howdy_partner_audio_segment.export("howdy_partner.wav", format="wav")

Но опять же я не хочу экспортировать файл, я хочу сохранить его как поле экземпляра AudioInfo.

...