Pythonを使用して固定周波数サウンドを再生する方法[終了]


8

固定周波数のサウンド(1000Hzなど)を再生する方法をいくつか試しましたが、何も動作しません。

「ビープ音」をダウンロードしましたが、音は鳴りません。

私はpyaoへのインターフェースを試みましたが、それは効果がありませんでした。

私はオーディエとのインターフェースを試みましたが、ソフトウェアセンターからインストールしたにもかかわらず、ライブラリが見つからないことを示すランタイムエラーが発生しました。

適切なライブラリと関連コードをインストールするためのガイダンスが最もありがたいです。

このために.mp3 / .wavファイルを生成できませんが、実行時にトーンを生成する必要があります。

本当にありがとう


WAVEをフロートにする必要があります。なぜFREQと呼ばないのですか?また、方程式は正しくありません。これを試してください:math.sin((x * 2 * math.pi * FREQ)/ RATE)* 127)+128

より良い実装がここで見つけることができます: stackoverflow.com/questions/974071/...
グリンゴサーブ

回答:


10
import math
#sudo apt-get install python-pyaudio
from pyaudio import PyAudio

#See http://en.wikipedia.org/wiki/Bit_rate#Audio
BITRATE = 16000 #number of frames per second/frameset.      

#See http://www.phy.mtu.edu/~suits/notefreqs.html
FREQUENCY = 261.63 #Hz, waves per second, 261.63=C4-note.
LENGTH = 1.2232 #seconds to play sound

NUMBEROFFRAMES = int(BITRATE * LENGTH)
RESTFRAMES = NUMBEROFFRAMES % BITRATE
WAVEDATA = ''    

for x in xrange(NUMBEROFFRAMES):
   WAVEDATA += chr(int(math.sin(x / ((BITRATE / FREQUENCY) / math.pi)) * 127 + 128))    

#fill remainder of frameset with silence
for x in xrange(RESTFRAMES): 
    WAVEDATA += chr(128)

p = PyAudio()
stream = p.open(
    format=p.get_format_from_width(1),
    channels=1,
    rate=BITRATE,
    output=True,
    )
stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()

2
それは(2*math.pi)
jfs 2014年

正しく機能させるには、将来の除算と2 * math * piが必要でした。Python 2.8 32ビット
chwi 2015年

Python 2.7はこれを「滑らかな」サウンドとして再生しますが、Python 3.4ははるかに「ブザーな」サウンドを生成します。どうして?____future____部門を追加してみましたが、違いはありませんでした。
Ubuntourist 2015

@Ubuntouristよくわかりませんが、Python 2.7は8ビットエンコーディングを使用し、Python 3.4はUTF8をchar()使用しているため、Python 3.4の一部の値に2バイトを使用しますが、ここでは必要ありません。
12431234123412341234123 2017年

python3の文字列の代わりにバイト文字列を使用する場合、望ましい効果が得られるはずです
pizzapants184

4

あなたはそれを行うことができますpython-pyaudio(少なくとも12.04で利用可能):

from __future__ import division #Avoid division problems in Python 2
import math
import pyaudio
import sys

PyAudio = pyaudio.PyAudio
RATE = 16000
WAVE = 1000
data = ''.join([chr(int(math.sin(x/((RATE/WAVE)/math.pi))*127+128)) for x in xrange(RATE)])
p = PyAudio()

stream = p.open(format =
                p.get_format_from_width(1),
                channels = 1,
                rate = RATE,
                output = True)
for DISCARD in xrange(5):
    stream.write(data)
stream.stop_stream()
stream.close()
p.terminate()

ご協力ありがとうございました。残念ながら、実行時に大量のエラーが発生し、RATEまたはWAVEに変更を加えると音が出なくなります。スペース不足のため、エラーはリストされていませんが、「ALSA lib」を参照してください。どのように私はどのように変更するのですか?どうもありがとう
user98415

エラーメッセージもたくさん表示されますが、問題なく再生されます。また、WAVEを変更するとピッチが変わります。ジャックを使っていますか?または単にpulseaudio?
taneli

2
@ user98415:上部のアドオンfrom __future__ import divisionのPython 2.上の不要な切り捨てを避けるためには
JFS

@JFSebastianこれですべてが解決されました。ありがとう
chwi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.