用Python读取wave文件
我已经创建了一个摩尔斯电码发生器,可以将英语句子转换成摩尔斯电码。它还将这种基于文本的摩尔斯电码转换成音频文件。如果字符是用Python读取wave文件,python,wav,wave,morse-code,Python,Wav,Wave,Morse Code,我已经创建了一个摩尔斯电码发生器,可以将英语句子转换成摩尔斯电码。它还将这种基于文本的摩尔斯电码转换成音频文件。如果字符是点,我会将点.wave文件附加到输出波形文件中,如果下一个字符是破折号,则后面是破折号.wav文件 现在我想打开这个wave文件,读取它的内容,找出这些虚线和点的排列顺序 我尝试了以下代码: waveFile = wave.open(r"C:\Users\Gaurav Keswani\Documents\Eclipse\Morse Code Converter\src\
点
,我会将点.wave
文件附加到输出波形文件中,如果下一个字符是破折号
,则后面是破折号.wav
文件
现在我想打开这个wave文件,读取它的内容,找出这些虚线和点的排列顺序
我尝试了以下代码:
waveFile = wave.open(r"C:\Users\Gaurav Keswani\Documents\Eclipse\Morse Code Converter\src\resources\sound\morse.wav", 'r')
x =waveFile.readframes(20)
print (struct.unpack("<40H", x))
waveFile=wave.open(r“C:\Users\Gaurav Keswani\Documents\Eclipse\Morse code Converter\src\resources\sound\Morse.wav“,'r')
x=波形文件读框(20)
print(struct.unpack)(“如果你想要一个检测莫尔斯电码的通用解决方案,你必须看看它的波形(如果您可以安装numpy
和matplotlib
,tom10的链接在这里应该会有所帮助;如果没有,您可以使用stdlib的csv
模块导出一个文件,您可以在最喜欢的电子表格程序中使用);了解您作为一个人如何区分点、虚线和空格;将其转化为一种算法(一系列的步骤,即使是一个有文字意识的白痴也可以遵循);然后将该算法转化为代码。或者你可以找到一个已经为你完成了这项工作的库
但是对于您的特定情况,您只需要在较大的文件中检测dot.wav
和dash.wav
内容的精确副本。(至少假设您没有使用任何有损压缩,而通常不在.wav文件中)。因此,这实际上只是一个子字符串搜索
想一想如何在像'dash-dot-dot'
这样的字符串中检测字符串'dot'
和'dash'
def find(haystack, needle, start):
for i in range(start, len(haystack)):
if haystack[i:i+len(needle)] == needle:
return i
return len(haystack)
def decode_morse(morse):
i = 0
while i < len(morse):
next_dot = find(morse, 'dot', i)
next_dash = find(morse, 'dash', i)
if next_dot < next_dash:
if next_dot < len(morse):
yield '.'
i = next_dot
else:
if next_dash < len(morse):
yield '-'
i = next_dash
我们要确保我们的缓冲区中始终至少有两个破折号长度。我们总是在第一个点或破折号(如果找到一个)或完整破折号长度(如果没有)后保留剩余部分在缓冲区中,添加下一个缓冲区。这实际上太过分了;仔细想想,仔细想想你需要什么,以确保我们永远不会错过两个缓冲区之间的一个破折号。但关键是,只要你做对了,你就不会错过任何点或破折号。想象绘制它,你会看到一个波浪。声音就是波浪s、 你可能想看看波的振幅在哪里变化,并记录每次振幅和基部的显著变化之间经过的时间,不管是点还是破折号。嘿!谢谢你的回答。说到这件事,我真的是个新手。你能解释得更详细一点吗?@GauravKeswani:如果你没有得到co当然,不要只是想象绘制它,而是实际绘制它。如果你不知道如何使用类似于matplotlib
的东西,只需将框架导出到一个巨大的一栏CSV文件,在Excel/LibreOffice/Numbers/任意文件中打开它,然后绘制它。然后你就可以直观地看到点、破折号和空格的样子,并开始考虑一种用于绘制的算法区分它们。事实上,在你的例子中,如果你只想检测dot.wav
和dash.wav
的精确副本,并且你没有使用任何有损压缩,那么算法应该简单得多:只需解码这两个文件并将其读入数字列表,然后它只是一个简单的子字符串搜索(除了你的“字符串”)是16位数字的数组,而不是字符)。
buf = []
while True:
while len(buf) < 2*len(dash):
buf.extend(waveFile.readFrames(20))
next_dash = find(buf, dot)
if next_dash < len(buf):
yield '.'
buf = buf[next_dash:]
else:
buf = buf[-len(dash):]