Qwen3-ASR-1.7B语音识别模型在Python爬虫数据采集中的应用实战

张开发
2026/4/21 16:31:30 15 分钟阅读

分享文章

Qwen3-ASR-1.7B语音识别模型在Python爬虫数据采集中的应用实战
Qwen3-ASR-1.7B语音识别模型在Python爬虫数据采集中的应用实战你是不是也遇到过这种情况辛辛苦苦写了个爬虫结果目标网站的关键信息都藏在视频里或者音频文件里文字内容少得可怜。看着那些有用的数据就在眼前却因为音频转文字这个坎过不去只能干瞪眼。我之前做电商数据分析的时候经常需要采集商品介绍视频里的参数信息。一开始用传统的语音识别工具要么识别不准要么速度慢得让人抓狂。后来试了试Qwen3-ASR-1.7B发现这玩意儿在爬虫场景里还真有点意思。今天就跟大家聊聊怎么把这个语音识别模型跟Python爬虫结合起来让咱们的数据采集工作更高效一些。1. 为什么要在爬虫里用语音识别你可能觉得爬虫就是抓取网页文本跟语音识别八竿子打不着。但实际上现在很多网站的内容形式越来越丰富音频和视频内容占比越来越高。比如说你想采集某个在线教育平台的所有课程内容。如果只抓取文字部分可能会错过老师讲解视频里的关键知识点。再比如做新闻舆情分析很多新闻网站都有视频报道里面的采访内容往往比文字稿更丰富。传统的做法是先用爬虫把音频视频文件下载下来然后用第三方语音转文字服务处理。但这样有几个问题一是成本高二是速度慢三是隐私数据要上传到别人的服务器。如果能在本地直接处理这些问题就都解决了。Qwen3-ASR-1.7B正好提供了这个可能性——它支持52种语言和方言识别准确率不错而且可以在本地部署不需要联网调用API。2. 环境准备与模型部署先说说怎么把这个模型跑起来。Qwen3-ASR-1.7B的部署比想象中简单官方提供了比较完整的工具链。2.1 基础环境搭建首先确保你的Python环境是3.8以上版本然后安装必要的依赖# 安装ModelScope这是阿里官方的模型管理工具 pip install modelscope # 安装Qwen3-ASR的推理框架 pip install qwen-asr # 如果需要流式推理可以安装vLLM后端 pip install qwen-asr[vllm]如果你的机器有GPU建议用GPU跑速度会快很多。没有GPU的话CPU也能用就是慢一些。2.2 下载模型权重模型可以通过ModelScope直接下载from modelscope import snapshot_download # 下载Qwen3-ASR-1.7B模型 model_dir snapshot_download(Qwen/Qwen3-ASR-1.7B) print(f模型下载到: {model_dir})第一次运行会下载模型文件大概3-4个G。下载完成后后续使用就不需要再下载了。2.3 简单测试一下下载完可以先跑个简单的测试看看模型能不能正常工作import torch from qwen_asr import Qwen3ASRModel # 加载模型 model Qwen3ASRModel.from_pretrained( Qwen/Qwen3-ASR-1.7B, dtypetorch.bfloat16, device_mapcuda:0 if torch.cuda.is_available() else cpu, max_inference_batch_size32, max_new_tokens256, ) # 测试一个在线音频 results model.transcribe( audiohttps://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-ASR-Repo/asr_en.wav, languageNone, # 自动检测语言 ) print(f检测到的语言: {results[0].language}) print(f识别结果: {results[0].text})如果能看到正常的识别结果说明环境配置没问题了。3. 爬虫与语音识别的结合实战现在进入正题看看怎么在爬虫项目里实际应用这个模型。3.1 场景一批量处理视频网站的字幕提取很多视频网站不提供字幕下载或者字幕不完整。这时候我们可以用爬虫下载视频然后提取音频进行识别。假设我们要采集某个知识分享平台的视频内容import os import requests from bs4 import BeautifulSoup from qwen_asr import Qwen3ASRModel import torch import subprocess class VideoContentCrawler: def __init__(self): # 初始化语音识别模型 self.asr_model Qwen3ASRModel.from_pretrained( Qwen/Qwen3-ASR-1.7B, device_mapcuda:0 if torch.cuda.is_available() else cpu, ) def extract_audio_from_video(self, video_path, audio_path): 使用ffmpeg从视频中提取音频 cmd [ ffmpeg, -i, video_path, -vn, -acodec, pcm_s16le, -ar, 16000, -ac, 1, audio_path, -y ] subprocess.run(cmd, checkTrue, capture_outputTrue) def crawl_video_page(self, url): 爬取视频页面 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } response requests.get(url, headersheaders) soup BeautifulSoup(response.text, html.parser) # 假设视频链接在特定的标签中 video_tag soup.find(video) if video_tag and video_tag.get(src): video_url video_tag[src] # 下载视频文件 video_path temp_video.mp4 self.download_file(video_url, video_path) # 提取音频 audio_path temp_audio.wav self.extract_audio_from_video(video_path, audio_path) # 语音识别 results self.asr_model.transcribe(audioaudio_path) transcript results[0].text # 清理临时文件 os.remove(video_path) os.remove(audio_path) return transcript return None def download_file(self, url, save_path): 下载文件 response requests.get(url, streamTrue) with open(save_path, wb) as f: for chunk in response.iter_content(chunk_size8192): f.write(chunk) def process_batch_urls(self, urls): 批量处理多个视频页面 transcripts {} for url in urls: print(f正在处理: {url}) try: transcript self.crawl_video_page(url) if transcript: transcripts[url] transcript print(f成功提取 {len(transcript)} 字符的文本) else: print(未找到视频内容) except Exception as e: print(f处理失败: {e}) return transcripts # 使用示例 if __name__ __main__: crawler VideoContentCrawler() # 假设有一些视频页面URL video_urls [ https://example.com/video1, https://example.com/video2, # ... 更多URL ] results crawler.process_batch_urls(video_urls[:3]) # 先测试3个 # 保存结果 import json with open(video_transcripts.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2)这个方案的好处是即使网站没有提供字幕我们也能把视频内容转成文本。对于做内容分析、知识库构建特别有用。3.2 场景二实时处理音频流数据有些网站提供实时音频流比如在线电台、直播平台。Qwen3-ASR支持流式推理可以边接收音频边识别。import numpy as np import soundfile as sf from qwen_asr import Qwen3ASRModel import io class StreamingAudioProcessor: def __init__(self): # 使用vLLM后端进行流式推理 self.asr Qwen3ASRModel.LLM( modelQwen/Qwen3-ASR-1.7B, gpu_memory_utilization0.8, max_new_tokens32, # 流式推理设置较小的token数 ) def process_streaming_audio(self, audio_chunks, sample_rate16000): 处理音频流数据 # 初始化流式状态 state self.asr.init_streaming_state( unfixed_chunk_num2, unfixed_token_num5, chunk_size_sec2.0, ) transcripts [] for i, chunk in enumerate(audio_chunks): # 确保音频是16kHz采样率 if sample_rate ! 16000: chunk self.resample_audio(chunk, sample_rate, 16000) # 流式识别 self.asr.streaming_transcribe(chunk, state) # 获取当前识别结果 current_text state.text if current_text and (i 0 or current_text ! transcripts[-1]): transcripts.append(current_text) print(fChunk {i}: {current_text}) # 结束流式识别 self.asr.finish_streaming_transcribe(state) final_text state.text print(f最终结果: {final_text}) return final_text def resample_audio(self, audio, orig_sr, target_sr): 简单的重采样 duration len(audio) / orig_sr target_length int(duration * target_sr) # 线性插值重采样 x_old np.linspace(0, duration, len(audio), endpointFalse) x_new np.linspace(0, duration, target_length, endpointFalse) return np.interp(x_new, x_old, audio).astype(np.float32) # 模拟从网络流中获取音频数据 def simulate_audio_stream(url, chunk_duration_ms1000): 模拟音频流实际中可能来自网络socket或HTTP流 # 这里简化处理实际需要根据具体协议获取音频数据 pass流式处理特别适合实时监控场景比如监控某个直播间的发言内容或者实时分析会议录音。3.3 场景三多语言网站内容采集Qwen3-ASR支持52种语言和方言这对于采集多语言网站特别有用。很多跨境电商网站、国际新闻网站都有多语言内容。import pandas as pd from qwen_asr import Qwen3ASRModel import torch class MultilingualCrawler: def __init__(self): self.asr_model Qwen3ASRModel.from_pretrained( Qwen/Qwen3-ASR-1.7B, device_mapcuda:0 if torch.cuda.is_available() else cpu, ) def process_multilingual_audio(self, audio_files): 处理多语言音频文件 results [] for audio_file in audio_files: try: # 让模型自动检测语言 transcription self.asr_model.transcribe( audioaudio_file, languageNone # 自动检测 ) result { file: audio_file, detected_language: transcription[0].language, transcript: transcription[0].text, confidence: getattr(transcription[0], confidence, None) } results.append(result) print(f文件: {audio_file}) print(f检测语言: {result[detected_language]}) print(f识别结果: {result[transcript][:100]}...) print(- * 50) except Exception as e: print(f处理 {audio_file} 失败: {e}) results.append({ file: audio_file, error: str(e) }) # 保存到CSV df pd.DataFrame(results) df.to_csv(multilingual_transcripts.csv, indexFalse, encodingutf-8-sig) return df # 使用示例 if __name__ __main__: crawler MultilingualCrawler() # 假设有一批多语言音频文件 audio_files [ english_presentation.wav, chinese_interview.mp3, spanish_news.ogg, japanese_podcast.m4a ] # 只处理存在的文件 existing_files [f for f in audio_files if os.path.exists(f)] if existing_files: results crawler.process_multilingual_audio(existing_files) print(f处理完成共 {len(results)} 个文件) else: print(未找到音频文件)这个功能对于做跨国舆情分析、多语言内容审核特别有用。不需要为每种语言单独训练模型一个模型搞定多种语言。4. 性能优化与实践建议在实际爬虫项目中使用语音识别还需要考虑一些性能和实践问题。4.1 批量处理优化如果有很多音频文件要处理逐个处理效率太低。Qwen3-ASR支持批量推理可以一次处理多个文件def batch_process_audios(audio_paths, batch_size8): 批量处理音频文件 all_results [] for i in range(0, len(audio_paths), batch_size): batch audio_paths[i:ibatch_size] print(f处理批次 {i//batch_size 1}: {len(batch)} 个文件) try: # 批量转录 batch_results model.transcribe(audiobatch) for audio_path, result in zip(batch, batch_results): all_results.append({ file: audio_path, text: result.text, language: result.language }) except Exception as e: print(f批次处理失败: {e}) # 失败的话回退到单个处理 for audio_path in batch: try: result model.transcribe(audioaudio_path) all_results.append({ file: audio_path, text: result[0].text, language: result[0].language }) except: print(f文件 {audio_path} 处理失败) return all_results4.2 错误处理与重试机制网络爬虫经常遇到各种异常需要完善的错误处理import time from functools import wraps def retry_on_failure(max_retries3, delay1): 重试装饰器 def decorator(func): wraps(func) def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except Exception as e: if attempt max_retries - 1: raise print(f尝试 {attempt 1} 失败: {e}, {delay}秒后重试...) time.sleep(delay) return None return wrapper return decorator class RobustAudioCrawler: def __init__(self): self.asr_model None self._init_model() retry_on_failure(max_retries2, delay2) def _init_model(self): 初始化模型失败重试 self.asr_model Qwen3ASRModel.from_pretrained( Qwen/Qwen3-ASR-1.7B, device_mapcuda:0 if torch.cuda.is_available() else cpu, ) retry_on_failure(max_retries3, delay1) def transcribe_with_retry(self, audio_path): 带重试的转录 return self.asr_model.transcribe(audioaudio_path)4.3 资源管理与清理语音识别模型比较耗内存长时间运行的爬虫需要注意资源管理import gc import psutil import threading class ResourceAwareCrawler: def __init__(self, memory_threshold0.9): self.memory_threshold memory_threshold self._check_memory_periodically() def _check_memory_periodically(self): 定期检查内存使用 def monitor(): while True: memory_percent psutil.virtual_memory().percent / 100 if memory_percent self.memory_threshold: print(f内存使用过高: {memory_percent:.1%}, 清理缓存...) self._cleanup() time.sleep(60) # 每分钟检查一次 thread threading.Thread(targetmonitor, daemonTrue) thread.start() def _cleanup(self): 清理资源 if torch.cuda.is_available(): torch.cuda.empty_cache() gc.collect() def process_large_dataset(self, audio_files): 处理大型数据集自动管理资源 results [] for i, audio_file in enumerate(audio_files): # 每处理100个文件清理一次 if i % 100 0 and i 0: self._cleanup() print(f已处理 {i} 个文件清理缓存) try: result self.transcribe_audio(audio_file) results.append(result) except Exception as e: print(f处理 {audio_file} 失败: {e}) results.append({file: audio_file, error: str(e)}) return results5. 实际效果与注意事项我用这个方案处理过几个实际项目说说真实感受。识别准确率方面对于清晰的普通话和英语Qwen3-ASR-1.7B的表现确实不错跟商业API差不多。特别是它支持多种方言处理一些带口音的内容比之前用的开源模型要好。速度上用GPU的话一小时音频大概需要2-3分钟处理完。如果是批量处理还能更快一些。不过要注意模型加载需要一些时间所以最好是长时间运行的爬虫服务不要频繁启停。内存占用方面1.7B的模型大概需要4-6G的GPU内存。如果没有GPU用CPU跑内存占用会少一些但速度会慢很多。有几个实际使用中的小建议第一音频预处理很重要。如果原始音频质量差识别效果会大打折扣。可以先做个简单的降噪或者音量归一化。第二对于特别长的音频可以考虑先分段。虽然模型支持20分钟的长音频但分段处理有时候效果更好也方便出错时重试。第三如果爬虫需要处理大量音频建议做个缓存机制。同样的音频不要重复识别既节省时间也节省资源。第四注意版权和法律问题。爬取和识别音频内容要确保有合法授权特别是商业用途。6. 总结把Qwen3-ASR-1.7B用到Python爬虫里确实能解决一些传统爬虫处理不了的问题。特别是现在音频视频内容越来越多这个方案能让你的数据采集更全面。从技术实现上看部署和使用都不算复杂官方提供的工具链比较完善。性能方面对于大多数爬虫场景应该够用了毕竟不是要求毫秒级响应的实时系统。当然也有局限比如模型大小、资源消耗这些。如果只是偶尔处理几个小文件可能用在线服务更方便。但如果需要处理大量数据或者对数据隐私有要求本地部署的方案就更合适。实际用下来我觉得最实用的场景还是那些音频视频内容为主的网站。以前看到这些网站就头疼现在至少有个可行的处理方案了。如果你也在做类似的数据采集工作不妨试试这个组合说不定能打开新思路。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章