如何在Python中对URL音频流使用Google Speech Recognition?
适配URL音频流到Google Speech Recognition的解决方案
嘿,我懂你现在的困扰——已经用VLC确认音频流能正常播放,但不知道怎么把它对接给Google语音识别对吧?其实核心就是把URL的音频流转换成Google Speech Recognition库能处理的格式,下面给你一步步拆解:
核心思路
Google Speech Recognition的recognize_google()方法需要的是AudioData对象,这个对象可以通过AudioFile类从音频文件或字节流生成。所以我们的任务拆解为:
- 从目标URL拉取音频流的字节数据
- 将字节数据转换成库支持的格式(推荐WAV,兼容性最好)
- 把处理好的音频数据喂给识别器完成语音识别
步骤1:安装依赖库
先在终端装几个必要的工具包:
pip install SpeechRecognition pydub requests
SpeechRecognition:核心的语音识别库pydub:用来转换音频格式(依赖FFmpeg,需要提前安装并加到系统PATH,或者在代码里指定路径)requests:用来拉取URL的音频流
步骤2:单段音频流处理示例
下面是基础版代码,先处理一段音频流做测试,如果是持续流可以改成循环分块处理:
import speech_recognition as sr import requests from pydub import AudioSegment from io import BytesIO # 替换成你的音频流URL AUDIO_STREAM_URL = "https://your-audio-stream-url.com/stream" # 初始化识别器 recognizer = sr.Recognizer() # 拉取音频流(stream=True表示流式获取,不一次性下载全部) try: response = requests.get(AUDIO_STREAM_URL, stream=True) response.raise_for_status() # 请求失败时抛出异常 except requests.exceptions.RequestException as e: print(f"拉取音频流失败: {e}") exit() # 收集音频分块(这里先收集5个1MB的块做示例) audio_chunks = [] for chunk in response.iter_content(chunk_size=1024*1024): if chunk: audio_chunks.append(chunk) if len(audio_chunks) >= 5: break # 合并分块并转换格式(假设原流是MP3,转成WAV) audio_bytes = b''.join(audio_chunks) audio_segment = AudioSegment.from_file(BytesIO(audio_bytes), format="mp3") # 导出为WAV字节流 wav_buffer = BytesIO() audio_segment.export(wav_buffer, format="wav") wav_buffer.seek(0) # 把指针移到字节流开头 # 生成AudioData并执行识别 with sr.AudioFile(wav_buffer) as source: audio_data = recognizer.record(source) try: recognized_text = recognizer.recognize_google(audio_data) print(f"识别结果: {recognized_text}") except sr.UnknownValueError: print("Google识别器无法理解这段音频") except sr.RequestError as e: print(f"请求Google识别服务失败: {e}")
步骤3:适配持续音频流(比如电台)
如果你的音频流是持续播放的,可以把逻辑改成循环处理分块,实现实时识别:
# 省略前面的导入和初始化代码... # 持续处理流式音频 for chunk in response.iter_content(chunk_size=1024*512): # 每次读取512KB if chunk: try: temp_buffer = BytesIO(chunk) audio_segment = AudioSegment.from_file(temp_buffer, format="mp3") wav_buffer = BytesIO() audio_segment.export(wav_buffer, format="wav") wav_buffer.seek(0) with sr.AudioFile(wav_buffer) as source: audio_data = recognizer.record(source) text = recognizer.recognize_google(audio_data) print(f"实时识别: {text}") except Exception as e: # 忽略单块处理失败的情况,继续处理下一块 print(f"处理当前块失败: {e}") continue
注意事项
- FFmpeg安装:pydub依赖FFmpeg完成格式转换,Windows用户可以去官网下载后把bin目录加到系统PATH;Mac用户用
brew install ffmpeg;Linux用户用apt install ffmpeg。 - 格式适配:如果你的音频流本身就是WAV/FLAC格式,可以跳过pydub的转换步骤,直接把字节流喂给
AudioFile。 - API限制:免费版的
recognize_google()有请求频率限制,生产环境建议改用Google Cloud Speech-to-Text API,支持更稳定的流式识别。
内容的提问来源于stack exchange,提问作者Bradley




