Bad audio format for WAV
1. 问题描述
运行keras音频分类教程的时候,用自带16000_pcm_speeches的数据集可以在pycharm里面跑通,换成自己的音频就不可以了,报错
Bad audio format for WAV: Expected 1 (PCM), but got3
2. 解决
2.1使用librosa进行提取
使用tensorflow的decode和encode,期待能配准格式
音频格式问题在代码里有两个部分,
def path_to_audio(path):
"""Reads and decodes an audio file."""
print('path_to_audio, path : ',path)
# yyy = wl.decode_wav(path) # mine
# audio, _ = tf.audio.decode_wav(yyy, 1, SAMPLING_RATE)
# yyy = wl.decode_wav2(path)
# SAMPLING_RATE = 16000
# audio, _ = tf.audio.decode_wav(yyy, 1, SAMPLING_RATE)
SAMPLING_RATE = 16000
# TODO : origin
# audio = tf.io.read_file(path)
# audio, _ = tf.audio.decode_wav(audio, 1, SAMPLING_RATE)
# TODO : mine
yyy = wl.decode_wav2(path)
audio, _ = tf.audio.decode_wav(yyy, 1, SAMPLING_RATE)
return audio
def load_noise_sample(path):
# yyy = wl.decode_wav(path)
# sample, sampling_rate = tf.audio.decode_wav(yyy, desired_channels=1)
sample, sampling_rate = tf.audio.decode_wav(
tf.io.read_file(path), desired_channels=1
)
if sampling_rate == SAMPLING_RATE:
# Number of slices of 16000 each that can be generated from the noise sample
slices = int(sample.shape[0] / SAMPLING_RATE)
sample = tf.split(sample[: slices * SAMPLING_RATE], slices)
return sample
else:
print("Sampling rate for {} is incorrect. Ignoring it".format(path))
return None
问题出在 tf.audio.decode_wav和 tf.io.read_file(path)
尝试使用别的方法加载音频,放到decode里面
def wl_decode_wav(fname):
y, s = librosa.load(fname,sr=16000) # Downsample 44.1kHz to 8kHz
yy = tf.expand_dims(y, axis=1)
yyy = tf.audio.encode_wav(yy, sample_rate=16000, name=None)
# print(yyy)
return yyy
yyy = wl_decode_wav(fname)
sample, sampling_rate = tf.audio.decode_wav(yyy, desired_channels=1)
print(tf.audio.decode_wav(yyy, desired_channels=1))
用这种方式可以获得相同的数据和相同的对象格式,DecodeWav(audio=<tf.Tensor: shape=(16000, 1), dtype=float32和tf.Tensor: shape=(16000, 1), dtype=float32,但是放到代码里面还是报错。
2.2 路径错误
有时斜杠和反斜杠也会导致错误,使用split和join进行处理,依然报错
def change_path(path):
# path = 'D:\\datas\\16000_pcm_speeches\\audio\\Nelson_Mandela\\999.wav'
p = path.split('\\')
pp = '/'.join(p)
return pp
2.3 mediaArea查看音频信息
打算不动里面的代码,从外部音频入手,调整音频格式
首先使用这个软件查看音频的不同
我的音频格式:
原始可以跑通的音频格式
应该是这里,和报错符合,希望得到1,但是得到了3
2.4 安装ffmpeg,转换音频格式
下载没有gui的软件ffmpeg,这个之前也有搜到过,但是用命令行显得很复杂,所以没有选。不过试错一波之后,还是要安装。根据这个博主的教程,轻松安装成功。
https://blog.csdn.net/xiaoxueyaoxuexi/article/details/110451006
转成功了再来
妙啊!
成功了
上面的三个错误是连着的
改了一个命令之后三个问题都解决了
ffmpeg -i input.wav -ab 256k output.wav
在cmd里输入这个命令就可以得到和模型原音频一样的格式
虽然有一点点奇怪的是257k
不过能跑就不管啦
感谢雷神
3. 顺便学到
3.1 tensorflow.io
这个用的人很少,找不到教程
3.2 c 盘清理
早就把桌面和下载,微信qq等的路径都移动到d盘了,但是可爱cc还是只剩200m+
不过没有困难的工作,只有勇敢的狗狗
狗狗这次在设置的储存管理里面,找到大的文件夹,然后再右键查看文件夹的属性,看到内存,把大内存的剪切粘贴到d盘,再扔一个快捷方式回来骗一骗cc,成功给cc扩容几个g🎈
3.3 比火箭还快的豆瓣pip源
在下载tensorflow.io的时候找到的,真的巨快!
有味道又很真实的评论,豆瓣源真的很快
这里是链接豆瓣源
https://blog.csdn.net/weixin_38109583/article/details/93376954
3.4 使用echo批量执行cmd命令
一个一个改是不可能的,python有和ffmpeg的包,但是感觉用法不同
用python的os.system模块也不太行,python安装在conda的一个环境下,儿ffmpeg本身只能在base环境查看到。
所以用了echo,写bat脚本
@echo off
echo +++++
echo hi
ffmpeg -version
d:
cd mydocument
cd temp
ffmpeg -i r1.wav -ab 256 k1.wav
pause
酱就可以了ヾ(≧▽≦*)o
接下来的任务是用python生成命令,然后复制过来
import os
audio_path='D:\\mydocument\\temp'
path_list = []
name_list = []
echo_list = []
for root, dirs, files in os.walk(audio_path, topdown=False):
for name in files:
path_list.append(os.path.join(root, name))
name_list.append(name)
for name in dirs:
print(os.path.join(root, name))
print(path_list)
print(name_list)
for name in name_list:
name_new = name + '_new.wav'
echo = 'ffmpeg -i ' + name + ' -ab 256k ' + name_new
echo_list.append(echo)
print(echo_list)
# Open the file for writing
F = open('list.txt', 'w')
for i in echo_list:
F.write(str(i) + "\n")
F.close()
成功啦~
@echo off
echo +++++
echo hi
ffmpeg -version
d:
cd mydocument
cd temp
ffmpeg -i k1.wav -ab 256k k1.wav_new.wav
ffmpeg -i p1.wav -ab 256k p1.wav_new.wav
ffmpeg -i p2.wav -ab 256k p2.wav_new.wav
ffmpeg -i p3.wav -ab 256k p3.wav_new.wav
ffmpeg -i p4.wav -ab 256k p4.wav_new.wav
ffmpeg -i p5.wav -ab 256k p5.wav_new.wav
ffmpeg -i r1.wav -ab 256k r1.wav_new.wav
ffmpeg -i r2.wav -ab 256k r2.wav_new.wav
ffmpeg -i r3.wav -ab 256k r3.wav_new.wav
ffmpeg -i r4.wav -ab 256k r4.wav_new.wav
ffmpeg -i r5.wav -ab 256k r5.wav_new.wav
pause
复制过来,保存,双击运行,piu~的一下就完成了