用python發出聲音

Share This Post

聲音三要素

音調(頻率)

人耳能聽到20HZ到20000HZ的聲音

響度(振幅)

音色(波形)

製造正弦波

想要聲音,首先需要有正弦波,所以來寫一個定義正弦波的function

正弦波函數

一個 頻率為3Hz 持續10S的正弦波

使用numpy用正弦波函數定義一個正弦波:

import numpy as np


def sine(frequency= 3, time= 10, amplitude= 1, theta= 0):   
    return amplitude * np.sin(2 * np.pi * frequency * time + theta)

使用pyaudio讀取正弦波:

接下來只要讓pyaudio讀取我們製造的正弦波,就能產生出聲音

但是一個正弦波函數值是要怎麼發出聲音?pyaudio聽得懂嗎?

取樣率(sample rate)

從連續訊號中提取並組成離散訊號的取樣個數

透過numpy arange去排列每個採樣點時間,並對正弦波去進行採樣

def sine(frequency= 3, time= 10, amplitude= 1, theta= 0, sample_rate=44100):   

    arange_time = np.arange(0, time, 1/sample_rate)

    return amplitude * np.sin(2 * np.pi * frequency * arange_time + theta)

讓pyaudio來讀喽!

import numpy as np
import pyaudio

# 剛剛的正弦波取樣function
def sine(frequency= 3, time= 10, amplitude= 1, theta= 0, sample_rate=44100):   

    arange_time = np.arange(0, time, 1/sample_rate)

    return amplitude * np.sin(2 * np.pi * frequency * arange_time + theta)

# pyaudio的讀取方法
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,channels=1, rate=44100, output=True)

data =  sine(frequency= 3, time= 10, amplitude= 1, theta= 0, sample_rate=44100)

stream.write(data.astype(np.float32).tobytes())
stream.stop_stream()
stream.close()
p.terminate()

當然聽不到 上面有說人耳只能聽到20HZ到20000HZ的聲音…

小實作 電話 – 雙音多頻(Dual-Tone Multi-Frequency, DTMF)

雙音多頻-程式碼

from tkinter import *
import numpy as np
import pyaudio


def sine(frequency, time, sample_rate):   

    arange_time = np.arange(0, time, 1/sample_rate)
    amplitude = 1
    theta = 0

    return amplitude * np.sin(2 * np.pi * frequency * arange_time + theta)


def two_sine(f1, f2):
    time =  0.3
    sample_rate = 44100
    s1 = sine(f1, time, sample_rate)
    s2 = sine(f2, time, sample_rate)
    ss = s1+s2
    sa=np.divide(ss, 2.0)
    return sa




p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,channels=1, rate=44100, output=True)

data = two_sine(1209, 697) # 1號鍵
stream.write(data.astype(np.float32).tobytes())

stream.stop_stream()
stream.close()
p.terminate()

掃雷區 – pyaudio 安裝失敗問題

出現:

ERROR: Command errored out with exit status 
...
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/

原因:

解決方法:

UCI網站下載 pyaudio 套件

參考資料

ncyu8880001: (一) 音調、響度、音色 – 嘉義大學開放式課程

Sine Waves in the Time Domain

子風的知識庫

[資訊小知識] 類比訊號 VS 數位訊號

[音響研究室] 192Khz?取樣率是什麼?真的數字越高就越好聽嗎?玩數位流一定要懂的 DAC 選購要點!

音頻採樣率都是44100?為什麼

訂閱研究文章

Get updates and learn from the best

More To Explore

Scroll to Top

hurry up !

軟體工程師培訓

限時免費報名中

藉由與「真實世界軟體專案」相同的技術、工具與開發流程,化簡成與商業機密無關、門檻較低更容易上手的「模擬專案」,讓你有機會在職場前輩的陪伴下,完成真槍實彈的練習,動手解決真實的問題,快速累積個人的經驗與作品,而不只是「學習技術」而已。