mediautil

package
v0.0.0-...-b558408 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 2, 2026 License: MIT Imports: 10 Imported by: 4

Documentation

Index

Constants

View Source
const (
	// SampleRate8K 采样率 8KHz
	SampleRate8K = 8000
	// SampleRate16K 采样率 16KHz
	SampleRate16K = 16000
	// SampleRate44K 采样率 44.1KHz
	SampleRate44K = 44100
	// SampleRate48K 采样率 48KHz
	SampleRate48K = 48000
	// SampleRate96K 采样率 96KHz
	SampleRate96K = 96000

	// BitsPerSample16 位深 16
	BitsPerSample16 = 16
	// BitsPerSample24 位深 24
	BitsPerSample24 = 24
	// BitsPerSample32 位深 32
	BitsPerSample32 = 32
)

Variables

View Source
var (
	// ErrNotWavFile 不是有效的 WAV 文件
	ErrNotWavFile = errors.New("not a valid RIFF/WAVE file")
	// ErrUnsupportedBitDepth 不支持的位深
	ErrUnsupportedBitDepth = errors.New("unsupported bit depth: only 16, 24, 32 are supported")
)

常见错误定义

Functions

func ApplyCMVN

func ApplyCMVN(features [][]float32, negMean []float32, invStd []float32)

ApplyCMVN 倒谱均值方差归一化 (Cepstral Mean and Variance Normalization)

公式: result = (x + negMean) * invStd

Params:

features: 特征矩阵 negMean: 负均值向量 invStd: 逆标准差向量

func FFT

func FFT(x []complex128) []complex128

FFT 快速傅里叶变换,时域转频域

Params:

x: 时域数据(波形)

func Float32ToPcmBytes

func Float32ToPcmBytes(data []float32, bitsPerSample int) ([]byte, error)

Float32ToPcmBytes 将标准浮点音频数据转换为指定位深的 PCM 字节流

Params:

data:
 - 音频采样点数组 (Amplitudes)
 - 值域理论上应在 -1.0 到 +1.0 之间 (0.0 表示静音)
 - 超出范围的值会被削波 (Clipping) 处理
bitsPerSample: 位深,例如: 16(CD音质), 24(专业录音), 32

func Float32ToWavBytes

func Float32ToWavBytes(data []float32, sampleRate, channels, bitsPerSample int) ([]byte, error)

Float32ToWavBytes 将标准浮点音频数据转换为完整的 WAV 文件字节流 包含 WAV 头部 (Header) 和 PCM 数据体

Params:

data: 原始音频数据
 - 单声道 (Mono): [样本1, 样本2, 样本3, ...]
 - 双声道 (Stereo): [左1, 右1, 左2, 右2, 左3, 右3, ...]
sampleRate: 采样率
channels: 声道数
bitsPerSample: 位深

func HammingWindow

func HammingWindow(size int) []float32

HammingWindow 生成汉明窗,减少频谱泄漏

Hamming 公式: 0.54 - 0.46 * cos(2πn / (N-1))

Params:

size: 窗口大小

func HannWindow

func HannWindow(size int) []float32

HannWindow 生成汉宁窗

Hann 公式: 0.5 * (1 - cos(2πn / N))

Params:

size: 窗口大小

func MelFilters

func MelFilters(sampleRate, fftSize, melBinCount int, fMin, fMax float64) [][]float32

MelFilters 生成 Mel 滤波器组权重矩阵,将线性频率映射到Mel刻度

Params:

sampleRate: 采样率
fftSize: FFT 窗口大小
melBinCount: Mel 频带数量
fMin: 最小频率
fMax: 最大频率

func PcmBytesToFloat32

func PcmBytesToFloat32(data []byte, bitPerSample int) ([]float32, error)

PcmBytesToFloat32 PCM 字节流转 float32 数组

Params:

data: 原始 PCM 数据
bitPerSample: 位深,支持 16, 24, 32 bit

func PreEmphasis

func PreEmphasis(samples []float32, alpha float32) []float32

PreEmphasis 预加重滤波器,提升高频部分,平衡频谱能量

差分公式: y[t] = x[t] - alpha * x[t-1]

Params:

samples: 输入的音频数据
alpha: 预加重系数,推荐 0.97

func ReformatWavBytes

func ReformatWavBytes(wavData []byte, targetRate, targetChannels, targetBitPerSample int) ([]byte, error)

ReformatWavBytes WAV 字节流格式转换

支持:位深转换、采样率转换、声道转换

Params:

wavData: 原始 WAV 文件数据
targetRate: 目标采样率
targetChannels: 目标声道数
targetBitPerSample: 目标位深

func SaveWav

func SaveWav(filePath string, pcmData []byte, sampleRate, channels, bitsPerSample int) error

SaveWav 将 PCM 数据保存为本地 WAV 文件

Params:

filePath: 文件路径
pcmData: 原始 PCM 数据
sampleRate: 采样率,例如: 16000(16KHz), 44100(44.1KHz)
channels: 声道数
bitsPerSample: 位深,例如: 16(CD音质), 24(专业录音), 32

func WriteWav

func WriteWav(w io.Writer, pcmData []byte, sampleRate, channels, bitsPerSample int) error

WriteWav 将 PCM 数据封装为 WAV 格式写入 io.Writer

Params:

w: 写入目标
pcmData: 原始 PCM 数据
sampleRate: 采样率
channels: 声道数
bitsPerSample: 位深

Types

type WavHeader

type WavHeader struct {
	// RIFF Chunk
	ChunkID   [4]byte // "RIFF"
	ChunkSize uint32  // 文件总大小 - 8 字节
	Format    [4]byte // "WAVE"

	// fmt Chunk
	Subchunk1ID   [4]byte // "fmt "
	Subchunk1Size uint32  // 通常为 16 (针对 PCM)
	AudioFormat   uint16  // 音频格式: 1 = PCM (无损), 3 = IEEE Float
	NumChannels   uint16  // 声道数: 1 = Mono, 2 = Stereo
	SampleRate    uint32  // 采样率: e.g., 44100, 16000
	ByteRate      uint32  // 传输速率: SampleRate * NumChannels * BitsPerSample / 8
	BlockAlign    uint16  // 块对齐: NumChannels * BitsPerSample / 8
	BitsPerSample uint16  // 位深: e.g., 16, 24, 32

	// data Chunk
	Subchunk2ID   [4]byte // "data"
	Subchunk2Size uint32  // 音频数据的字节大小
}

WavHeader 定义了标准的 WAV 文件头 (44 bytes) 对应 RIFF WAVE 格式标准

func ParseWavHeader

func ParseWavHeader(data []byte) (*WavHeader, error)

ParseWavHeader 从字节切片中解析 WAV 头部

Params:

data: 包含 WAV 头部信息的字节切片

func ReadWavHeader

func ReadWavHeader(filePath string) (*WavHeader, error)

ReadWavHeader 从文件中读取 WAV 头部

Params:

filePath: wav文件路径

func (*WavHeader) GetDuration

func (h *WavHeader) GetDuration() time.Duration

GetDuration 根据头部信息计算音频时长

func (*WavHeader) String

func (h *WavHeader) String() string

String 格式化输出头部关键信息

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL