Pythonで音を鳴らしてみたいと思って、numpy と simpleaudio を使ってチャレンジしたときに、まず最初にぶつかりやすいのが 「0.5秒のような小数秒でうまく鳴らない問題」 です😥
1秒なら動くのに、0.5 にした瞬間、
float object cannot be interpreted as an integer
と表示されると、「え、なんで?」となりますよね💦
でも安心してください😊
このエラーは、Pythonの音の仕組みが少し分かれば、初心者でもしっかり解決できます。
この記事では、
まで、やさしく順番に解説していきます。
読み終わるころには、0.5秒、0.25秒、0.1秒といった細かい長さの音を自由に鳴らせるようになります🌈
結論からいうと、0.5秒のような小数秒でも音はちゃんと鳴らせます🎶
今回の原因は、simpleaudio がダメなのではなく、波形を作るときのサンプル数が小数になってしまっていることです。
つまり、やるべきことはシンプルです👇
ここが今回のいちばん大事なポイントです✨
試したコードはこちらでしたね👇
import numpy as np
import simpleaudio as safrequency = 400 # 440Hz(A4)の音を出す
fs = 44100 # サンプリング周波数
seconds = 0.5 # 0.5秒間鳴らすt = np.linspace(0, seconds , seconds * fs, False)
note = np.sin(frequency * t * 2 * np.pi)
audio=note * (2**15 - 1) / np.max(np.abs(note))audio = audio.astype(np.int16)play_obj = sa.play_buffer(audio, 1, 2, fs)play_obj.wait_done()
この中で問題になっているのはここです👇
t = np.linspace(0, seconds , seconds * fs, False)
seconds = 0.5、fs = 44100 なので、
seconds * fs
は
22050.0
になります。
一見、22050だから問題なさそうに見えますが、実際には 22050.0 という float型(小数) です。
np.linspace() の3つ目の引数は、
「何個の点を作るか」=個数 を表します。
個数は、当然ながら
という扱いになります。
そのため、Pythonが
「float は整数として解釈できません」
と教えてくれているのです💥
いちばん簡単な修正方法は、seconds * fs を int() で整数に変えることです✨
import numpy as np
import simpleaudio as safrequency = 400
fs = 44100
seconds = 0.5sample_count = int(seconds * fs)t = np.linspace(0, seconds, sample_count, False)
note = np.sin(frequency * t * 2 * np.pi)audio = note * (2**15 - 1) / np.max(np.abs(note))
audio = audio.astype(np.int16)play_obj = sa.play_buffer(audio, 1, 2, fs)
play_obj.wait_done()
これで、0.5秒の音も正常に鳴るようになります🔔
音は、コンピューターの中では「連続した音」ではなく、
とても細かく区切られた点の集まりとして扱われています🎼
この「1秒間に何個の点を使うか」を表すのが、サンプリング周波数です。
今回のコードでは、
fs = 44100
となっています。
これはつまり、
1秒間に44100個の点を使って音を作る
という意味です✨
だから、音の長さが変わると、必要な点の数も変わります👇
この「何個必要か」という値は、個数なので整数でなければなりません🧠
ここがわかると、今回のエラーの意味もスッと入ってきます。
np.linspace() でも問題なく動きますが、音を作る処理では np.arange() を使う書き方もとても人気です✨
初心者の方には、こちらの方が理解しやすいことも多いです。
import numpy as np
import simpleaudio as safrequency = 400
fs = 44100
seconds = 0.5t = np.arange(int(fs * seconds)) / fs
note = np.sin(2 * np.pi * frequency * t)audio = (note * 32767).astype(np.int16)play_obj = sa.play_buffer(audio, 1, 2, fs)
play_obj.wait_done()
この書き方では、
np.arange(int(fs * seconds))
で、まず
という整数の並びを作ります。
そして、それを
/ fs
することで、時間に変換しています⏱️
つまり、
を「何秒目か」に変えているわけです。
このやり方は、サンプル数を自分で意識しやすいので、音の処理をこれから覚えたい方にかなりおすすめです😊
結論としては、初心者の方には np.arange() を使う方法 をおすすめします✨
その理由は次の通りです👇
「必要な数だけサンプルを作る」という考え方が見えやすいです。
int(fs * seconds) にしておけば、0.5秒でも0.25秒でも自然に対応できます。
今後、ビープ音や和音、メロディを作るときにも応用しやすいです。
もちろん可能です✨
たとえば、次のような値でも問題ありません。
seconds = 0.1
seconds = 0.25
seconds = 1.75
このように、秒数そのものは小数でOKです😊
大切なのは、サンプル数を作るときに
int(fs * seconds)
とすることです。
これさえ守れば、かなり自由に長さを調整できます🌟
元のコードでは、こちらのコメントがありました👇
frequency = 400 # 440Hz(A4)の音を出す
ここは少しだけズレがあります。
400 は 400Hz440 は 440Hzなので、もし本当に A4(ラの音) を出したいなら、こう書くのが正確です🎼
frequency = 440
細かいところですが、今後音階を作るときに大事になるポイントです✨
初心者の方でもそのまま試しやすい形にすると、こんなコードになります😊
import numpy as np
import simpleaudio as safrequency = 440 # 音の高さ(Hz)
fs = 44100 # サンプリング周波数
seconds = 0.5 # 鳴らす時間(小数OK)# 時間データを作る
t = np.arange(int(fs * seconds)) / fs# サイン波を作る
note = np.sin(2 * np.pi * frequency * t)# 16bit整数に変換
audio = (note * 32767).astype(np.int16)# 再生
play_obj = sa.play_buffer(audio, 1, 2, fs)
play_obj.wait_done()
このコードなら、seconds = 0.5 でもしっかり鳴ります🎉
もし修正しても音が鳴らない場合は、次の点も確認してみてください。
インストールしていない場合は、まず導入が必要です。
pip install simpleaudio numpy
Pythonの問題ではなく、PC側の音量ミュートや出力先設定が原因のこともあります。
とくに開発環境によっては、ライブラリの読み込み先がズレていることもあります。
はい、あります😊
ただし今回のケースでは、simpleaudio + numpy で十分対応可能です。
それでも「別の方法も知っておきたい」という場合は、次の選択肢があります。
リアルタイム再生や録音も含めて扱いやすいライブラリです。
少し発展的ですが、本格的に音を扱いたい方には向いています。
ゲーム制作と相性がよく、効果音やBGMを鳴らしたい場合に便利です。
Windows限定ですが、簡単なビープ音ならかなり手軽です。
ただし、自由な波形生成には向いていません。
とはいえ、今回のように
という用途なら、まずは numpy + simpleaudio をしっかり使えるようになるのが最短ルート です🚀
今回のポイントを理解すると、単に「0.5秒の音が鳴る」だけではなく、次のようなことにも進みやすくなります🌈
0.2秒、0.75秒、1.3秒など自由に調整できます。
frequency を変えるだけで、音階の練習や簡単なメロディ作成ができます🎼
ゲーム、通知音、学習用ツールなどに活かしやすくなります🔔
今後、波形編集や録音、音声合成などへ進む土台になります💡
つまり今回のエラーは、つまずきではありますが、
Pythonで音を扱える未来への最初の一歩 でもあります😊
今回の内容をまとめると、ポイントはとてもシンプルです👇
0.5 のような小数秒でも音は鳴らせる🎶seconds * fs が float になること⚠️int(seconds * fs) にすれば解決できる✨np.arange(int(fs * seconds)) / fs の書き方がおすすめ🌈最初はエラーメッセージが難しく見えても、原因を一つずつ分解すれば、ちゃんと理解できます😊
そしてこの理解は、今後のPython学習でも大きな武器になります。
ただ動くだけでなく、なぜそうなるのかを知ることで、自分で直せる力が育っていきます💪✨
1秒のときも内部的には計算結果は 44100.0 になることがありますが、環境や書き方によってたまたま問題が見えにくい場合があります。基本的には、サンプル数には整数を渡すのが正しいです😊
int() を使うと長さが少しズレませんか?ごくわずかな差は出ることがありますが、通常の音再生ではほとんど問題ありません🎵
実用上は十分です。
np.linspace() と np.arange() はどちらがいいですか?どちらでも作れますが、音の処理では np.arange() の方が理解しやすくておすすめ です✨
いいえ、A4は 440Hz です🎹
400Hzは別の高さの音になります。
pip install simpleaudio numpy を確認し、それでも難しい場合は sounddevice や pygame も候補になります🔊
もちろんです😊
今回のように「時間」「周波数」「サンプル数」の基本を押さえるだけでも、かなり理解が進みます。小さな成功体験を積みながら学ぶのがおすすめです🌱