基于OpenAI Whisper和Streamlit的语音转文本应用报错求助及功能实现
问题分析与修复方案
报错核心原因
出现TypeError: expected np.ndarray (got NoneType)的关键问题:
- 初始化阶段直接执行
model.transcribe(audio_file),此时audio_file可能未录制(为None),导致Whisper无法处理空值。 audio_recorder()返回的是字节数据,不是本地文件路径,直接调用audio_file.name或传入transcribe方法会导致格式不兼容。
原代码问题点
import streamlit as st import whisper from audio_recorder_streamlit import audio_recorder # App Title Name st.title("Speech to Text") # uploading an audio file # audio_file = st.file_uploader("Upload Audio", type=["wav","mp3","m4a"]) audio_file = audio_recorder() if audio_file: st.audio(audio_file, format="audio/wav") model = whisper.load_model("base") st.text("Whisper Model Loaded") # 问题1:初始化阶段直接调用transcribe,audio_file可能为None transcription = model.transcribe(audio_file) print(transcription['text']) if st.sidebar.button("Transcribe Audio"): if audio_file is not None: st.sidebar.success("Transcribing Audio") # 问题2:audio_file是字节数据,没有name属性,且不能直接传入transcribe transcription = model.transcribe(audio_file.name) st.sidebar.success("Transcription Complete") st.text(transcription["text"]) else: st.sidebar.error("Please Upload an Audio File")
修复后的完整代码
import streamlit as st import whisper from audio_recorder_streamlit import audio_recorder import numpy as np import io from pydub import AudioSegment # 缓存模型,避免重复加载提升性能 @st.cache_resource def load_whisper_model(): return whisper.load_model("base") model = load_whisper_model() st.title("语音转文本工具") # 录制音频 audio_bytes = audio_recorder(text="点击录制语音", icon_size="2x") if audio_bytes: st.audio(audio_bytes, format="audio/wav") # 侧边栏转录按钮 if st.sidebar.button("开始转录"): if audio_bytes: st.sidebar.info("正在转录...") # 将字节数据转换为Whisper支持的numpy数组格式 audio_segment = AudioSegment.from_file(io.BytesIO(audio_bytes), format="wav") audio = np.array(audio_segment.get_array_of_samples()).astype(np.float32) / 32768.0 # 执行转录 result = model.transcribe(audio) st.sidebar.success("转录完成") # 展示转录结果 st.subheader("转录文本") st.write(result["text"]) else: st.sidebar.error("请先录制语音")
修复说明
- 模型缓存:用
@st.cache_resource装饰模型加载函数,避免页面刷新时重复加载模型,优化运行效率。 - 音频格式转换:通过
pydub将录制得到的字节数据,转换为Whisper要求的归一化float32 numpy数组。 - 逻辑优化:仅在用户点击转录按钮且存在有效音频数据时执行转录,避免空值传入引发报错。
- 依赖补充:需额外安装
pydub,执行命令:pip install pydub
内容的提问来源于stack exchange,提问作者Satyam Singh
相关产品推荐
相关产品推荐

