Próbuję przeczytać plik WAV z bazy danych TIMIT w Pythonie, ale otrzymuję błąd:

Kiedy używam fali:

wave.Error: file does not start with RIFF id

Kiedy używam Scipy:

ValueError: File format b'NIST'... not understood.

A kiedy używam librosa, program utknął. Próbowałem go przekonwertować, aby WAV za pomocą SOX:

cmd = "sox " + wav_file + " -t wav " + new_wav
subprocess.call(cmd, shell=True)

I to nie pomogło. Widziałem starą odpowiedź odwołującą się do scikits.audiolab, ale wygląda na to, że nie jest już obsługiwany.

Jak mogę przeczytać te plik, aby uzyskać ndarray danych?

Dzięki

11
okuoub 25 czerwiec 2017, 19:19

4 odpowiedzi

Najlepsza odpowiedź

Twój plik nie jest plikiem WAV. Najwyraźniej jest to plik kuli NIST. Z LDC WWW: "Wiele Kora LDC zawiera pliki mowy w formacie Kula NIST. " zgodnie z opisem Format pliku NIST, pierwsze cztery znaki pliku są NIST. Właśnie to mówi błąd Scipy: nie wie, jak czytać plik, który zaczyna się od NIST.

Podejrzewam, że będziesz musiał Konwertuj plik do Wav, jeśli chcesz przeczytać plik z dowolnymi bibliotekami, które próbowałeś. Aby zmusić konwersję na WAV za pomocą programu sph2pipe, użyj opcji polecenia -f wav (lub równoważnie, -f rif), np.

sph2pipe -f wav input.sph output.wav
5
Warren Weckesser 26 czerwiec 2017, 18:00

Napisałem skrypt Pythona, który konwertuje wszystkie pliki

Uwaga: Wszystkie foldery dialektów są obecne w ./timit/train/. Być może trzeba zmienić dialekty_path zgodnie z strukturą projektu (lub jeśli jesteś w systemie Windows)

from sphfile import SPHFile

dialects_path = "./TIMIT/TRAIN/"

for dialect in dialects:
    dialect_path = dialects_path + dialect
    speakers = os.listdir(path = dialect_path)
    for speaker in speakers:
        speaker_path =  os.path.join(dialect_path,speaker)        
        speaker_recordings = os.listdir(path = speaker_path)

        wav_files = glob.glob(speaker_path + '/*.WAV')

        for wav_file in wav_files:
            sph = SPHFile(wav_file)
            txt_file = ""
            txt_file = wav_file[:-3] + "TXT"

            f = open(txt_file,'r')
            for line in f:
                words = line.split(" ")
                start_time = (int(words[0])/16000)
                end_time = (int(words[1])/16000)
            print("writing file ", wav_file)
            sph.write_wav(wav_file.replace(".WAV",".wav"),start_time,end_time)    
1
100rabh 27 marzec 2019, 03:12

Jeśli chcesz ogólny kod, który działa dla każdego pliku WAV wewnątrz przebiegu folderu:

forfiles /s /m *.wav /c "cmd /c sph2pipe -f wav @file @fnameRIFF.wav"

Wyszukiwaniu każdego pliku WAV, który może znaleźć i utworzyć plik WAV, który zarówno Scipy, jak i Fala może odczytać nazwę Riff.wav

2
Agustin Barrachina 18 listopad 2017, 21:38

Wydaj to z wiersza poleceń, aby zweryfikować swój plik WAV ... czy nie

xxd -b myaudiofile.wav | head

Jeśli jego format WAV pojawi się coś takiego

00000000: 01010010 01001001 01000110 01000110 10111100 10101111  RIFF..
00000006: 00000001 00000000 01010111 01000001 01010110 01000101  ..WAVE
0000000c: 01100110 01101101 01110100 00100000 00010000 00000000  fmt ..
00000012: 00000000 00000000 00000001 00000000 00000001 00000000  ......
00000018: 01000000 00011111 00000000 00000000 01000000 00011111  @...@.
0000001e: 00000000 00000000 00000001 00000000 00001000 00000000  ......
00000024: 01100100 01100001 01110100 01100001 10011000 10101111  data..
0000002a: 00000001 00000000 10000001 10000000 10000001 10000000  ......
00000030: 10000001 10000000 10000001 10000000 10000001 10000000  ......
00000036: 10000001 10000000 10000001 10000000 10000001 10000000  ......

Zauważ, że plik WAV rozpoczyna się od postaci riff który jest obowiązkowy wskaźnik Plik używa kodeka WAV ... Jeśli system (jestem w Linux) nie ma powyżej linii poleceń: XXD, a następnie użyj Dowolne edytor sześciokątny, taki jak WXHexeditor do podobieństwa badać plik WAV, aby potwierdzić, że widzisz Riff ... jeśli nie ma riffu, nie jest to plik WAV

Oto szczegóły specyfikacji formatu WAV

http://soundfile.sapp.org/doc/waveFormat/

http://www-mmsp.ece.mcgill.ca/documents/audioformats/wave/wave.html.

http://unusionin.de/ec64/technical/formats/wav.html.

http://www.drdobbs.com/database/inside-The-riff-Specifification/184409308.

https://www.gamedev.net/articles/programming/General-and-gamePlay-programming/loading-a-wave-file-r709.

http://www.topherlee.com/software/pcm-tut-wavformat.html.

http://www.labbookpages.co.uk/audio/javawavfiles.html.

http://www.johnloomis.org/CPE102/ASGN/ASGN1/RIFF.HTML.

http://nagasm.org/asl/sound05/

2
Scott Stensland 28 czerwiec 2017, 04:11