色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>一種新的音樂交互方式開源分享

一種新的音樂交互方式開源分享

2022-11-03 | zip | 0.14 MB | 次下載 | 免費

資料介紹

描述

介紹

在過去的幾年里,樂器作為一種教育和創意工具的創新一直是研究的主題。我們團隊的兩名成員是來自高中的學生,擁有強大的音樂課程,我們想出了這種新樂器。

我們提出了一種新的音樂交互方式,其中一個界面(手套)可以一次控制不同的樂器。

Matrix Voice ESP32 讓我們有機會在兩個不同的任務中打破這個過程:

  • 使用外部傳感器(壓力)收集數據和
  • 帶有 SNIPS 的語音命令識別、儀器管理和播放。

ESP32 運行 Tensilica Xtensa 雙核微控制器處理來自壓力傳感器的模擬輸入,并通過 UART 通道與 Raspberry Pi 3 控制器程序通信

poYBAGNiFNSAUM_OAACVY5_VmKA116.jpg
?

材料

以下是我們使用的材料的快照。請注意,電阻為 3.3 歐姆,并且所示手套尚未粘貼雙面膠帶。

?
?
?
poYBAGNiFOeAEYzZAAONTuYtmnw809.jpg
?
1 / 7
?

我們還為 RPi 使用了兩張 SD 卡。第一個具有 ESP32 編程環境,第二個具有安裝了 python 編程支持的 Matrix Core、HAL 和 Lite 包。

壓力傳感器

創建音樂的核心數據收集是連接到設備的壓力傳感器。我們需要對同時連接的多個傳感器進行快速響應。

poYBAGNiFOuAb9ZFAAF7fXd4IfI525.jpg
?

我們使用 ESP32 從 Matrix Voice ESP32 上的擴展 GPIO 端口公開 IO 端口作為來自壓力傳感器的模擬輸入。Arduino 腳本定義了要激活的引腳,如下所示

//Use extension port for pressure sensors
const int FSR_PIN = 12;  // Pin connected to FSR/resistor divider
const int FSR_PIN1 = 26; // Pin connected to FSR/resistor divider
const int FSR_PIN2 = 27; // Pin connected to FSR/resistor divider
const int FSR_PIN3 = 25; // Pin connected to FSR/resistor divider

上述引腳可以物理地在擴展端口中找到,如下所示。我們還使用 3.3V 和 GND 引腳為傳感器供電

poYBAGNiFO2AFit_AACkPSGBPwk592.jpg
?

初始化 UART 串??口進行數據傳輸,并在 Arduino 腳本的 setup 函數中設置 ESP32 引腳作為輸入。

void setup() {
    Serial.begin(115200);
    pinMode(FSR_PIN, INPUT);
    pinMode(FSR_PIN1, INPUT);
    pinMode(FSR_PIN2, INPUT);
    pinMode(FSR_PIN3, INPUT);

主循環讀取傳感器輸入。在某些情況下,我們注意到引腳在連續指令讀取時會返回影子值。我們嘗試添加一個計時器來緩解這個問題,但沒有成功,而效果更好的一個是檢查下一個引腳的值,以及再次讀取它是否相同。這在某種程度上為我們解決了這個問題。

void loop()
{
    byte inCmd;
    int fsrADC = analogRead(FSR_PIN);
    int fsrADC1 = analogRead(FSR_PIN1);
    if (fsrADC == fsrADC1)
        fsrADC1 = analogRead(FSR_PIN1);
    int fsrADC2 = analogRead(FSR_PIN2);
    if (fsrADC1 == fsrADC2)
        fsrADC2 = analogRead(FSR_PIN2);
    int fsrADC3 = analogRead(FSR_PIN3);

現在是時候對 ESP32 芯片進行編程了。我們確實花了一些時間來弄清楚這個過程,在按照ESP32 MATRIX Voice w/Arduino IDE 上的 Program Over the Air的說明進行操作后,我們了解了手動刷新程序的過程。我們不得不說無線(OTA)對我們不起作用,我們的矩陣聲音在啟動時一直崩潰。但是,手動工作,所以每次我們更改程序時,我們只調用 deploy_ota, sh 腳本。

我們還使用安裝了新的 Raspbian Stretch Desktop 映像的干凈 SD 卡。我們按照安裝ESP32 u p 的說明進行到第 1 步。

總之,你需要

  • 在 Arduino IDE 中選擇 ESP32 開發模塊板
pYYBAGNiFPCAUQi_AABov7tIt_E421.jpg
?
  • 單擊 Sketch 菜單下的 Export Compiled Binary。這將創建一個 bin 文件
pYYBAGNiFPWADAhXAAAyYSBwIM0564.jpg
?
  • 使用您的憑據和 bin 文件的名稱更新 deploy_OTA.sh 文件。
tar cf - *.bin | ssh pi@YOURIPADDRESSHERE 'tar xf - -C /tmp;sudo voice_esp32_reset;voice_esptool --chip esp32 --port /dev/ttyS0 --baud 115200 --before default_reset --after hard_reset write_flash -u --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /tmp/bootloader.bin 0x10000 /tmp/YourBinaryProgramName.bin 0x8000 /tmp/partitions_two_ota.bin'
  • 啟動 Git Bash 會話并為 deploy_OTA.sh 文件運行 shell 腳本
pYYBAGNiFPiAY1kPAAALjkD0gPQ268.jpg
?
  • 您的目錄應包含以下文件以正確刷新 ESP32
pYYBAGNiFPqAWbHQAAAwWN62VCc003.jpg
?

順便說一句,當您按照ESP32 MATRIX Voice w/Arduino IDE 上的 Program Over the Air 中的說明進行操作時,您可以從 esp32-arduino-ota 項目下的 starter 目錄中找到 deploy_OTA、sh、bootloader.bin和 partitions_two_ota.bin 文件。

git clone https://github.com/matrix-io/esp32-arduino-ota

語音助手

為了創建一個動態的多樂器設備,我們需要一種改變樂器當前演奏的方法。口頭命令創造了最通用的方式來實現這一點。

SNIPS是一個用于連接設備的 AI 語音平臺,它通過可定制的語音體驗來動畫產品交互。

首先檢查以下項目MATRIX Voice 和 MATRIX Creator Running Snips.ait o 設置您的 SNIPS 環境。

注意:請注意 /etc/asound.conf 文件可能需要一些調整才能使 SNIPS 進程正常運行。我們最終使用 RPi 嵌入式聲音芯片進行聲音播放和 Matrix Voice 進行錄音。還要確保將采樣率值檢查為 16000,因為這是 Matrix 工作的默認值(如果我們對此有誤,請糾正我們)。

一旦您的系統在 SNIPS 上啟動并運行,我們使用 MATRIX 設備和 Snips.ai 復制了以下項目 Iron Man Arc Reactor。他為我們提供了在 SNIPS 上創建帳戶的步驟,并初步了解如何創建一個應用程序。

好的,然后我們創建我們的應用程序調用 MusicGloves,我們希望暫時將其保密并將其設置為未發布。

pYYBAGNiFP2ACJpaAAC43lCWHm0775.jpg
?

我們創建了八個意圖,六個用于樂器,一個用于同時演奏三種樂器的混合版本 (MixOne),還有一個用于退出程序的命令。

poYBAGNiFQGAXC4gAAC_JaJa0vw942.jpg
?

每個意圖都有一個 Slot,我們創建三個可能的激活語句:Play Instrument Name、Select Instrument Name 和 Instrument Name,除了 Exit。

創建插槽后,請確保按“保存”,以便系統開始訓練并創建語音助手。

pYYBAGNiFQSAPAPsAABpg_97nfU851.jpg
?

不直觀的一件事是訓練示例與插槽的鏈接。您必須選擇要與插槽關聯的關鍵字文本,然后將鼠標懸停在其上。然后它將顯示一個彈出菜單來選擇插槽。我們嘗試了其他版本的具有多個插槽的助手,但是在接收回調函數并在 python 上解析 JSON 消息時遇到了一些問題。所以我們決定為每個樂器創建單獨的意圖。

pYYBAGNiFQeAZr33AAAsL6zKOYI591.jpg
?

現在你可以部署你的助手了。按照帶有 MATRIX 設備和 Snips.ai的Iron Man Arc Reactor 的步驟 7 。

通過運行測試助手

sam watch

并說出熱門詞“Hey Snips”,您將看到 RPi 識別該詞后的處理結果。

筆記

本節介紹第二個任務,使用 SNIPS 進行語音命令識別、儀器管理和播放。

Python 和 SNIPS 的配置有一些顛簸。首先,我們按照使用 Python 通過 MQTT 監聽意圖中的說明進行操作,但是在嘗試通過 Stretch 安裝 paho-mqtt 時出現問題。我們找到了解決方案Cannot install paho-mqtt in Python 3.xby運行以下命令:

sudo apt-get install mosquitto 
sudo apt-get install mosquitto-clients 
sudo python3 -m pip install paho-mqtt

設置好系統后,我們首先導入我們的庫

import paho.mqtt.client as mqtt
from time import sleep
from math import pi, sin
import pygame
import time
import serial
import re
import json

請注意,我們將使用 pygame 播放樂器聲音,使用串行庫通過 UART 端口與 ESP32 通信,并使用 mqtt 客戶端與 SNIPS 服務器鏈接。

我們初始化我們的意圖以訂閱 mqtt 客戶端。請注意,我們錯誤地離開了 IronMan 項目的 ArcReactor 意圖,哎呀!

#Snips credentials, make sure you set your Username
snipsUserName = "YourUserName"
Reactor = 'hermes/intent/'+snipsUserName+':ArcReactor'
ViolinMus = 'hermes/intent/'+snipsUserName+':Violin'
CelloMus = 'hermes/intent/'+snipsUserName+':Cello'
PianoMus = 'hermes/intent/'+snipsUserName+':Piano'
FluteMus = 'hermes/intent/'+snipsUserName+':Flute'
TimpaniMus = 'hermes/intent/'+snipsUserName+':Timpani'
ExitMus = 'hermes/intent/'+snipsUserName+':Exit'
MixOneMus = 'hermes/intent/'+snipsUserName+':MixOne'
ChorusMus = 'hermes/intent/'+snipsUserName+':Chorus'

我們初始化 mqtt 客戶端,設置連接和消息接收的回調函數,嘗試連接到主機并啟動一個運行 mqtt 消息的新線程。請注意,我們注釋了 client.loop_forever() 函數。我們從這個函數開始,但是它控制了程序并且不放手,因此函數調用之后的代碼永遠不會執行。我們需要一些可以在后臺運行的東西,同時我們可以收集來自 ESP32 腳本的數據。

#Initialize the mqqt engine
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
#Connect to mqtt service
client.connect(HOST, PORT, 60)
#client.loop_forever()
client.loop_start()

連接建立后,來自 mqtt 服務的 on_connect 回調函數訂閱意圖。

# Subscribe to the programmed intents
def on_connect(client, userdata, flags, rc):
   print("Connected to {0} with result code {1}".format(HOST, rc))
   # Subscribe to the hotword detected topic
   client.subscribe("hermes/hotword/default/detected")
   # Subscribe to intent topic
   client.subscribe(ViolinMus)
   client.subscribe(CelloMus)
   client.subscribe(PianoMus)
   client.subscribe(FluteMus)
   client.subscribe(ExitMus)
   client.subscribe(TimpaniMus)
   client.subscribe(MixOneMus)
   client.subscribe(ChorusMus)

以及 SNIPS 發送的 mqtt 消息的回調函數

# Snips callback function with the detected intent
def on_message(client, userdata, msg):
   global activeInstrument
   if msg.topic == 'hermes/hotword/default/detected':
      print("Hotword detected!")
   elif msg.topic == ViolinMus:
      activeInstrument = ViolinIns
      print("Violin detected!")
   elif msg.topic == CelloMus:
      activeInstrument = CelloIns
      print("Cello detected!")
   elif msg.topic == PianoMus:
      activeInstrument = PianoIns
      print("Piano detected!")
   elif msg.topic == FluteMus:
      activeInstrument = FluteIns
      print("Flute detected!")
   elif msg.topic == TimpaniMus:
      activeInstrument = TimpaniIns
      print("Timpani detected!")
   elif msg.topic == ExitMus:
      activeInstrument = ExitIns
      print("Exit detected!")
   elif msg.topic == MixOneMus:
      activeInstrument = MixOneIns
      print("Mix One detected!")
   elif msg.topic == ChorusMus:
      activeInstrument = ChorusIns
      print("Chorus detected!")

我們使用以下命令初始化我們的 pygame 聲音引擎:

# Initialize the pygame sound engine
pygame.mixer.init()
# Set the number of channels to allow multiple simultaneous sounds
pygame.mixer.set_num_channels(15)

并請求 15 個通道同時播放我們的樂器聲音。

我們采取了一種邏輯方法來盡可能簡單地處理資源,方法是創建一個文件路徑數組和一個創建聲音對象的數組,這樣我們就不需要每次播放時都加載它們。合唱對象的片段如下所示。請注意,chsndObj 數組包含加載相應文件后合唱的所有聲音對象。

chCEGmfPath = ['/home/pi/MusicOrch/Chorus/chorus-female-c5-PB-loop.wav',
            '/home/pi/MusicOrch/Chorus/chorus-female-e5-PB-loop.wav',
            '/home/pi/MusicOrch/Chorus/chorus-female-g5-PB-loop.wav']
# Create an array of Sound objects for each instrumment. This is the array for chorus.
# Chorus
chsndObj = [pygame.mixer.Sound(chADFmfPath[0]), pygame.mixer.Sound(chADFmfPath[1]),
         pygame.mixer.Sound(chADFmfPath[2]),
         pygame.mixer.Sound(chCEGMmfPath[0]), pygame.mixer.Sound(chCEGMmfPath[1]),
         pygame.mixer.Sound(chCEGMmfPath[2]),
         pygame.mixer.Sound(chCEGmfPath[0]), pygame.mixer.Sound(chCEGmfPath[1]),
         pygame.mixer.Sound(chCEGmfPath[2])]

selectSoundObj 和 playNote 函數負責根據活動樂器選擇正確的聲音并在獨立通道上播放。

最后用下面的參數初始化串口

#Initialize the serial port for communication with the Matrix Voice ESP32 

ser = serial.Serial( port='/dev/ttyS0', baudrate = 115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=5 )

我們使用串行對象請求一組新的壓力值,讀取這些值并在通過 SNIPS 意圖命令更改時傳輸活動的選定對象。

if (PauseExec == False):
   # Set read command to ESP32
   ser.write(b'1')
   time.sleep(0.1)
   # Read a line of data
   x = ser.readline()
   # print(x)
   # Convert the binary data into string
   strdecode = x.decode('utf-8')
   # split the data according to the divider
   values = strdecode.split("|")
   # print(values)
   # Play the data
   playNote(activeInstrument, int(values[0]), int(values[1]), int(values[2]))
   time.sleep(0.05)
# If instrument change let know the ESP32 task
if (currIns != activeInstrument):
   print(activeInstrument)
   currIns = activeInstrument
   if (activeInstrument == ViolinIns):
      ser.write(b'A')

請注意,我們有一個 PauseExec 變量作為信號量來同步程序中的不同事件。當我們試圖從 ESP32 腳本中獲取壓力傳感器的免費數據流時,我們曾在某個時候使用過這個變量,但它并沒有那么好用。

該程序控制數據流,在播放前一個讀取包的值后,在準備好處理它時請求一個新包。接收到的數據是二進制格式,我們將其轉換為字符串并拆分每個壓力傳感器上的值。

如果 ActiveInstrument 的值通過接收來自 SNIPS 客戶端的口頭命令而更新,則程序將相應的代碼發送到 ESP32 以更改 LED 的顏色。

時間就是一切 開發 (TIED)

在處理實時數據流時,考慮事件的同步是很重要的。在我們找到正確的流程順序(上圖)之前,我們嘗試了不同的方案。

將 ESP32 Arduino 腳本設置為在每個周期傳輸一個讀取的壓力值包,實際上阻塞了 UART 緩沖區,python 程序很難僅趕上正在接收的數據。SNIPS 命令缺乏響應,并且沒有及時播放聲音。

然后我們嘗試向 ESP32 發送一個讀取命令,ESP32 反過來會讀取當時的值,但是 readline 函數會附帶一半創建的包,其中缺少傳感器值。

我們在串口讀取部分仍然有一些崩潰,這就是我們實現 try/except 情況的原因,所以我們可以重置串口并重新啟動通信。

找到正確的同步過程很復雜,但在我們的 IOT 世界中是必需的。

享受音樂樂趣

最后,在將所有部件放在一起之后,我們就有了新的樂器(設備)。我們使用帶有雙面膠帶的手套,將雙面膠帶粘在壓力傳感器和塑料球上,塑料球是傳感器按壓的剛性表面。

?
?
?
poYBAGNiFRaAPsAVAASrZ87JIRg384.jpg
?
1 / 2
?

我們注意到的事情

該項目最初是使用 Matrix Voice ESP32 作為獨立設備開始的,不需要 RPi 板。

我們想使用 ESPNOW 協議將傳感器數據傳輸到負責演奏所選樂器的遠程服務器。Matrix Voice ESP32 將運行 SNIPS 客戶端并選擇活動儀器,該儀器將作為流包的一部分傳遞到遠程服務器。

嘗試 ESP32 開發模塊中的 ESPNOW 示例程序很有魅力。

在單獨的腳本上設置壓力傳感器并讀取其值效果很好。

當我們將兩者放在一起時,問題就開始了。由于某種我們還不知道的原因,一旦調用了 WiFi.mode(WIFI_STA) 函數,引腳的模擬讀數就會停止工作。該腳本開始讀取擴展端口中每個 ESP32 定義的引腳上的隨機值。

這使我們放棄了 ESPNOW 并創建了一個設備。然后,我們遇到了 RPi 上的 UART 支持問題。因為,我們第一次使 SNIPS 工作是使用node.js示例,所以我們在 node.js 上搜索支持 UART 的庫。不用說它不起作用,哦,那里有用于 UART 和node.js 的庫,但是我們的時間不多了。

最后,我們決定使用 python,幸運的是我們找到了一種與 SNIPS 接口的方法。

這是一次漫長的旅行。哦,我們是否提到過我們還考慮重新編程 FPGA 以訪問 I2C 或 UART 或擴展 GPIO。絕對是一個挑戰,但這次不是。:)

未來的工作

添加更多壓力傳感器,找出 ESPNOW 問題并允許另一個設備控制播放任務,并使設備獨立于 RPi 板運行。

增加意圖的數量。我們將添加諸如“選擇小提琴和長笛”或“選擇所有弦樂”或“增加一個八度”或“改變音階”或“傳感器一個小提琴和傳感器兩個合唱”等的意圖。這么多的可能性。

我們在這個項目上工作得非常愉快。希望這能激發更多關于樂器的項目。謝謝閱讀。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 亚洲精品动漫免费二区| 蜜桃传媒在线播放| 91久久偷偷做嫩草影院免| 欧美 日韩 亚洲 在线| 灌满内射HP1V1| 亚洲日本欧美国产在线视| 免费无码国产欧美久久18| 干极品美女| 亚洲精品一区二区在线看片 | 强奷表妺好紧2| 国产精品无码亚洲精品| 樱桃BT在线观看| 人人插人人射| 和姐姐做插得很深| 99精品中文字幕在线观看| 泰国淫乐园实录| 久久伊人男人的天堂网站| 成人毛片手机版免费看| 亚洲男人在线观看| 欧美另类videosbest| 国产又湿又黄又硬又刺激视频| 4438成人情人网站| 无人区国产片| 蜜饯1V1高H-| 国产欧美一区二区三区在线看| 2022年国产精品久久久久 | 国产WW久久久久久久久久| 伊人久久久久久久久香港| 日本双渗透| 久久精品亚洲国产AV涩情| 俄罗斯孩交精品| 在线观看永久免费网址| 色悠悠电影网| 老司机福利视频一区在线播放| 国产成人aaa在线视频免费观看| 中国xxxxxxxxx孕交| 添加一点爱与你电视剧免费观看| 久久婷婷五月综合色丁香| 国产精品18久久久久久欧美| 《乳色吐息》无删减版在线观看| 天天噜日日噜夜夜噜|