Python, инструмент voice_recognition не распознает WAV-файл - PullRequest
0 голосов
/ 10 сентября 2018

Я сгенерировал аудиофайл в формате .wav, содержащий некоторую речь, а на фоне - какую-то другую речь. Этот код работал для меня для тестового файла .wav:

    import speech_recognition as sr

    r = sr.Recognizer()
    with sr.WavFile(wav_path) as source:
        audio = r.record(source)

    text = r.recognize_google(audio)

Если я использую мой WAV-файл, я получаю следующую ошибку:

ValueError: Аудио файл не может быть прочитан как PCM WAV, AIFF / AIFF-C или Native FLAC; проверить, не поврежден ли файл или в другом формате

Ситуация немного улучшится, если я сохраню этот файл .wav со звуковым файлом:

    import soundfile as sf        

    wav, samplerate = sf.read(wav_path)
    sf.write(saved_wav_path, original_wav, fs)

и затем загрузите новый сохраненный_в_путь обратно в первый блок кода, на этот раз я получаю:

если не isinstance (actual_result, dict) или len (actual_result.get ("alternative", [])) == 0: повысить UnknownValueError ()

Аудио файлы были сохранены как

    wavfile.write(wav_path, fs, data)

где wav_path = 'data.wav'. Есть идеи?

РЕШЕНИЕ:

Сохранение аудиоданных следующим образом создает правильные файлы .wav:

    import wavio
    wavio.write(wav_path, data, fs ,sampwidth=2)

1 Ответ

0 голосов
/ 10 сентября 2018

Из краткого обзора кода в пакете speech_recognition видно, что он использует wave из стандартной библиотеки Python для чтения файлов WAV. Библиотека Python wave не обрабатывает файлы WAV с плавающей запятой, поэтому вам необходимо убедиться, что вы используете speech_recognition с файлами, которые были сохранены в целочисленном формате.

Функция SciPy scipy.io.wavfile.write создаст целочисленный файл, если вы передадите ему массив целых чисел. Так что, если data является массивом с плавающей точкой, вы можете попробовать это:

from scipy.io import wavfile

# Convert `data` to 32 bit integers:
y = (np.iinfo(np.int32).max * (data/np.abs(data).max())).astype(np.int32)

wavfile.write(wav_path, fs, y)

Затем попробуйте прочитать этот файл с помощью speech_recognition.

В качестве альтернативы, вы можете использовать wavio (небольшую библиотеку, которую я создал), чтобы сохранить ваши данные в файл WAV. Он также использует библиотеку Python wave для создания выходных данных, поэтому speech_recognition должен иметь возможность читать файлы, которые он создает.

...