文章目录
- import librosa from pydub import AudioSegment # 使用Librosa读取(适合分析) audio, sr = librosa.load(‘input.mp3’, sr=16000) # 采样率设为16kHz # 使用PyDub读取(适合编辑) audio_pydub = AudioSegment.from_file(‘input.wav’, format=’wav’)
- def convert_audio(input_path, output_path, output_format=’wav’): “””转换音频格式并标准化参数””” audio = AudioSegment.from_file(input_path) # 设置标准参数:单声道、16kHz采样率、16bit深度 audio = audio.set_channels(1) # 单声道 audio = audio.set_frame_rate(16000) # 16kHz audio = audio.set_sample_width(2) # 16bit = 2字节 audio.export(output_path, format=output_format) print(f”已转换: {input_path} -> {output_path}”) # 示例:MP3转WAV convert_audio(‘speech.mp3’, ‘speech_16k.wav’)
- 格式类型 读取支持 写入支持 备注 MP3 ✅ ✅ 需安装ffmpeg WAV ✅ ✅ 无损首选 FLAC ✅ ✅ 无损压缩 OGG ✅ ✅ 开源格式 AAC ✅ ❌ 部分库限制 M4A ✅ ❌ 苹果设备常见格式
- import noisereduce as nr from scipy.io import wavfile # 加载音频 rate, audio = wavfile.read(“mixed_audio.wav”) # 提取背景噪声片段(前500ms) noise_clip = audio[:int(rate*0.5)] # 降噪处理 reduced_noise = nr.reduce_noise( y=audio, sr=rate, y_noise=noise_clip, stationary=True, prop_decrease=0.9 ) # 保存结果 wavfile.write(“cleaned_voice.wav”, rate, reduced_noise)
- import spleeter from spleeter.separator import Separator # 初始化分离器(2轨:人声/伴奏) separator = Separator(‘spleeter:2stems’) # 分离音频 separator.separate_to_file(‘song_with_vocals.mp3’, ‘output_folder/’) # 结果路径: # output_folder/song_with_vocals/vocals.wav # output_folder/song_with_vocals/accompaniment.wav
- import numpy as np from scipy.signal import butter, filtfilt def extract_bass(input_path, output_path, lowcut=60, highcut=250): “””提取低频声音(低音部分)””” rate, audio = wavfile.read(input_path) # 设计带通滤波器 nyquist = 0.5 * rate low = lowcut / nyquist high = highcut / nyquist b, a = butter(4, [low, high], btype=’band’) # 应用滤波器 bass_audio = filtfilt(b, a, audio) wavfile.write(output_path, rate, bass_audio.astype(np.int16)) # 提取60-250Hz的低音 extract_bass(‘electronic_music.wav’, ‘bass_only.wav’)
- import librosa import numpy as np y, sr = librosa.load(‘speech.wav’) # 提取MFCC(语音识别关键特征) mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13) print(“MFCC形状:”, mfcc.shape) # (13, 帧数) # 提取色度特征(音乐分析) chroma = librosa.feature.chroma_stft(y=y, sr=sr) print(“色度特征形状:”, chroma.shape) # (12, 帧数) # 提取节拍信息 tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr) beat_times = librosa.frames_to_time(beat_frames, sr=sr) print(f”节拍: {tempo} BPM, 节拍时间点: {beat_times[:5]}”) # 生成频谱图 import matplotlib.pyplot as plt plt.figure(figsize=(10, 4)) D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max) librosa.display.specshow(D, sr=sr, x_axis=’time’, y_axis=’log’) plt.colorbar(format=’%+2.0f dB’) plt.title(‘频谱图’) plt.savefig(‘spectrogram.png’, dpi=300)
- import speech_recognition as sr def speech_to_text(audio_path): r = sr.Recognizer() with sr.AudioFile(audio_path) as source: audio_data = r.record(source) try: text = r.recognize_google(audio_data, language=’zh-CN’) return text except sr.UnknownValueError: return “无法识别音频” except sr.RequestError as e: return f”API请求失败: {str(e)}” # 提取中文语音内容 text_content = speech_to_text(‘chinese_speech.wav’) print(“识别结果:”, text_content)
- def split_on_silence(input_path, output_folder, min_silence_len=500, silence_thresh=-40): “””根据静音自动分割音频文件””” from pydub import AudioSegment from pydub.silence import split_on_silence audio = AudioSegment.from_file(input_path) # 分割音频 chunks = split_on_silence( audio, min_silence_len=min_silence_len, # 静音最小长度(ms) silence_thresh=silence_thresh, # 静音阈值(dBFS) keep_silence=300 # 保留静音段(ms) ) # 导出片段 for i, chunk in enumerate(chunks): chunk.export(f”{output_folder}/segment_{i}.wav”, format=”wav”) print(f”分割完成: 共{len(chunks)}个片段”) # 示例:分割长语音为短句 split_on_silence(“long_lecture.mp3”, “lecture_segments”)
- def extract_time_range(input_path, output_path, start_sec, end_sec): “””提取指定时间段的音频””” from pydub import AudioSegment audio = AudioSegment.from_file(input_path) start_ms = start_sec * 1000 end_ms = end_sec * 1000 segment = audio[start_ms:end_ms] segment.export(output_path, format=”wav”) print(f”已提取 {start_sec}-{end_sec}秒的音频”) # 提取1分30秒到2分钟的片段 extract_time_range(“podcast.mp3”, “highlight.wav”, 90, 120)
- import os from moviepy.editor import VideoFileClip def extract_audio_from_videos(video_folder, output_folder): “””批量提取视频中的音频””” os.makedirs(output_folder, exist_ok=True) for file in os.listdir(video_folder): if file.endswith((‘.mp4’, ‘.mov’, ‘.avi’)): video_path = os.path.join(video_folder, file) output_path = os.path.join(output_folder, f”{os.path.splitext(file)[0]}.mp3″) try: video = VideoFileClip(video_path) video.audio.write_audiofile(output_path, verbose=False) print(f”成功提取: {file}”) except Exception as e: print(f”处理失败 {file}: {str(e)}”) # 提取整个文件夹的视频音频 extract_audio_from_videos(“videos/”, “extracted_audio/”)
- import numpy as np import soundfile as sf def embed_watermark(input_path, output_path, watermark_text): “””将文本水印嵌入音频””” audio, sr = sf.read(input_path) # 将文本转为二进制 binary_msg = ”.join(format(ord(c), ’08b’) for c in watermark_text) binary_msg += ‘00000000’ # 结束标志 # 嵌入到最低有效位(LSB) max_bit = len(audio) // 8 if len(binary_msg) > max_bit: raise ValueError(“水印过长”) for i, bit in enumerate(binary_msg): idx = i * 8 audio[idx] = int(audio[idx]) & 0xFE | int(bit) sf.write(output_path, audio, sr) print(f”水印嵌入成功: {watermark_text}”) def extract_watermark(audio_path): “””从音频中提取水印””” audio, _ = sf.read(audio_path) binary_msg = “” for i in range(0, len(audio), 8): bit = str(int(audio[i]) & 1) binary_msg += bit # 检测结束标志 if len(binary_msg) % 8 == 0 and binary_msg[-8:] == ‘00000000’: break # 二进制转文本 watermark = “” for i in range(0, len(binary_msg)-8, 8): # 忽略结束标志 byte = binary_msg[i:i+8] watermark += chr(int(byte, 2)) return watermark # 使用示例 embed_watermark(“original.wav”, “watermarked.wav”, “Copyright@2024”) extracted = extract_watermark(“watermarked.wav”) print(“提取的水印:”, extracted) # 输出: Copyright@2024
- import soundfile as sf def process_large_audio(input_path, output_path, chunk_size=1024): “””流式处理大音频文件””” with sf.SoundFile(input_path) as infile: with sf.SoundFile(output_path, ‘w’, samplerate=infile.samplerate, channels=infile.channels, subtype=infile.subtype) as outfile: while True: data = infile.read(chunk_size) if len(data) == 0: break # 在此处进行数据处理(示例:音量增大) processed = data * 1.5 outfile.write(processed)
- import cupy as cp import librosa def gpu_mfcc(audio_path): “””使用GPU加速计算MFCC””” y, sr = librosa.load(audio_path) # 将数据转移到GPU y_gpu = cp.asarray(y) # GPU加速的STFT n_fft = 2048 hop_length = 512 window = cp.hanning(n_fft) stft = cp.array([cp.fft.rfft(window * y_gpu[i:i+n_fft]) for i in range(0, len(y_gpu)-n_fft, hop_length)]) # 计算梅尔频谱 mel_basis = librosa.filters.mel(sr, n_fft, n_mels=128) mel_basis_gpu = cp.asarray(mel_basis) mel_spectrogram = cp.dot(mel_basis_gpu, cp.abs(stft.T)**2) # 计算MFCC mfcc = cp.fft.dct(cp.log(mel_spectrogram), axis=0)[:13] return cp.asnumpy(mfcc) # 转回CPU
- def safe_audio_read(path): “””安全的音频读取函数””” try: if path.endswith(‘.mp3’): # PyDub处理MP3更稳定 audio = AudioSegment.from_file(path) samples = np.array(audio.get_array_of_samples()) sr = audio.frame_rate return samples, sr else: return sf.read(path) except Exception as e: print(f”音频读取失败: {str(e)}”) # 尝试使用Librosa作为后备方案 try: return librosa.load(path, sr=None) except: raise RuntimeError(f”所有方法均失败: {path}”)
- 采样率统一:处理前统一为16kHz 格式选择:处理用WAV,存储用FLAC/MP3 内存管理:大文件使用流处理 元数据保留: import mutagen from pydub.utils import mediainfo # 读取元数据 tags = mediainfo(‘song.mp3’).get(‘TAG’, {}) # 写入元数据 audio = mutagen.File(‘song.wav’) audio[‘title’] = ‘New Title’ audio.save() 并行处理: from concurrent.futures import ProcessPoolExecutor def process_file(path): # 处理逻辑 return result with ProcessPoolExecutor() as executor: results = list(executor.map(process_file, audio_files))
- import hashlib def create_audio_fingerprint(audio_path): “””创建音频指纹””” y, sr = librosa.load(audio_path) # 提取关键点 peaks = [] S = np.abs(librosa.stft(y)) for i in range(S.shape[1]): frame = S[:, i] max_idx = np.argmax(frame) peaks.append((max_idx, i)) # (频率bin, 时间帧) # 生成哈希指纹 fingerprints = set() for i in range(len(peaks) – 1): f1, t1 = peaks[i] f2, t2 = peaks[i+1] delta_t = t2 – t1 if 0 < delta_t <= 10: # 限制时间差 hash_val = hashlib.sha1(f”{f1}|{f2}|{delta_t}”.encode()).hexdigest() fingerprints.add(hash_val) return fingerprints # 对比两个音频 fp1 = create_audio_fingerprint(“song1.mp3”) fp2 = create_audio_fingerprint(“song2.mp3″) similarity = len(fp1 & fp2) / max(len(fp1), len(fp2)) print(f”音频相似度: {similarity:.2%}”)
- import pyaudio import numpy as np def real_time_audio_processing(): “””实时音频处理演示””” CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print(“开始实时处理… (按Ctrl+C停止)”) try: while True: data = stream.read(CHUNK) audio = np.frombuffer(data, dtype=np.int16) # 实时音量计算 rms = np.sqrt(np.mean(audio**2)) db = 20 * np.log10(rms / 32768) # 16bit最大值为32768 # 实时显示音量条 bar = ‘#’ * int(np.clip(db + 60, 0, 60)) print(f”r音量: [{bar:<60}] {db:.1f} dB”, end=”) except KeyboardInterrupt: stream.stop_stream() stream.close() p.terminate() print(“n处理结束”) 效能数据:某音频平台优化后: 处理速度提升15倍(GPU加速) 存储空间减少70%(FLAC压缩) 识别准确率提升至98.7%
目录
- 一、环境配置与核心库
- 1. 必备库安装
- 2. 各库功能对比
- 二、音频文件读取与格式转换
- 1. 读取常见音频格式
- 2. 音频格式转换
- 3. 支持格式列表
- 三、核心音频提取技术
- 1. 提取人声(语音分离)
- 2. 提取背景音乐(非人声)
- 3. 提取特定频率范围(如低音)
- 四、高级音频特征提取
- 1. 声谱特征提取
- 2. 语音转文本(内容提取)
- 五、音频分割与处理
- 1. 按静音分割音频
- 2. 提取特定时间段
- 六、实战应用案例
- 1. 批量提取视频中的音频
- 2. 音频水印嵌入与提取
- 七、性能优化与高级技巧
- 1. 流式处理大文件
- 2. GPU加速处理
- 八、错误处理与最佳实践
- 1. 健壮的错误处理
- 2. 最佳实践总结
- 九、扩展应用场景
- 1. 音频指纹识别(Shazam原理)
- 2. 实时音频流处理
- 总结:音频提取技术要点
pip install librosa pydub ffmpeg-python soundfile noisereduce SpeechRecognition
| 库名称 | 核心功能 | 适用场景 | 性能特点 |
|---|---|---|---|
| Librosa | 音频特征提取、频谱分析 | 音乐信息检索、机器学习 | 内存高效,支持流处理 |
| PyDub | 音频文件格式转换、切割 | 简单编辑、格式转换 | 简单易用,依赖FFmpeg |
| SoundFile | 高性能音频读写 | 大规模音频处理 | 无依赖,纯Python实现 |
| FFmpeg-Python | 底层FFmpeg封装 | 专业级音频处理 | 功能强大,学习曲线陡峭 |
import librosa
from pydub import AudioSegment
# 使用Librosa读取(适合分析)
audio, sr = librosa.load('input.mp3', sr=16000) # 采样率设为16kHz
# 使用PyDub读取(适合编辑)
audio_pydub = AudioSegment.from_file('input.wav', format='wav')
def convert_audio(input_path, output_path, output_format='wav'):
"""转换音频格式并标准化参数"""
audio = AudioSegment.from_file(input_path)
# 设置标准参数:单声道、16kHz采样率、16bit深度
audio = audio.set_channels(1) # 单声道
audio = audio.set_frame_rate(16000) # 16kHz
audio = audio.set_sample_width(2) # 16bit = 2字节
audio.export(output_path, format=output_format)
print(f"已转换: {input_path} -> {output_path}")
# 示例:MP3转WAV
convert_audio('speech.mp3', 'speech_16k.wav')
| 格式类型 | 读取支持 | 写入支持 | 备注 |
|---|---|---|---|
| MP3 | ✅ | ✅ | 需安装ffmpeg |
| WAV | ✅ | ✅ | 无损首选 |
| FLAC | ✅ | ✅ | 无损压缩 |
| OGG | ✅ | ✅ | 开源格式 |
| AAC | ✅ | ❌ | 部分库限制 |
| M4A | ✅ | ❌ | 苹果设备常见格式 |
import noisereduce as nr
from scipy.io import wavfile
# 加载音频
rate, audio = wavfile.read("mixed_audio.wav")
# 提取背景噪声片段(前500ms)
noise_clip = audio[:int(rate*0.5)]
# 降噪处理
reduced_noise = nr.reduce_noise(
y=audio,
sr=rate,
y_noise=noise_clip,
stationary=True,
prop_decrease=0.9
)
# 保存结果
wavfile.write("cleaned_voice.wav", rate, reduced_noise)
import spleeter
from spleeter.separator import Separator
# 初始化分离器(2轨:人声/伴奏)
separator = Separator('spleeter:2stems')
# 分离音频
separator.separate_to_file('song_with_vocals.mp3', 'output_folder/')
# 结果路径:
# output_folder/song_with_vocals/vocals.wav
# output_folder/song_with_vocals/accompaniment.wav
import numpy as np
from scipy.signal import butter, filtfilt
def extract_bass(input_path, output_path, lowcut=60, highcut=250):
"""提取低频声音(低音部分)"""
rate, audio = wavfile.read(input_path)
# 设计带通滤波器
nyquist = 0.5 * rate
low = lowcut / nyquist
high = highcut / nyquist
b, a = butter(4, [low, high], btype='band')
# 应用滤波器
bass_audio = filtfilt(b, a, audio)
wavfile.write(output_path, rate, bass_audio.astype(np.int16))
# 提取60-250Hz的低音
extract_bass('electronic_music.wav', 'bass_only.wav')
import librosa
import numpy as np
y, sr = librosa.load('speech.wav')
# 提取MFCC(语音识别关键特征)
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
print("MFCC形状:", mfcc.shape) # (13, 帧数)
# 提取色度特征(音乐分析)
chroma = librosa.feature.chroma_stft(y=y, sr=sr)
print("色度特征形状:", chroma.shape) # (12, 帧数)
# 提取节拍信息
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
beat_times = librosa.frames_to_time(beat_frames, sr=sr)
print(f"节拍: {tempo} BPM, 节拍时间点: {beat_times[:5]}")
# 生成频谱图
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max)
librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('频谱图')
plt.savefig('spectrogram.png', dpi=300)
import speech_recognition as sr
def speech_to_text(audio_path):
r = sr.Recognizer()
with sr.AudioFile(audio_path) as source:
audio_data = r.record(source)
try:
text = r.recognize_google(audio_data, language='zh-CN')
return text
except sr.UnknownValueError:
return "无法识别音频"
except sr.RequestError as e:
return f"API请求失败: {str(e)}"
# 提取中文语音内容
text_content = speech_to_text('chinese_speech.wav')
print("识别结果:", text_content)
def split_on_silence(input_path, output_folder, min_silence_len=500, silence_thresh=-40):
"""根据静音自动分割音频文件"""
from pydub import AudioSegment
from pydub.silence import split_on_silence
audio = AudioSegment.from_file(input_path)
# 分割音频
chunks = split_on_silence(
audio,
min_silence_len=min_silence_len, # 静音最小长度(ms)
silence_thresh=silence_thresh, # 静音阈值(dBFS)
keep_silence=300 # 保留静音段(ms)
)
# 导出片段
for i, chunk in enumerate(chunks):
chunk.export(f"{output_folder}/segment_{i}.wav", format="wav")
print(f"分割完成: 共{len(chunks)}个片段")
# 示例:分割长语音为短句
split_on_silence("long_lecture.mp3", "lecture_segments")
def extract_time_range(input_path, output_path, start_sec, end_sec):
"""提取指定时间段的音频"""
from pydub import AudioSegment
audio = AudioSegment.from_file(input_path)
start_ms = start_sec * 1000
end_ms = end_sec * 1000
segment = audio[start_ms:end_ms]
segment.export(output_path, format="wav")
print(f"已提取 {start_sec}-{end_sec}秒的音频")
# 提取1分30秒到2分钟的片段
extract_time_range("podcast.mp3", "highlight.wav", 90, 120)
import os
from moviepy.editor import VideoFileClip
def extract_audio_from_videos(video_folder, output_folder):
"""批量提取视频中的音频"""
os.makedirs(output_folder, exist_ok=True)
for file in os.listdir(video_folder):
if file.endswith(('.mp4', '.mov', '.avi')):
video_path = os.path.join(video_folder, file)
output_path = os.path.join(output_folder, f"{os.path.splitext(file)[0]}.mp3")
try:
video = VideoFileClip(video_path)
video.audio.write_audiofile(output_path, verbose=False)
print(f"成功提取: {file}")
except Exception as e:
print(f"处理失败 {file}: {str(e)}")
# 提取整个文件夹的视频音频
extract_audio_from_videos("videos/", "extracted_audio/")
import numpy as np
import soundfile as sf
def embed_watermark(input_path, output_path, watermark_text):
"""将文本水印嵌入音频"""
audio, sr = sf.read(input_path)
# 将文本转为二进制
binary_msg = ''.join(format(ord(c), '08b') for c in watermark_text)
binary_msg += '00000000' # 结束标志
# 嵌入到最低有效位(LSB)
max_bit = len(audio) // 8
if len(binary_msg) > max_bit:
raise ValueError("水印过长")
for i, bit in enumerate(binary_msg):
idx = i * 8
audio[idx] = int(audio[idx]) & 0xFE | int(bit)
sf.write(output_path, audio, sr)
print(f"水印嵌入成功: {watermark_text}")
def extract_watermark(audio_path):
"""从音频中提取水印"""
audio, _ = sf.read(audio_path)
binary_msg = ""
for i in range(0, len(audio), 8):
bit = str(int(audio[i]) & 1)
binary_msg += bit
# 检测结束标志
if len(binary_msg) % 8 == 0 and binary_msg[-8:] == '00000000':
break
# 二进制转文本
watermark = ""
for i in range(0, len(binary_msg)-8, 8): # 忽略结束标志
byte = binary_msg[i:i+8]
watermark += chr(int(byte, 2))
return watermark
# 使用示例
embed_watermark("original.wav", "watermarked.wav", "Copyright@2024")
extracted = extract_watermark("watermarked.wav")
print("提取的水印:", extracted) # 输出: Copyright@2024
import soundfile as sf
def process_large_audio(input_path, output_path, chunk_size=1024):
"""流式处理大音频文件"""
with sf.SoundFile(input_path) as infile:
with sf.SoundFile(output_path, 'w',
samplerate=infile.samplerate,
channels=infile.channels,
subtype=infile.subtype) as outfile:
while True:
data = infile.read(chunk_size)
if len(data) == 0:
break
# 在此处进行数据处理(示例:音量增大)
processed = data * 1.5
outfile.write(processed)
import cupy as cp
import librosa
def gpu_mfcc(audio_path):
"""使用GPU加速计算MFCC"""
y, sr = librosa.load(audio_path)
# 将数据转移到GPU
y_gpu = cp.asarray(y)
# GPU加速的STFT
n_fft = 2048
hop_length = 512
window = cp.hanning(n_fft)
stft = cp.array([cp.fft.rfft(window * y_gpu[i:i+n_fft])
for i in range(0, len(y_gpu)-n_fft, hop_length)])
# 计算梅尔频谱
mel_basis = librosa.filters.mel(sr, n_fft, n_mels=128)
mel_basis_gpu = cp.asarray(mel_basis)
mel_spectrogram = cp.dot(mel_basis_gpu, cp.abs(stft.T)**2)
# 计算MFCC
mfcc = cp.fft.dct(cp.log(mel_spectrogram), axis=0)[:13]
return cp.asnumpy(mfcc) # 转回CPU
def safe_audio_read(path):
"""安全的音频读取函数"""
try:
if path.endswith('.mp3'):
# PyDub处理MP3更稳定
audio = AudioSegment.from_file(path)
samples = np.array(audio.get_array_of_samples())
sr = audio.frame_rate
return samples, sr
else:
return sf.read(path)
except Exception as e:
print(f"音频读取失败: {str(e)}")
# 尝试使用Librosa作为后备方案
try:
return librosa.load(path, sr=None)
except:
raise RuntimeError(f"所有方法均失败: {path}")
采样率统一:处理前统一为16kHz
格式选择:处理用WAV,存储用FLAC/MP3
内存管理:大文件使用流处理
元数据保留:
import mutagen
from pydub.utils import mediainfo
# 读取元数据
tags = mediainfo('song.mp3').get('TAG', {})
# 写入元数据
audio = mutagen.File('song.wav')
audio['title'] = 'New Title'
audio.save()
并行处理:
from concurrent.futures import ProcessPoolExecutor
def process_file(path):
# 处理逻辑
return result
with ProcessPoolExecutor() as executor:
results = list(executor.map(process_file, audio_files))
import hashlib
def create_audio_fingerprint(audio_path):
"""创建音频指纹"""
y, sr = librosa.load(audio_path)
# 提取关键点
peaks = []
S = np.abs(librosa.stft(y))
for i in range(S.shape[1]):
frame = S[:, i]
max_idx = np.argmax(frame)
peaks.append((max_idx, i)) # (频率bin, 时间帧)
# 生成哈希指纹
fingerprints = set()
for i in range(len(peaks) - 1):
f1, t1 = peaks[i]
f2, t2 = peaks[i+1]
delta_t = t2 - t1
if 0 < delta_t <= 10: # 限制时间差
hash_val = hashlib.sha1(f"{f1}|{f2}|{delta_t}".encode()).hexdigest()
fingerprints.add(hash_val)
return fingerprints
# 对比两个音频
fp1 = create_audio_fingerprint("song1.mp3")
fp2 = create_audio_fingerprint("song2.mp3")
similarity = len(fp1 & fp2) / max(len(fp1), len(fp2))
print(f"音频相似度: {similarity:.2%}")
import pyaudio
import numpy as np
def real_time_audio_processing():
"""实时音频处理演示"""
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("开始实时处理... (按Ctrl+C停止)")
try:
while True:
data = stream.read(CHUNK)
audio = np.frombuffer(data, dtype=np.int16)
# 实时音量计算
rms = np.sqrt(np.mean(audio**2))
db = 20 * np.log10(rms / 32768) # 16bit最大值为32768
# 实时显示音量条
bar = '#' * int(np.clip(db + 60, 0, 60))
print(f"r音量: [{bar:<60}] {db:.1f} dB", end='')
except KeyboardInterrupt:
stream.stop_stream()
stream.close()
p.terminate()
print("n处理结束")
效能数据:某音频平台优化后:
- 处理速度提升15倍(GPU加速)
- 存储空间减少70%(FLAC压缩)
- 识别准确率提升至98.7%
工具链选择:
- 快速编辑:PyDub
- 专业分析:Librosa + SoundFile
- 流处理:FFmpeg-Python
处理流程标准化:

性能关键点:
- 采样率统一为16kHz
- 大文件使用流处理
- 复杂计算启用GPU加速
创新应用:
- 结合AI模型进行语音情感分析
- 音频水印版权保护
- 实时音频监控系统
通过掌握Python音频处理技术栈,您可高效完成从基础提取到高级分析的全流程任务。建议结合FastAPI等框架构建音频处理微服务,实现企业级应用部署。
到此这篇关于从基础到高级详解Python音频提取全攻略的文章就介绍到这了,更多相关Python音频提取内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- 详解如何使用Python提取视频文件中的音频
- Python+moviepy实现音频/视频提取器
- 使用python提取PowerPoint中的音频和视频
- python提取视频中的音频的实现示例
- Python实现音频提取的示例详解
- python 提取视频中的音频工具类详解
- 提取视频中的音频 Python只需要三行代码!
- Python从视频中提取音频的操作