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 がダメなのではなく、波形を作るときのサンプル数が小数になってしまっていることです。
つまり、やるべきことはシンプルです👇
- 秒数は小数でOK👌
- ただし「サンプル数」は整数にする必要がある🧮
ここが今回のいちばん大事なポイントです✨
エラーの原因は「個数」に小数を使っているから💡
試したコードはこちらでしたね👇
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つ目の引数は、
「何個の点を作るか」=個数 を表します。
個数は、当然ながら
- 22050個 ✅
- 22050.0個 ❌
という扱いになります。
そのため、Pythonが
「float は整数として解釈できません」
と教えてくれているのです💥
直し方はとても簡単😊 int()で整数にするだけ
いちばん簡単な修正方法は、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個の点を使って音を作る
という意味です✨
だから、音の長さが変わると、必要な点の数も変わります👇
- 1秒 → 44100個
- 0.5秒 → 22050個
- 0.25秒 → 11025個
- 0.1秒 → 4410個
この「何個必要か」という値は、個数なので整数でなければなりません🧠
ここがわかると、今回のエラーの意味もスッと入ってきます。
もっとおすすめの書き方🌈 np.arange()を使う方法
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))
で、まず
- 0
- 1
- 2
- 3
- …
という整数の並びを作ります。
そして、それを
/ fs
することで、時間に変換しています⏱️
つまり、
- 0番目の点
- 1番目の点
- 2番目の点
を「何秒目か」に変えているわけです。
このやり方は、サンプル数を自分で意識しやすいので、音の処理をこれから覚えたい方にかなりおすすめです😊
初心者におすすめなのはどっち?🔰
結論としては、初心者の方には np.arange() を使う方法 をおすすめします✨
その理由は次の通りです👇
仕組みがイメージしやすい🎵
「必要な数だけサンプルを作る」という考え方が見えやすいです。
小数秒でも扱いやすい🧮
int(fs * seconds) にしておけば、0.5秒でも0.25秒でも自然に対応できます。
音声処理でよく使われる📘
今後、ビープ音や和音、メロディを作るときにも応用しやすいです。
0.5秒以外の小数でも鳴らせる?🎶
もちろん可能です✨
たとえば、次のような値でも問題ありません。
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 でもしっかり鳴ります🎉
音が鳴らないときのチェックポイント🛠️
もし修正しても音が鳴らない場合は、次の点も確認してみてください。
simpleaudioが正しく入っているか📦
インストールしていない場合は、まず導入が必要です。
pip install simpleaudio numpy
実行環境にスピーカー設定の問題がないか🔈
Pythonの問題ではなく、PC側の音量ミュートや出力先設定が原因のこともあります。
仮想環境や権限の影響がないか💻
とくに開発環境によっては、ライブラリの読み込み先がズレていることもあります。
simpleaudio以外の代替方法はある?🎧
はい、あります😊
ただし今回のケースでは、simpleaudio + numpy で十分対応可能です。
それでも「別の方法も知っておきたい」という場合は、次の選択肢があります。
sounddeviceを使う方法🎤
リアルタイム再生や録音も含めて扱いやすいライブラリです。
少し発展的ですが、本格的に音を扱いたい方には向いています。
pygameを使う方法🎮
ゲーム制作と相性がよく、効果音やBGMを鳴らしたい場合に便利です。
winsoundを使う方法🪟
Windows限定ですが、簡単なビープ音ならかなり手軽です。
ただし、自由な波形生成には向いていません。
とはいえ、今回のように
- 指定した周波数の音を鳴らしたい
- 長さを0.5秒のように細かく指定したい
という用途なら、まずは numpy + simpleaudio をしっかり使えるようになるのが最短ルート です🚀
これからできるようになること✨
今回のポイントを理解すると、単に「0.5秒の音が鳴る」だけではなく、次のようなことにも進みやすくなります🌈
好きな長さのビープ音を作れる
0.2秒、0.75秒、1.3秒など自由に調整できます。
ドレミの音階を鳴らせる
frequency を変えるだけで、音階の練習や簡単なメロディ作成ができます🎼
効果音づくりに応用できる
ゲーム、通知音、学習用ツールなどに活かしやすくなります🔔
Pythonで「音を扱う感覚」が身につく
今後、波形編集や録音、音声合成などへ進む土台になります💡
つまり今回のエラーは、つまずきではありますが、
Pythonで音を扱える未来への最初の一歩 でもあります😊
まとめ🌟 小数秒の音を鳴らしたいなら「サンプル数を整数に」
今回の内容をまとめると、ポイントはとてもシンプルです👇
0.5のような小数秒でも音は鳴らせる🎶- エラー原因は、
seconds * fsが float になること⚠️ - サンプル数は個数なので整数が必要🔢
int(seconds * fs)にすれば解決できる✨- 初心者には
np.arange(int(fs * seconds)) / fsの書き方がおすすめ🌈
最初はエラーメッセージが難しく見えても、原因を一つずつ分解すれば、ちゃんと理解できます😊
そしてこの理解は、今後のPython学習でも大きな武器になります。
ただ動くだけでなく、なぜそうなるのかを知ることで、自分で直せる力が育っていきます💪✨
よくある質問❓✨
❓ なぜ1秒だと動いて、0.5秒だとエラーになるのですか?
1秒のときも内部的には計算結果は 44100.0 になることがありますが、環境や書き方によってたまたま問題が見えにくい場合があります。基本的には、サンプル数には整数を渡すのが正しいです😊
❓ int() を使うと長さが少しズレませんか?
ごくわずかな差は出ることがありますが、通常の音再生ではほとんど問題ありません🎵
実用上は十分です。
❓ np.linspace() と np.arange() はどちらがいいですか?
どちらでも作れますが、音の処理では np.arange() の方が理解しやすくておすすめ です✨
❓ A4の音は400Hzですか?
いいえ、A4は 440Hz です🎹
400Hzは別の高さの音になります。
❓ simpleaudioが使えないときはどうすればいいですか?
pip install simpleaudio numpy を確認し、それでも難しい場合は sounddevice や pygame も候補になります🔊
❓ Python初心者でも音のプログラムは学べますか?
もちろんです😊
今回のように「時間」「周波数」「サンプル数」の基本を押さえるだけでも、かなり理解が進みます。小さな成功体験を積みながら学ぶのがおすすめです🌱


コメント