Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python读取wave文件_Python_Wav_Wave_Morse Code - Fatal编程技术网

用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):]