raise Error(‘unknown format: %r‘ % (wFormatTag,))wave.Error: unknown format: 3

这个问题我看很多文章都说用什么sox解决, 我嫌麻烦.偶然发现了这个函数可以解决问题

import os
import librosa
import soundfile as sf


def resample4wavs(frompath, topath, resamplerate):
    '''
    :param frompath: 源文件所在目录
    :param topath: 重置采样率文件存放目录
    :param resamplerate: 重置采样率
    :return:
    '''
    fs = os.listdir(frompath)
    for f in fs:
        try:
            fromfile = frompath + f
            print(fromfile)
            tofile = topath + f
            y, sr = librosa.load(fromfile)
            to_y = librosa.resample(y, sr, resamplerate)
            # librosa.output.write_wav(tofile, to_y, resamplerate)过时代码, 需要换成下面的代码
            sf.write(tofile, to_y, resamplerate)
        except Exception as e:
            print('Error:', e)

这个函数不是我写的, 来自于下面这个文章, 我偶然做重置采样率的时候发现可以解决这个问题

RNN语音分类-普通话广东话分类_~扬之水~的博客-CSDN博客

侵删

具体调用方法是这样的,友情提醒,调用之前先备份自己的音频,以防万一

"""
这个代码还可以解决
raise Error('unknown format: %r' % (wFormatTag,))
wave.Error: unknown format: 3
这个bug
"""
import os
import librosa
import soundfile as sf


def resample4wavs(frompath, topath, resamplerate):
    '''
    :param frompath: 源文件所在目录
    :param topath: 重置采样率文件存放目录
    源文件目录和重置采样率目录可以是一个目录但是会覆盖原来的文件
    :param resamplerate: 重置采样率
    :return:
    '''
    fs = os.listdir(frompath)
    for f in fs:
        try:
            fromfile = frompath + f
            print(fromfile)
            tofile = topath + f
            y, sr = librosa.load(fromfile)
            to_y = librosa.resample(y, sr, resamplerate)
            # librosa.output.write_wav(tofile, to_y, resamplerate)过时代码, 需要换成下面的代码
            sf.write(tofile, to_y, resamplerate)
        except Exception as e:
            print('Error:', e)

//需要重置采样率的文件所在的文件夹
path_1 = r''
//重置采样率后的文件所在的文件夹
path_2=r''

//48000是重置后的采样率,这些都按照自己需要修改
resample4wavs(path_1, path_2, 48000)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在 C# 中使用 waveOut 发声可以通过以下步骤实现: 1. 引用 Windows API 函数库 winmm.dll,使用以下语句: ```csharp [DllImport("winmm.dll")] static extern int waveOutOpen(out IntPtr hWaveOut, uint uDeviceID, ref WAVEFORMATEX lpFormat, WaveCallback dwCallback, IntPtr dwInstance, uint dwFlags); ``` 2. 定义 WAVEFORMATEX 结构体,用于设置音频格式: ```csharp [StructLayout(LayoutKind.Sequential, Pack = 2)] struct WAVEFORMATEX { public short wFormatTag; public short nChannels; public int nSamplesPerSec; public int nAvgBytesPerSec; public short nBlockAlign; public short wBitsPerSample; public short cbSize; } ``` 3. 创建音频缓冲区,使用以下语句: ```csharp IntPtr hWaveOut; // waveOut 句柄 WAVEFORMATEX format = new WAVEFORMATEX { wFormatTag = 1, nChannels = 1, nSamplesPerSec = 8000, nAvgBytesPerSec = 8000, nBlockAlign = 1, wBitsPerSample = 8, cbSize = 0 }; waveOutOpen(out hWaveOut, 0, ref format, null, IntPtr.Zero, 0); ``` 4. 将音频数据写入缓冲区,使用以下语句: ```csharp [DllImport("winmm.dll")] static extern int waveOutPrepareHeader(IntPtr hWaveOut, IntPtr lpWaveOutHdr, uint uSize); [DllImport("winmm.dll")] static extern int waveOutWrite(IntPtr hWaveOut, IntPtr lpWaveOutHdr, uint uSize); byte[] buffer = new byte[8000]; IntPtr hBuffer = Marshal.AllocHGlobal(buffer.Length); Marshal.Copy(buffer, 0, hBuffer, buffer.Length); IntPtr hHeader = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WAVEHDR))); WAVEHDR header = new WAVEHDR { lpData = hBuffer, dwBufferLength = (uint)buffer.Length, dwBytesRecorded = 0, dwUser = IntPtr.Zero, dwFlags = 0, dwLoops = 0, lpNext = IntPtr.Zero, reserved = IntPtr.Zero }; Marshal.StructureToPtr(header, hHeader, false); waveOutPrepareHeader(hWaveOut, hHeader, (uint)Marshal.SizeOf(typeof(WAVEHDR))); waveOutWrite(hWaveOut, hHeader, (uint)Marshal.SizeOf(typeof(WAVEHDR))); ``` 以上就是使用 waveOut 在 C# 中发声的基本步骤,具体可以根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值