はじめに
streamlitはPythonだけでwebアプリケーションを構築できるライブラリで、その中に音声を再生するウィジェットを作る機能があります。
import streamlit as st
st.audio("filename.wav")
のようにすると、音声プレーヤーが表示されます
ドキュメントによれば、このaudio
メソッドの引数には
(str, bytes, BytesIO, numpy.ndarray, or file opened with)
とのことで、numpy.ndarrayが渡せるようなので次のように音声ファイルをnumpy.ndarrayの形で渡してみても、なぜか実際には音声を再生することはできません
import librosa
data, rate = librosa.load("filename.wav")
st.audio(data) # dataはnumpy.ndarrayクラス
このissueの現象ですが、解決されているのか...?よく分かりません
https://github.com/streamlit/streamlit/issues/3434
ドキュメントの以下の行からすると、ファイルのフォーマットのヘッダー情報が必要そうなのですが、音声のnumpy配列にそのようなものはありません
Numpy arrays and raw data formats must include all necessary file headers to match specified file format.
対応策
もちろん一度ファイルに保存してしまえばそれを読み込めば再生できるのですが、その方法を応用して以下のようにメモリ上でファイルを受け渡すような形にすることで、streamlitでも再生できるようになります
import io
from scipy.io import wavfile
virtualfile = io.BytesIO()
wavfile.write(virtualfile, rate=rate, data=data)
st.audio(virtualfile)