wave.Error: unknown format: 3 arises when trying to convert a wav file into text in Python
wave.Error: unknown format: 3 arises when trying to convert a wav file into text in Python
我需要从麦克风录制一段音频并将其转换为文本。我已经使用从网上下载的几个音频片段尝试了这个转换过程,并且效果很好。但是,当我尝试转换从麦克风录制的音频剪辑时,出现以下错误。
回溯(最后一次调用):
文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\site-packages\speech_recognition__init__.py",第 203 行,在 中输入
self.audio_reader = wave.open(self.filename_or_fileobject, "rb")
文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 510 行,打开
return Wave_read(f)
文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 164 行,在 init 中
self.initfp(f)
initfp 中的文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 144 行
self._read_fmt_chunk(块)
文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 269 行,在 _read_fmt_chunk 中
引发错误('unknown format: %r' % (wFormatTag,))
wave.Error:未知格式:3
我正在尝试的代码如下。
import speech_recognition as sr
import sounddevice as sd
from scipy.io.wavfile import write
# recording from the microphone
fs = 44100 # Sample rate
seconds = 3 # Duration of recording
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
sd.wait() # Wait until recording is finished
write('output.wav', fs, myrecording) # Save as WAV file
sound = "output.wav"
recognizer = sr.Recognizer()
with sr.AudioFile(sound) as source:
recognizer.adjust_for_ambient_noise(source)
print("Converting audio file to text...")
audio = recognizer.listen(source)
try:
text = recognizer.recognize_google(audio)
print("The converted text:" + text)
except Exception as e:
print(e)
我看了类似的问题回答,他们说我们需要把它转换成不同的wav格式。有人可以为我提供可用于此转换的代码或库吗?提前谢谢你。
您以浮点格式写入文件:
soxi output.wav
Input File : 'output.wav'
Channels : 2
Sample Rate : 44100
Precision : 25-bit
Duration : 00:00:03.00 = 132300 samples = 225 CDDA sectors
File Size : 1.06M
Bit Rate : 2.82M
Sample Encoding: 32-bit Floating Point PCM
wave模块无法读取
要存储 int16 格式,请这样做:
import numpy as np
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
sd.wait() # Wait until recording is finished
write('output.wav', fs, myrecording.astype(np.int16)) # Save as WAV file in 16-bit format
方法一
您听不到任何声音,因为您将浮点值转换为不正确的整数。在 WAV 文件中,信号中的浮点值从 -1 到 1,而 16 位 PCM(整数)值从 -32,768 到 32,767。所以本质上,你的信号是从
之类的东西转换而来的
[-1.4240753e-05, 4.3602209e-05, 1.0526689e-06, ...,
1.7763522e-02, 1.6644333e-02, 6.7148944e-03]
至
[0, 0, 0, ..., 0, 0, 0]
以上转换不正确。
要将文件正确转换为整数(PCM 格式),您需要convert 而不是cast。下面给出了这样做的一种方法 `def float2pcm(sig, dtype='int16'):
信号 = np.asarray(信号)
dtype = np.dtype(dtype)
i = np.iinfo(dtype)
abs_max = 2 ** (i.bits - 1)
offset = i.min + abs_max
return (sig * abs_max + offset).clip(i.min, i.max).astype(dtype)`
所以你可以在使用sd.wait
行后使用下面的代码
float2pcm(myrecording)
方法二
解决问题的另一种(更简单)方法是使用 sounddevice
库的功能通过调用以下函数进行记录来在内部执行此操作。
import numpy as np
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2, dtype=np.int16)
我需要从麦克风录制一段音频并将其转换为文本。我已经使用从网上下载的几个音频片段尝试了这个转换过程,并且效果很好。但是,当我尝试转换从麦克风录制的音频剪辑时,出现以下错误。
回溯(最后一次调用): 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\site-packages\speech_recognition__init__.py",第 203 行,在 中输入 self.audio_reader = wave.open(self.filename_or_fileobject, "rb") 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 510 行,打开 return Wave_read(f) 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 164 行,在 init 中 self.initfp(f) initfp 中的文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 144 行 self._read_fmt_chunk(块) 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\wave.py",第 269 行,在 _read_fmt_chunk 中 引发错误('unknown format: %r' % (wFormatTag,)) wave.Error:未知格式:3
我正在尝试的代码如下。
import speech_recognition as sr
import sounddevice as sd
from scipy.io.wavfile import write
# recording from the microphone
fs = 44100 # Sample rate
seconds = 3 # Duration of recording
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
sd.wait() # Wait until recording is finished
write('output.wav', fs, myrecording) # Save as WAV file
sound = "output.wav"
recognizer = sr.Recognizer()
with sr.AudioFile(sound) as source:
recognizer.adjust_for_ambient_noise(source)
print("Converting audio file to text...")
audio = recognizer.listen(source)
try:
text = recognizer.recognize_google(audio)
print("The converted text:" + text)
except Exception as e:
print(e)
我看了类似的问题回答,他们说我们需要把它转换成不同的wav格式。有人可以为我提供可用于此转换的代码或库吗?提前谢谢你。
您以浮点格式写入文件:
soxi output.wav
Input File : 'output.wav'
Channels : 2
Sample Rate : 44100
Precision : 25-bit
Duration : 00:00:03.00 = 132300 samples = 225 CDDA sectors
File Size : 1.06M
Bit Rate : 2.82M
Sample Encoding: 32-bit Floating Point PCM
wave模块无法读取
要存储 int16 格式,请这样做:
import numpy as np
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
sd.wait() # Wait until recording is finished
write('output.wav', fs, myrecording.astype(np.int16)) # Save as WAV file in 16-bit format
方法一
您听不到任何声音,因为您将浮点值转换为不正确的整数。在 WAV 文件中,信号中的浮点值从 -1 到 1,而 16 位 PCM(整数)值从 -32,768 到 32,767。所以本质上,你的信号是从
之类的东西转换而来的
[-1.4240753e-05, 4.3602209e-05, 1.0526689e-06, ...,
1.7763522e-02, 1.6644333e-02, 6.7148944e-03]
至
[0, 0, 0, ..., 0, 0, 0]
以上转换不正确。
要将文件正确转换为整数(PCM 格式),您需要convert 而不是cast。下面给出了这样做的一种方法 `def float2pcm(sig, dtype='int16'): 信号 = np.asarray(信号) dtype = np.dtype(dtype)
i = np.iinfo(dtype)
abs_max = 2 ** (i.bits - 1)
offset = i.min + abs_max
return (sig * abs_max + offset).clip(i.min, i.max).astype(dtype)`
所以你可以在使用sd.wait
行后使用下面的代码
float2pcm(myrecording)
方法二
解决问题的另一种(更简单)方法是使用 sounddevice
库的功能通过调用以下函数进行记录来在内部执行此操作。
import numpy as np
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2, dtype=np.int16)