LoginSignup
1
0

More than 1 year has passed since last update.

streamlitでnumpy配列で音声を再生する

Posted at

はじめに

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クラス

スクリーンショット 2021-08-14 20.06.44.png

この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)

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0