golang原生音频处理插件库GoAudio的使用

GoAudio 🎶

GoAudio 是一个音频处理库,目前支持 WAVE 文件格式。该库提供了一些与编码无关的工具,如合成器和断点功能,因此您可以将其与其他用于存储数据的库结合使用,仅使用 GoAudio 作为生成波形的手段。

功能特性

  • Wave 文件处理 - 读写 Wave 文件
  • 合成器 - 使用不同类型的振荡器创建不同的波形
  • 断点 - 创建自动化轨道/包络

使用示例

下面是一个完整的 GoAudio 使用示例,展示如何创建一个简单的正弦波并将其保存为 WAV 文件:

package main

import (
	"github.com/DylanMeeus/GoAudio/synthesizer"
	"github.com/DylanMeeus/GoAudio/wave"
)

func main() {
	// 设置音频参数
	sampleRate := 44100
	duration := 2.0 // 2秒
	freq := 440.0   // 440Hz (A4音高)

	// 创建振荡器
	osc := synthesizer.NewOscillator(sampleRate, synthesizer.Sine)
	defer osc.Close()

	// 生成音频帧
	frames := osc.Synthesize(duration, freq)

	// 创建 Wave 文件
	wfmt := wave.NewWaveFmt(1, 1, sampleRate, 16, nil)
	wave, err := wave.NewWaveFile(wfmt, frames)
	if err != nil {
		panic(err)
	}

	// 保存为 WAV 文件
	if err := wave.WriteToFile("sine.wav"); err != nil {
		panic(err)
	}
}

合成器示例

以下示例展示如何使用不同的振荡器类型生成波形:

package main

import (
	"github.com/DylanMeeus/GoAudio/synthesizer"
)

func main() {
	sampleRate := 44100
	duration := 2.0
	freq := 440.0

	// 创建不同类型的振荡器
	sineOsc := synthesizer.NewOscillator(sampleRate, synthesizer.Sine)
	squareOsc := synthesizer.NewOscillator(sampleRate, synthesizer.Square)
	sawOsc := synthesizer.NewOscillator(sampleRate, synthesizer.Saw)
	triangleOsc := synthesizer.NewOscillator(sampleRate, synthesizer.Triangle)

	// 生成不同波形
	sineWave := sineOsc.Synthesize(duration, freq)
	squareWave := squareOsc.Synthesize(duration, freq)
	sawWave := sawOsc.Synthesize(duration, freq)
	triangleWave := triangleOsc.Synthesize(duration, freq)

	// 这里可以保存或处理生成的波形...
}

断点功能示例

断点功能可以用于创建自动化轨道或包络:

package main

import (
	"github.com/DylanMeeus/GoAudio/breakpoint"
	"github.com/DylanMeeus/GoAudio/synthesizer"
	"github.com/DylanMeeus/GoAudio/wave"
)

func main() {
	sampleRate := 44100
	duration := 5.0 // 5秒
	freq := 440.0

	// 创建断点包络
	bp := breakpoint.NewBreakpoint()
	bp.AddPoint(0.0, 0.0)    // 开始静音
	bp.AddPoint(1.0, 1.0)    // 1秒后达到最大音量
	bp.AddPoint(4.0, 0.5)    // 4秒时音量减半
	bp.AddPoint(5.0, 0.0)    // 5秒时静音

	// 创建振荡器
	osc := synthesizer.NewOscillator(sampleRate, synthesizer.Sine)
	defer osc.Close()

	// 生成带包络的音频
	frames := osc.SynthesizeWithBreakpoint(duration, freq, bp)

	// 保存为 WAV 文件
	wfmt := wave.NewWaveFmt(1, 1, sampleRate, 16, nil)
	wave, err := wave.NewWaveFile(wfmt, frames)
	if err != nil {
		panic(err)
	}

	if err := wave.WriteToFile("envelope.wav"); err != nil {
		panic(err)
	}
}

这些示例展示了 GoAudio 库的基本用法,您可以根据需要进一步扩展和组合这些功能来创建更复杂的音频处理应用。


更多关于golang原生音频处理插件库GoAudio的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang原生音频处理插件库GoAudio的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoAudio: Go语言原生音频处理库

GoAudio是一个纯Go语言实现的音频处理库,不需要依赖外部C库,非常适合需要跨平台部署的音频处理应用。下面我将介绍GoAudio的主要功能和使用方法。

安装

go get github.com/DylanMeeus/GoAudio

核心功能

1. 波形生成

GoAudio可以生成各种基本波形:

package main

import (
	"github.com/DylanMeeus/GoAudio/wave"
	"math"
	"os"
)

func main() {
	// 创建44100Hz采样率,16位深度,单声道的波形
	opts := wave.WaveFmt{
		SampleRate:      44100,
		BitsPerSample:  16,
		NumberOfSamples: 44100, // 1秒音频
		NumChannels:    1,
		AudioFormat:    1, // PCM
	}

	// 生成正弦波
	sineWave := make([]float64, opts.NumberOfSamples)
	for i := 0; i < opts.NumberOfSamples; i++ {
		freq := 440.0 // A4音符
		t := float64(i) / float64(opts.SampleRate)
		sineWave[i] = math.Sin(2 * math.Pi * freq * t)
	}

	// 写入WAV文件
	f, _ := os.Create("sine.wav")
	defer f.Close()
	wave.WriteWaveFile(sineWave, opts, f)
}

2. 音频文件读写

package main

import (
	"fmt"
	"github.com/DylanMeeus/GoAudio/wave"
	"os"
)

func main() {
	// 读取WAV文件
	f, _ := os.Open("input.wav")
	defer f.Close()
	wav, err := wave.ReadWaveFile(f)
	if err != nil {
		panic(err)
	}

	fmt.Printf("采样率: %d\n", wav.SampleRate)
	fmt.Printf("位深度: %d\n", wav.BitsPerSample)
	fmt.Printf("声道数: %d\n", wav.NumChannels)
	fmt.Printf("采样数: %d\n", len(wav.Frames))

	// 修改音频数据
	for i := range wav.Frames {
		wav.Frames[i] *= 0.5 // 音量减半
	}

	// 写入新文件
	out, _ := os.Create("output.wav")
	defer out.Close()
	wave.WriteFrames(wav, out)
}

3. 音频处理

package main

import (
	"github.com/DylanMeeus/GoAudio/wave"
	"github.com/DylanMeeus/GoAudio/filter"
	"os"
)

func main() {
	// 读取音频文件
	f, _ := os.Open("input.wav")
	defer f.Close()
	wav, _ := wave.ReadWaveFile(f)

	// 创建低通滤波器 (截止频率1000Hz)
	lpf := filter.NewLowPass(1000, float64(wav.SampleRate), 0.5)

	// 应用滤波器
	filtered := make([]float64, len(wav.Frames))
	for i, sample := range wav.Frames {
		filtered[i] = lpf.Tick(sample)
	}

	// 保存结果
	out, _ := os.Create("filtered.wav")
	defer out.Close()
	wave.WriteWaveFile(filtered, wave.WaveFmt{
		SampleRate:      wav.SampleRate,
		BitsPerSample:   wav.BitsPerSample,
		NumberOfSamples: len(filtered),
		NumChannels:     wav.NumChannels,
		AudioFormat:     1,
	}, out)
}

4. 实时音频处理

GoAudio可以与PortAudio结合实现实时音频处理:

package main

import (
	"github.com/DylanMeeus/GoAudio/components"
	"github.com/gordonklaus/portaudio"
)

func main() {
	portaudio.Initialize()
	defer portaudio.Terminate()

	// 创建音频流
	stream, _ := portaudio.OpenDefaultStream(0, 1, 44100, 0, 
		func(out []float32) {
			// 在这里处理实时音频
			for i := range out {
				out[i] = float32(components.SineWave(440, 44100, i))
			}
		})

	stream.Start()
	defer stream.Stop()

	// 运行5秒
	select {}
}

高级功能

1. 多轨道混合

func mixTracks(track1, track2 []float64, volume1, volume2 float64) []float64 {
	maxLen := len(track1)
	if len(track2) > maxLen {
		maxLen = len(track2)
	}

	mixed := make([]float64, maxLen)
	for i := 0; i < maxLen; i++ {
		var s1, s2 float64
		if i < len(track1) {
			s1 = track1[i] * volume1
		}
		if i < len(track2) {
			s2 = track2[i] * volume2
		}
		mixed[i] = s1 + s2
	}
	return mixed
}

2. 音频分析

package main

import (
	"fmt"
	"github.com/DylanMeeus/GoAudio/analyse"
	"github.com/DylanMeeus/GoAudio/wave"
	"os"
)

func main() {
	f, _ := os.Open("audio.wav")
	defer f.Close()
	wav, _ := wave.ReadWaveFile(f)

	// 计算RMS (音量)
	rms := analyse.RMS(wav.Frames)
	fmt.Printf("RMS: %f\n", rms)

	// 计算零交叉率
	zcr := analyse.ZeroCrossingRate(wav.Frames)
	fmt.Printf("Zero Crossing Rate: %f\n", zcr)
}

性能考虑

GoAudio是纯Go实现,对于高性能需求:

  1. 对于大量音频数据,考虑使用goroutine并行处理
  2. 使用[]float32而不是[]float64可以减少内存使用
  3. 对于实时处理,预分配缓冲区避免GC压力

总结

GoAudio提供了从基础波形生成到高级音频处理的完整功能,全部用Go实现,无需外部依赖。虽然性能可能不如专业音频处理库,但对于大多数应用场景已经足够,且具有极好的可移植性。

对于更复杂的需求,可以考虑结合PortAudio进行实时音频处理,或者使用GoAudio进行离线处理后再输出。

回到顶部