web-dev-qa-db-ja.com

Pythonでのサウンド生成/合成?

pythonを取得して正弦波のような単純な音を生成することは可能ですか?

これに使用できるモジュールはありますか?そうでない場合、独自に作成する方法を教えてください。

また、サウンドを再生するためにpythonを実行するには何らかのホスト環境が必要ですか、それとも端末から呼び出しを行うだけで達成できますか?

答えがOSに依存する場合、Macを使用しています。

36
Alex Coplan

私は同じものを探していました、最終的に、私はうまく動作しているこのコードを書きました。

import math        #import needed modules
import pyaudio     #Sudo apt-get install python-pyaudio

PyAudio = pyaudio.PyAudio     #initialize pyaudio

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

FREQUENCY = 500     #Hz, waves per second, 261.63=C4-note.
LENGTH = 1     #seconds to play sound

if FREQUENCY > BITRATE:
    BITRATE = FREQUENCY+100

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

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

for x in xrange(RESTFRAMES): 
 WAVEDATA = 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()
30
Liam

私はこのゲームで少し遅れていることを知っていますが、これは非常に素晴らしいpython合成とオーディオ合成のためのプロジェクト: https://github.com/ hecanjog/pippi

まだ活発に開発されていますが、しばらくの間続いています。

11
acsmith

コンパイルできないプロジェクトや存在しないプロジェクトで時間を無駄にした後、python module wavebender を発見しました。 。結果は、ウェーブファイルまたはsys.stdoutのいずれかに書き込むことができ、そこからリアルタイムで aplay によって直接解釈できます。いくつかの有用な例を説明します ここ 、プロジェクトの githubページ に含まれています。

5
J. Katzwinkel

Python In Music wikiページはそれほど手入れが行き届いていませんが、良い出発点です。 http://wiki.python.org/moin/PythonInMusic

5
eggsyntax

PyAudiere が好きです。これにより、numpy配列をサウンドとして再生することができます。クロスプラットフォームだと思います。 scikits.audiolab は同じことをし、より最新であり、よりよくサポートされていると思います... wavfileとして保存したり、バッファに書き込んでPythonの組み込みサウンドライブラリを使用するよりも簡単に思えます。

3
rdchambers

私はこれら2つのpythonリポジトリが非常に有用であることがわかりました、それを見てみたいかもしれません...

pythonhttps://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

ipythonhttps://timsainb.github.io/spectrograms-mfccs-and-inversion-in-python.html

[編集]指摘したように、ここに2つのリンクの説明があります

python1つはエラーがあるようですが、多くの人々がそれを実行させることができたので、私にはわかりません。 ipythonは魔法のように機能したので、実行できることを願っています。

両方のリンクは、オーディオを入力として使用することが想定されており、できれば。wavファイルを使用してください。それを特徴づけて(FFTを使用:512、ステップサイズ= 512/8)、スペクトログラムを取得し(視覚化することもできます)、それは2Dマトリックスであり、機械学習オブジェクトをトレーニングするか、オリジナルを表すマトリックスを使用して任意の操作を行いますオーディオ。必要に応じて、いつでもそれらのベクトルが表すものを使用して、オーディオを再合成することもできます。

3
Priyank Pathak

私はpythonで強力なシンセサイザーに取り組んでいます。カスタム関数を使用して、.wavファイルに直接書き込みました。この目的に使用できる組み込み関数があります。 .wavヘッダーを変更して、サンプルレート、サンプルあたりのビット数、チャンネル数、および合成時間を反映する必要があります。

以下は、bytearrayを適用した後にwaveファイルのデータパラメーターへの書き込みに適した値のリストを出力するsin wave generatorの初期バージョンです。 [編集]バイト配列を適用する前に、変換関数はリストをリトルエンディアンの16進値に変換する必要があります。 .wav仕様の詳細については、以下のWAVE PCMサウンドファイル形式のリンクを参照してください。[/ edit]

def sin_basic(freq, time=1, amp=1, phase=0, samplerate=44100, bitspersample=16):
    bytelist = []
    import math
    TwoPiDivSamplerate = 2*math.pi/samplerate
    increment = TwoPiDivSamplerate * freq
    incadd = phase*increment
    for i in range(int(samplerate*time)):
        if incadd > (2**(bitspersample - 1) - 1):
            incadd = (2**(bitspersample - 1) - 1) - (incadd - (2**(bitspersample - 1) - 1))
        Elif incadd < -(2**(bitspersample - 1) - 1):
            incadd = -(2**(bitspersample - 1) - 1) + (-(2**(bitspersample - 1) - 1) - incadd)
        bytelist.append(int(round(amp*(2**(bitspersample - 1) - 1)*math.sin(incadd))))
        incadd += increment
    return bytelist

新しいバージョンでは、波形を使用して、波形パラメーターの周波数、振幅、および位相を変調できます。データ形式により、波をブレンドおよび連結するのは簡単です。これがあなたの路地にあるようであれば、 WAVE PCMサウンドファイル形式 をチェックしてください。

3
Octipi