You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Speech Recognition API转写异常及音频分割实现技术咨询

我来帮你拆解这两个问题,结合Google Speech Recognition的常见坑和音频处理的最佳实践来解答:

问题1:为何Google Speech Recognition API仅返回音频转写文本的部分内容?

这是个很常见的问题,大概率是以下几个原因导致的,对应解决方法也给你列出来了:

  • 音频时长超出API限制:Google Speech-to-Text的同步识别请求(直接发请求等结果的方式)默认最长支持1分钟的音频。如果你的音频超过这个时长,API会自动截断,只返回前1分钟的转写结果。异步批量识别支持更长的音频,但需要额外配置。
  • 音频质量不达标:API对音频格式、采样率、信噪比有要求。如果你的音频是低采样率(比如8kHz)、多声道、有严重背景噪音或者音量过低,识别引擎可能无法精准解析后半段内容,直接返回部分可识别的文本。
  • 网络或请求中断:如果调用API时网络不稳定,音频数据没完全传到谷歌服务器,或者请求中途超时,服务器只会处理已经收到的部分音频,自然返回不完整结果。
  • 参数设置失误:比如不小心设置了max_results这类限制返回条数的参数,或者流式识别时没有正确处理数据流的结束标记,导致识别提前终止。

对应的解决方法:

  1. 超过1分钟的音频,要么改用异步批量识别,要么像你已经在做的那样,分割成短片段用同步请求处理。
  2. 预处理音频:转成16kHz采样率、单声道的WAV/FLAC格式,用工具(比如Audacity)去除背景噪音、提高音量,确保音频清晰。
  3. 检查网络连接,给请求加超时重试机制,避免中途断连。
  4. 核对API调用参数,移除不必要的返回限制,流式识别要确保正确发送结束信号。
问题2:音频分割类的完善建议

你给出的代码片段不完整,我帮你补全并优化了这个分割类,同时加上了实用的注释和最佳实践:

import os
import shutil
from pydub import AudioSegment  # 依赖pydub和ffmpeg

class Split_audio():
    def __init__(self):
        """初始化,默认分割为30秒的音频片段(单位:毫秒)"""
        self.default_chunk_ms = 30000

    def create_folder(self, audio_file_path):
        """创建用于存储音频片段的文件夹,以原文件名命名"""
        # 提取不带后缀的原文件名作为文件夹名
        base_name = os.path.splitext(os.path.basename(audio_file_path))[0]
        folder_path = os.path.join(os.getcwd(), base_name)
        
        # 如果文件夹已存在,先清空重建,避免旧片段干扰
        if os.path.exists(folder_path):
            shutil.rmtree(folder_path)
        os.makedirs(folder_path)
        
        return folder_path

    def split(self, audio_file_path, chunk_ms=None):
        """
        分割音频文件为多个短片段
        :param audio_file_path: 原音频文件的路径
        :param chunk_ms: 自定义每个片段的时长(毫秒),默认用类初始化的30秒
        """
        chunk_duration = chunk_ms if chunk_ms else self.default_chunk_ms
        
        # 加载音频文件,pydub支持MP3、WAV等多种格式(需ffmpeg支持)
        audio = AudioSegment.from_file(audio_file_path)
        total_duration = len(audio)
        save_folder = self.create_folder(audio_file_path)

        start_ms = 0
        chunk_index = 1

        while start_ms < total_duration:
            end_ms = start_ms + chunk_duration
            # 处理最后一段不足设定时长的情况
            end_ms = min(end_ms, total_duration)
            
            # 截取音频片段
            audio_chunk = audio[start_ms:end_ms]
            # 生成片段文件名,格式:原文件名_序号.wav
            chunk_file_name = f"{os.path.splitext(os.path.basename(audio_file_path))[0]}_{chunk_index}.wav"
            chunk_save_path = os.path.join(save_folder, chunk_file_name)
            
            # 导出为WAV格式(Google API最兼容的格式),自动转成16kHz单声道
            audio_chunk.export(chunk_save_path, format="wav", parameters=["-ar", "16000", "-ac", "1"])
            
            start_ms = end_ms
            chunk_index += 1

        print(f"分割完成!共生成{chunk_index-1}个音频片段,存储在{save_folder}")
        return save_folder

使用这个类的注意事项:

  • 先安装依赖:执行pip install pydub,还要安装ffmpeg(Windows用户下载后添加到系统环境变量,Linux用sudo apt install ffmpeg,macOS用brew install ffmpeg)。
  • 可以根据Google API的限制调整片段时长,比如同步请求支持最长1分钟,就把chunk_ms设为60000。
  • 导出片段时加了-ar 16000 -ac 1参数,自动转成16kHz单声道,完美适配Google Speech Recognition的要求,能提升识别准确率。
  • 如果你的audio对象有自定义的get_nameAudioFile()方法,只需要把audio_file_path换成你的对象调用即可,灵活性很高。

内容的提问来源于stack exchange,提问作者K.cyrine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:23:29