Python处理S3桶音频文件实现语音转文本的问题
解决S3中.opus音频转文本的问题
核心问题分析
speech_recognition仅支持wav、aiff等标准音频格式,无法直接处理.opus文件,必须先转码- 你碰到的
charmap编码错误,是因为用文本模式操作二进制音频文件导致的,必须用二进制模式读写
解决方案步骤
1. 安装必要依赖
首先得装ffmpeg(pydub的转码依赖),再安装Python库:
- 安装ffmpeg:根据系统选择方式(Windows用Chocolatey,Ubuntu用
apt install ffmpeg,macOS用Homebrew) - 安装Python库:
pip install boto3 pydub SpeechRecognition
2. 内存中转码处理(推荐,无需本地存储)
直接读取S3对象的二进制数据,在内存中完成opus到wav的转码,再传入speech_recognition:
import boto3 from pydub import AudioSegment import speech_recognition as sr from io import BytesIO # 初始化S3资源 s3_resource = boto3.resource('s3') bucket_name = "你的S3桶名" object_key = "9d3be36b-6777-4b2a-8912-4dbfaaeea0ab/year=2022/month=11/day=10/hour=0/conversation_id=00d32818-16f5-4a6f-a97c-3db50ce9254f/36f1c0ce-d168-4df3-bae8-219bd5b59802.opus" # 获取S3对象的二进制数据 s3_object = s3_resource.Bucket(bucket_name).Object(object_key).get() opus_raw_data = s3_object['Body'].read() # 将opus数据转为AudioSegment对象 audio_segment = AudioSegment.from_file(BytesIO(opus_raw_data), format="opus") # 转成wav格式并写入内存缓冲区 wav_buffer = BytesIO() audio_segment.export(wav_buffer, format="wav") wav_buffer.seek(0) # 将缓冲区指针重置到起始位置 # 执行语音转文本 r = sr.Recognizer() with sr.AudioFile(wav_buffer) as source: audio_data = r.record(source) try: text = r.recognize_google(audio_data) print(text) except sr.UnknownValueError: print("Google语音识别无法解析音频内容") except sr.RequestError as e: print(f"请求Google语音服务失败: {str(e)}")
3. 本地文件处理(避免编码错误)
如果需要将文件保存到本地,务必使用二进制模式读写:
# 下载opus文件到本地(二进制写入) with open("temp_audio.opus", "wb") as f: f.write(opus_raw_data) # 转码为wav audio_segment = AudioSegment.from_file("temp_audio.opus", format="opus") audio_segment.export("temp_audio.wav", format="wav") # 读取wav文件并识别 r = sr.Recognizer() with sr.AudioFile("temp_audio.wav") as source: audio_data = r.record(source) # 后续识别逻辑同内存处理示例
关键注意事项
- 确保ffmpeg已添加到系统PATH,否则pydub无法完成转码
- 所有涉及音频文件的读写操作,必须使用
rb(读)或wb(写)模式,禁止使用默认文本模式 - 若音频文件体积过大,内存处理可能占用较多资源,此时优先选择本地文件处理方案
内容的提问来源于stack exchange,提问作者ai_10111
相关产品推荐
相关产品推荐

