【发布时间】:2020-08-06 05:47:46
【问题描述】:
三天来,我一直在用 Python 自动化管道敲打我的头,该管道采用 .WAV 电子邮件附件的二进制字节数组(例如 b'RIFFm\xc1\x00\x00WAVEfmt [...]')电话系统自动推送,通过一些文本到语音的 API(如 speech_recognition 或未来的一些离线 Sphinx/Kaldi 实现)推送它,然后发回成绩单。理想情况下,这一切都将在内存中处理,而无需在磁盘上创建文件,因为这似乎是多余的,但我试图找出任何以 Python 方式从我拥有的音频数据移动到我可以发送的成绩单的东西,我不介意一点文件清理。
我遇到的问题是我手动下载的用于测试的 .WAV 文件附件,以及我通过电子邮件 API 使用的二进制数据在 wave 依赖项中表现不佳,wave.open('ipsum.wav') 提供Error: unknown format: 49 并使用 speech_recognition 库以将 wave 未知格式错误转换为 ValueError: Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format 结束。
使用在线文件转换工具将我拥有的本地文件手动转换为 .wavs 似乎以speech_recognition 愿意使用的方式解决了这个问题,并且我已经设法获得了一份工作成绩单(成绩单对于文件来说太短了,但这是一个单独的分块问题)。所以问题似乎是wave 对电话系统发送给我的文件的格式/编码/压缩方式不满意,并且解决方案位于复制该网络转换工具如何编码这些测试文件的某个地方。
我一直在搞乱pydub 的.export() 函数,试图强制它转换为wave 喜欢的东西(pydub 已设法播放这些文件)但它似乎让我感兴趣一个圆圈,然后我回到上面讨论的错误回溯开始的地方。理想的解决方案可能在于使用一些工具来操作内存中电子邮件附件的字节数组,但是,我再次接受任何 Pythonic 建议。
我可能会更改我在谷歌某处使用的文本到语音转换框架,但到目前为止我的基本实现代码:
from exchangelib import Message
import io
import pydub
import speech_recognition as sr
r = sr.Recognizer()
def speech_to_text(Message):
for attachment in Message.attachments:
if attachment.content_type == 'audio/x-wav':
content = attachment.content # Store attachment's binary data as a variable
bytes = io.BytesIO(content) # Encode IO as bytes
f= pydub.AudioSegment.from_file(bytes).export(attachment.name[:-4] +'.wav', format='wav') # Use bytes to create pydub's AudioSegment object
# and export it as desired format
with sr.AudioFile(f) as source: # Feed converted file into speech_recognition's AudioFile
audio = r.record(source)
transcript = r.recognize_google(audio)
return transcript
如果您有任何好的资源或课程可以教我以 Python 风格的方式进行音频文件转换(我一直在努力解决假设您的音频处理工作完美的非常实用的资源与极其注重理论的讨论之间的重大差距),我也很高兴听到他们的声音。
【问题讨论】:
-
据我了解,这里的主要问题是将 WAV 文件从您的系统获取到 Python。你能分享这样一个麻烦的WAV文件的任何例子吗?这将使我们更容易解决问题。
-
很酷,当你有数据的时候ping我。如果不能公开分享它,请随时使用我的电子邮件。干杯!
-
@LukaszTracewski dropbox.com/s/asamm4tad3myyal/msg0000%20%282%29.WAV?dl=0 该文件来自 Grandstream 的电话系统。我不确定具体的型号是什么,但看起来 Dropbox 有一些关于编解码器的好信息。
-
谢谢!我的回答解决了你的问题吗?
-
@LukaszTracewski 我仍在努力,但我对如何修复它有一个很好的想法。我目前正在攻击 FFMPEG 角度。
标签: python audio speech-recognition wav pydub