.WAV Аудио, создаваемое PyDub AudioSegment. Split_on_silence () не имеет идентификатора RIFF при чтении с помощью wave.open - PullRequest
0 голосов
/ 18 июня 2020

В настоящее время я беру большой аудиофайл и разбиваю его на основе тишины, используя функцию PyDub split_on_silence. Однако, когда я go открываю этот файл с помощью wave.open, я получаю сообщение об ошибке, что файл .wav не имеет идентификатора RIFF. Исходный файл, который я использую, представляет собой .wav уже с частотой дискретизации 16000 кГц. Исходный файл можно прочитать через wave.open без проблем. Проблема возникает только с файлами фрагментов, которые я создаю с помощью split_on_silence ().

Я могу открыть фрагмент аудио в медиаплеере и прослушать его без проблем. Вот мой код и вывод ошибки:

import numpy as np
import pandas as pd
import shutil

from typing import Union
from pathlib import Path
from pydub import AudioSegment, effects
from pydub.silence import split_on_silence

def split_audio(audio_file_path: Union[Path, str], split_audio_output_dir: Union[Path, str]):

        audio_file_name = Path(audio_file_path).name
        chunks_output_path = Path(split_audio_output_dir).joinpath(audio_file_name)

        if Path(chunks_output_path).is_dir(): # if it is already a path, clear it and recreate it
            shutil.rmtree(chunks_output_path)
            Path(chunks_output_path).mkdir()
        else:
            Path(chunks_output_path).mkdir()

        sound = AudioSegment.from_wav(audio_file_path)
        dBFS = sound.dBFS # get decibels relative to full scale


        sound_chunks = split_on_silence(sound,
                                        min_silence_len = 400, # measured in ms
                                        silence_thresh = dBFS -30 # if DBFS goes 30 below the files standard dBFS it will be "silence"
                                       # keep_silence = 500 # keeps silence of 250ms at beginning and end of audio to prevent abrupt start/stop of audio
        )

        for i, chunk in enumerate(sound_chunks):

            silence_chunk = AudioSegment.silent(duration = 1500, frame_rate = 16000) # 1.5 seconds of silence appended to beginning and end of audio chunk
            chunk = silence_chunk + chunk + silence_chunk

            chunk_normalized = effects.normalize(chunk)
            print("Exporting audio chunk {0}.wav for parent file {audio_file_name}".format(i, audio_file_name = audio_file_name))
            chunk_normalized.export(chunks_output_path.joinpath("audio_segment_{0}.wav".format(i)))

Теперь, когда я go читаю один из этих аудиофайлов, я получаю следующую ошибку:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import wave
# load the .wav audio signal
audio_signal = wave.open(r"C:\src\audio_processing\data\processed\split_audio\convertedN216MS_KLGB-Twr-Apr-15-2020-0200Z_Final.mp3.wav\audio_segment_2.wav", 'rb')
sample_rate = audio_signal.getframerate()
audio_len = audio_signal.getnframes() * (1 / sample_rate)

audio_buffer = np.frombuffer(audio_signal.readframes(audio_signal.getnframes()), np.int16)

time = np.linspace(0, audio_len, num = len(audio_buffer))

print("This file has {} audio channel(s)".format(audio_signal.getnchannels()))

# Plot
plt.figure(1)
plt.title("Audio file")
plt.plot(time, audio_buffer)
plt.show()

---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)
<ipython-input-23-9b03ea721d99> in <module>
      3 
      4 # load the .wav audio signal
----> 5 audio_signal = wave.open(r"C:\src\audio_processing\data\processed\split_audio\convertedN216MS_KLGB-Twr-Apr-15-2020-0200Z_Final.mp3.wav\audio_segment_2.wav", 'rb')
      6 sample_rate = audio_signal.getframerate()
      7 audio_len = audio_signal.getnframes() * (1 / sample_rate)

C:\Python\python37\lib\wave.py in open(f, mode)
    508             mode = 'rb'
    509     if mode in ('r', 'rb'):
--> 510         return Wave_read(f)
    511     elif mode in ('w', 'wb'):
    512         return Wave_write(f)

C:\Python\python37\lib\wave.py in __init__(self, f)
    162         # else, assume it is an open file object already
    163         try:
--> 164             self.initfp(f)
    165         except:
    166             if self._i_opened_the_file:

C:\Python\python37\lib\wave.py in initfp(self, file)
    129         self._file = Chunk(file, bigendian = 0)
    130         if self._file.getname() != b'RIFF':
--> 131             raise Error('file does not start with RIFF id')
    132         if self._file.read(4) != b'WAVE':
    133             raise Error('not a WAVE file')

Error: file does not start with RIFF id

1 Ответ

0 голосов
/ 18 июня 2020

Что ж, я нашел ответ довольно быстро.

В моем вызове экспорта:

chunk_normalized.export(chunks_output_path.joinpath("audio_segment_{0}.wav".format(i)))

Мне нужно было включить аргумент format = 'wav' примерно так:

chunk_normalized.export(chunks_output_path.joinpath("audio_segment_{0}.wav".format(i)), format = 'wav')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...