【问题标题】:unable to read the .WAV file using python无法使用 python 读取 .WAV 文件
【发布时间】:2019-06-15 14:13:24
【问题描述】:

我正在尝试使用 python 读取使用 GNU radio Companion 记录为 WAV 文件的 FM 信号。我正在附加使用的 .grc 文件。

我可以清楚地听到记录的信号,但读取数据会得到一个空 ([] ) 值。

python 代码

import soundfile as sf
data, fs = sf.read('/home/fm_record_RSM_10_01_2019_dat.wav')
for i in data:
    print(i)

这给了

data
     array([], dtype=float64) 
fs 
     96000

当使用以下代码时,

import wave
input_wave_file= wave.open('/home/fm_record_RSM_10_01_2019_dat.wav', 'r')
nc,sw,fr,nf,ct,cn = input_wave_file.getparams()

另一个错误如下所示

Error                                     Traceback (most recent call last)
<ipython-input-3-5009fe3506e7> in <module>()
      1 import wave
      2 
----> 3 input_wave_file= wave.open('/home/fm_record_RSM_10_01_2019_dat.wav', 'r')
      4 nc,sw,fr,nf,ct,cn = input_wave_file.getparams()
      5 frame_data = input_wave_file.readframes(5)

~/anaconda3/lib/python3.7/wave.py in open(f, mode)
    508             mode = 'rb'
    509     if mode in ('r', 'rb'):
--> 510         return Wave_read(f)
    511     elif mode in ('w', 'wb'):
    512         return Wave_write(f)

~/anaconda3/lib/python3.7/wave.py in __init__(self, f)
    162         # else, assume it is an open file object already
    163         try:
--> 164             self.initfp(f)
    165         except:
    166             if self._i_opened_the_file:

~/anaconda3/lib/python3.7/wave.py in initfp(self, file)
    131             raise Error('file does not start with RIFF id')
    132         if self._file.read(4) != b'WAVE':
--> 133             raise Error('not a WAVE file')
    134         self._fmt_chunk_read = 0
    135         self._data_chunk = None

Error: not a WAVE file

有人可以帮我找出问题所在吗?是因为 .grc 文件中记录 wav 块的设置有任何错误,还是因为 python 文件中有任何错误?请帮忙

非常感谢 女士

【问题讨论】:

标签: python-3.x gnuradio-companion


【解决方案1】:
#! /usr/bin/env python3
import soundfile as sf
import wave
import sys
if len(sys.argv) < 2:
    print("Expected filename.wav on cmdline")
    quit(1)
data, fs = sf.read(sys.argv[1])
for i in range(10):
    print(i)

print('...')
input_wave_file= wave.open(sys.argv[1], 'r')
nc,sw,fr,nf,ct,cn = input_wave_file.getparams()
print('nc', nc) 
print('sw', sw) 
print('fr', fr) 
print('nf', nf) 
print('ct', ct) 
print('cn', cn)
chunk = 1024
data = input_wave_file.readframes(chunk)
print('data[0:10] =', data[0:10])
print('data[0:10] =', end='')
for i in range(10):
    print(data[i],' ',end='')
print('')

在 linux 环境中,我将上面的内容放入了一个名为 playsound.py 的文件中。 然后我执行(在命令行提示符下)

$ chmod +x playsound.py
$ ./playsound.py file.wav
[ 0.06454468  0.05557251]
[ 0.06884766  0.05664062]
[ 0.0552063   0.06777954]
[ 0.04733276  0.0708313 ]
[ 0.05505371  0.065979  ]
[ 0.05358887  0.06677246]
[ 0.05621338  0.06045532]
[ 0.04891968  0.06298828]
[ 0.04986572  0.06817627]
[ 0.05410767  0.06661987]
...
nc 2
sw 2
fr 44100
nf 32768
ct NONE
cn not compressed
data[0:10] = b'C\x08\x1d\x07\xd0\x08@\x07\x11\x07'
data[0:10] =67  8  29  7  208  8  64  7  17  7 

file.wav 是我方便的一些现有 .wav 文件。 我以前试过 对于数据中的 i: 打印(一) 正如你所做的那样,这也有效,但是输出太多了。

我认为您应该检查您提供的文件名是否指向有效的 WAV 文件。 例如,您列出的路径是 "/home/filename.wav" 。 通常它至少是“/home/用户名/filename.wav”

【讨论】:

  • 我的 .wav 文件来自 gnuradio-companion。数据显示数组([], dtype=float64)
猜你喜欢
  • 2021-01-30
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多