如何使用Python Azure函数读取Blob文件并实现音频谐波提取?
问题排查与解决方案
错误原因
- 基础拼写错误:
- Azure Functions Python SDK的导入名称错误,应为
azure.functions,你代码里写了azure.function缺少末尾的s - 音频处理库导入名称错误,
audioread库的正确导入语句是import audioread,你代码里写了import audio_read多了下划线
- Azure Functions Python SDK的导入名称错误,应为
- 核心报错根因:
audioread.audio_open()方法仅支持传入本地音频文件路径或者可寻址的类文件对象,你直接传入myblob.read()返回的音频二进制字节流,audioread会默认将输入尝试用utf-8解码为文件路径字符串,遇到二进制音频字节就触发了UnicodeDecodeError。 - 可选优化点缺失:
blob触发绑定没有明确指定数据类型,Azure Functions运行时可能会默认尝试将blob内容识别为文本,增加额外的解码风险。
修复方案
1. 修正function.json配置
在输入绑定中添加"dataType": "binary"明确指定按二进制读取blob内容:
{ "scriptFile": "__init__.py", "bindings": [ { "name": "myblob", "type": "blobTrigger", "direction": "in", "path": "examplecontainer/{name}", "connection": "AzureWebJobsStorage", "dataType": "binary" } ] }
2. 修正Python函数代码
将blob读取的二进制内容写入临时文件后,再把临时文件路径传给audioread.audio_open()处理:
import logging import azure.functions as func import audioread import tempfile import os def main(myblob: func.InputStream): logging.info(f"Python blob trigger function processed blob \n" f"Name: {myblob.name}\n" f"Blob Size: {myblob.length} bytes") # 将二进制音频内容写入临时文件 with tempfile.NamedTemporaryFile(delete=False) as temp_file: temp_file.write(myblob.read()) temp_path = temp_file.name try: audio_info = audioread.audio_open(temp_path) logging.info(f"读取音频信息成功:{audio_info}") # 此处添加你的谐波提取逻辑,处理完成后将结果JSON写入目标Blob容器即可 finally: # 处理完成后删除临时文件,避免占用存储空间 os.unlink(temp_path)
后续扩展说明
如果你需要将处理后的JSON结果写入另一个Blob容器,只需要在function.json中新增一个输出绑定,类型为blob,方向为out,指定目标容器路径,然后在Python代码中直接将JSON字符串赋值给对应的输出绑定参数即可。
内容的提问来源于stack exchange,提问作者user14834847
相关产品推荐
相关产品推荐

