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

基于OpenAI Whisper和Streamlit的语音转文本应用报错求助及功能实现

问题分析与修复方案

报错核心原因

出现TypeError: expected np.ndarray (got NoneType)的关键问题:

  1. 初始化阶段直接执行model.transcribe(audio_file),此时audio_file可能未录制(为None),导致Whisper无法处理空值。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:36:30