You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中对URL音频流使用Google Speech Recognition?

适配URL音频流到Google Speech Recognition的解决方案

嘿,我懂你现在的困扰——已经用VLC确认音频流能正常播放,但不知道怎么把它对接给Google语音识别对吧?其实核心就是把URL的音频流转换成Google Speech Recognition库能处理的格式,下面给你一步步拆解:

核心思路

Google Speech Recognition的recognize_google()方法需要的是AudioData对象,这个对象可以通过AudioFile类从音频文件或字节流生成。所以我们的任务拆解为:

  1. 从目标URL拉取音频流的字节数据
  2. 将字节数据转换成库支持的格式(推荐WAV,兼容性最好)
  3. 把处理好的音频数据喂给识别器完成语音识别

步骤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

火山引擎 最新活动