Pythonで正弦波を再生する方法:PyaudioとNumpyを使った音の生成とコールバック

Python
この記事は約4分で読めます。
スポンサーリンク

これまでは入力音声の制御について、記事にしてきましたが、今回は逆に音声を出力する方法を纏めてみます。
Wave音源をそのまま出力するのは面白くないなと思ったので、プログラム上で正弦波を生成して出力するプログラムにしてみました。
いや入力音声が知りたいんだけど!!って 方は以下にいくつか記事を書いていますのでチェックしてみて下さい。

↓は、ちょっと毛色が違って入力音声を文字起こしする方法についてもまとめていますので見てみてください。

使用ライブラリ

まず、今回使用したライブラリは以下の2つです。

  • pyaudio
  • numpy

この二つはこれまでに使用したことがあるので、インストール方法は画像がありません。すいません。
インストールには以下のコマンドを使用して下さい。XXXに上記のライブラリ名を入れればインストール可能です。

pip install XXX

プログラムと実行結果

ではいつも通りプログラブの全体です。

import pyaudio
import time
import numpy as np

wave = 0
totalcounter = 0

def create_sinewave():
    global wave
    A     =  1    # 振幅
    freq  = 1000  # 周波数 Hz
    sec   = 2     # 信号の長さ s
    fs    = 44100 # サンプリング周波数 Hz
   
    t = np.linspace(0, sec, fs * sec +1)         # 0≦t≦time をnumsamples等分
    wave = np.sin(2 * np.pi * freq * t)          # 周波数 freq (Hz) の正弦波
    wave = np.rint(32767*wave / max(abs(wave)))  # [-32767,32767] の範囲に収める
    wave = wave.astype(np.int16)                 # 16ビット整数に型変換する
   

def callback(in_data, frame_count, time_info, status):
    data = wave
    return (data, pyaudio.paContinue)

def main():
    create_sinewave()  # サイン波の生成
    p = pyaudio.PyAudio()
    
    stream = p.open( format = pyaudio.paInt16 ,
                     rate = 44100,
                     channels = 1, 
                     output=True,
                     frames_per_buffer = len(wave),
                     stream_callback=callback)

    stream.start_stream()
    
    while stream.is_active():
        time.sleep(0.1)
    
    stream.stop_stream()
    stream.close()
    p.terminate()
    
if __name__ == '__main__':
    main()

実行結果は以下です。
といっても何も表示されていないですが、実行してしばらくすると1Khzの音声が出力されます。
※1Khzは耳で確認しているので正確ではないかもしれません。。
あと終了処理をいれていないので、強制終了しています。。

続いてはプログラムの解説ですが、解説は次ページにて記載します。

スポンサーリンク

コメント

タイトルとURLをコピーしました