欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

何用Python實現(xiàn)一個 “系統(tǒng)聲音” 的實時律動掛件

 更新時間:2024年01月08日 11:51:40   作者:北橋蘇  
這篇文章將給大家介紹了如何用 Python 實現(xiàn)一個 “系統(tǒng)聲音” 的實時律動掛件,采集后直接實時地在電腦上繪制波形動畫,主要是用來作為 FL Studio 播放時的一個桌面小掛件,文中有相關的代碼示例供大家參考,需要的朋友可以參考下

前言

應該是三年前,我用 Esp8266 和 ws2812 實現(xiàn)了一個音樂律動燈帶。就是電腦播放音樂時,燈帶會隨著系統(tǒng)內部音樂播放的頻率而閃動不同色彩的燈珠。而當時用來監(jiān)聽系統(tǒng)聲音的工具是一個博主提供的,除了實時采集聲音外還通過 UDP 傳遞數(shù)據(jù)到 Esp8266 上。

而這次,我就自己用 Python 實現(xiàn)一下,不過不傳數(shù)據(jù),就采集后直接實時地在電腦上繪制波形動畫,主要是用來作為 FL Studio 播放時的一個桌面小掛件。

環(huán)境

python3.8

pyaudio0.2.14

matplotlib

pyaudio 簡介

pyaudio 是一個跨平臺地音頻 I/O 庫,使用他可以在 Python 程序中進行播放,錄音和生成 wav 文件等。需要注意的是,如果要使用 pyaudio 時,python 的版本最好在 3.7 以上,不然 pip 安裝會報錯。因為以下例子是獲取系統(tǒng)內部聲音,而 pyaudio 讀取的音頻流默認是麥克風,所以接下來介紹一下關于獲取的設備列表信息。

代碼獲取設備列表

# pyaudio實例
audio = pyaudio.PyAudio()
# 獲取設備總數(shù)
device_count = audio.get_device_count()
# 根據(jù)設備索引獲取設備詳細信息
for i in range(p.get_device_count()):
	devInfo = p.get_device_info_by_index(i)
	print(devInfo)

設備信息參數(shù)介紹

  • index: 設備的索引號,通常用于標識系統(tǒng)中的設備順序。
  • structVersion: 結構版本號,用于表示這個數(shù)據(jù)結構的版本。
  • name: 設備的名稱,這里是 “Microsoft 聲音映射器 - Input”。
  • hostApi: 主 API 的標識符,通常用于表示該設備屬于哪個 API 或系統(tǒng)。
  • maxInputChannels: 設備支持的最大輸入通道數(shù),這里是 2,表示設備支持 2 個輸入通道。
  • maxOutputChannels: 設備支持的最大輸出通道數(shù),這里為 0,表示該設備沒有輸出通道。
  • defaultLowInputLatency: 默認的低輸入延遲,以秒為單位,這里是 0.09 秒。
  • defaultLowOutputLatency: 默認的低輸出延遲,這里是 0.09 秒。
  • defaultHighInputLatency: 默認的高輸入延遲,這里是 0.18 秒。
  • defaultHighOutputLatency: 默認的高輸出延遲,這里是 0.18 秒。
  • defaultSampleRate: 默認的采樣率,這里是 44100.0 赫茲,這是 CD 質量的音頻標準采樣率。

開始操作

開啟立體聲混音權限

打開電腦設置 - 系統(tǒng) - 聲音 - 管理聲音設備 - 立體聲混響,點擊啟用。

設置設備索引號

打開立體聲混音后,通過 pyaudio 獲取設備列表,找到帶有 “立體聲混音” 的名稱,和 hostApi 為 0 的,hostAPI = 0 表明是 MME 設備。然后拿到該設備索引號,打開音頻流時指定該內錄設備序號。

def findInternalRecordingDevice(p):
    # 要找查的設備名稱中的關鍵字
    target = '立體聲混音'
    # 逐一查找聲音設備
    for i in range(p.get_device_count()):
        devInfo = p.get_device_info_by_index(i)
        print(devInfo)
        if devInfo['name'].find(target) >= 0 and devInfo['hostApi'] == 0:
            # print('已找到內錄設備,序號是 ',i)
            return i
    print('無法找到內錄設備!')
    return -1

全部代碼

import pyaudio
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import wave

FORMAT = pyaudio.paInt16
CHANNELS = 1  
RATE = 44100  
CHUNK = 4096  
# CHUNK = 1024  
WAVE_OUTPUT_FILENAME = 'audio_output.wav'

# 獲取內錄設備序號,在windows操作系統(tǒng)上測試通過,hostAPI = 0 表明是MME設備
def findInternalRecordingDevice(p):
    # 要找查的設備名稱中的關鍵字
    target = '立體聲混音'
    # 逐一查找聲音設備
    for i in range(p.get_device_count()):
        devInfo = p.get_device_info_by_index(i)
        print(devInfo)
        if devInfo['name'].find(target) >= 0 and devInfo['hostApi'] == 0:
            # print('已找到內錄設備,序號是 ',i)
            return i
    print('無法找到內錄設備!')
    return -1

# Initialize PyAudio
audio = pyaudio.PyAudio()

# 這里input_device_index的2就是系統(tǒng)內錄設備索引
stream = audio.open(input_device_index=2,
                    format=FORMAT,
                    channels=1,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

plt.ion()
fig, ax = plt.subplots()
x = np.arange(0, CHUNK)
line, = ax.plot(x, np.zeros(CHUNK))
ax.set_xlim(0, CHUNK)
ax.set_ylim(-32768, 32767)

wave_output_file = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wave_output_file.setnchannels(CHANNELS)
wave_output_file.setsampwidth(audio.get_sample_size(FORMAT))
wave_output_file.setframerate(RATE)

def update_plot(data):
    print(data)
    line.set_ydata(data)
    fig.canvas.draw()
    fig.canvas.flush_events()

def display_audio_waveform():
    while True:
        try:
            audio_data = np.frombuffer(stream.read(CHUNK), dtype=np.int16)
            # update_plot(audio_data*500)
            update_plot(audio_data)
            # wave_output_file.writeframes(audio_data)
        except KeyboardInterrupt:
            break

display_audio_waveform()

stream.stop_stream()
stream.close()
audio.terminate()

wave_output_file.close()
print('Audio saved to', WAVE_OUTPUT_FILENAME)

以上就是何用Python實現(xiàn)一個 “系統(tǒng)聲音” 的實時律動掛件的詳細內容,更多關于Python實時律動掛件的資料請關注腳本之家其它相關文章!

相關文章

  • python 常用的基礎函數(shù)

    python 常用的基礎函數(shù)

    這篇文章主要介紹了python 77種常用的基礎函數(shù),學習python的朋友可以收藏一下,簡單了解一下,方便后期使用
    2018-07-07
  • 使用Mac時psycopg2導入PyCharm失敗的解決

    使用Mac時psycopg2導入PyCharm失敗的解決

    這篇文章主要介紹了使用Mac時psycopg2導入PyCharm失敗的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 利用pyproj將經緯度投影為平面坐標以及地理坐標系背景知識解讀

    利用pyproj將經緯度投影為平面坐標以及地理坐標系背景知識解讀

    這篇文章主要介紹了利用pyproj將經緯度投影為平面坐標以及地理坐標系背景知識解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 為什么相對PHP黑python的更少

    為什么相對PHP黑python的更少

    在本篇內容里小編給各位整理了關于為什么相對PHP黑python的更少的原因和知識點,需要的朋友們可以參考下。
    2020-06-06
  • python高階函數(shù)使用教程示例

    python高階函數(shù)使用教程示例

    這篇文章主要為大家介紹了python高階函數(shù)使用教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Python的裝飾器詳情介紹

    Python的裝飾器詳情介紹

    這篇文章主要介紹了Python的裝飾器詳情,主要介紹裝飾器定以、調用方式等相關內容,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-03-03
  • TensorFlow 多元函數(shù)的極值實例

    TensorFlow 多元函數(shù)的極值實例

    今天小編就為大家分享一篇TensorFlow 多元函數(shù)的極值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python PaddleSpeech實現(xiàn)嬰兒啼哭識別

    python PaddleSpeech實現(xiàn)嬰兒啼哭識別

    這篇文章主要為大家介紹了python PaddleSpeech實現(xiàn)嬰兒啼哭識別操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Python文本的藝術字符串處理技巧掌握

    Python文本的藝術字符串處理技巧掌握

    這篇文章主要為大家介紹了Python文本的藝術字符串處理技巧掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • python實現(xiàn)多線程抓取知乎用戶

    python實現(xiàn)多線程抓取知乎用戶

    本文給大家分享的是如何使用Python實現(xiàn)多線程抓取知乎用戶的思路以及代碼,非常的詳細,作者使用本程序成功抓取到了百萬用戶,有需要的小伙伴可以參考下
    2016-12-12

最新評論