<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>

電子發燒友App

硬聲App

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

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

3天內不再提示
電子發燒友網>電子資料下載>電子資料>語音控制界面實驗開源分享

語音控制界面實驗開源分享

2022-12-14 | zip | 0.05 MB | 次下載 | 免費

資料介紹

描述

介紹和動機

語音識別和語音界面在這方面發揮了重要作用,并將在我們未來的計算體驗中發揮重要作用。長期以來一直是科幻小說的主要內容,現在可以成為每個人的科學現實。

我的第一個語音控制界面實驗,“借給我你的耳朵!”:網絡藍牙和語音識別,是一個令人興奮的實驗。當它成為Hackster.io live 的主題并啟發了我自己、VoiceBot101和其他人的許多新穎和衍生項目時,我感到非常高興,例如:

此處為 Alexa 和 Google Assistant 發布的眾多項目和技能也可以看出語音的流行和興奮,例如:

  • GooglePi - Raspberry Pi 上的 Google 助理

幾周前,我發現了一個開源語音識別和人工智能平臺Mycroft.ai ,這聽起來非常令人興奮,我決定是時候對語音界面進行更多試驗了。

這個項目描述將主要集中在我如何學會為 Mycroft 平臺編寫技能。我也會分享我的一些理解、困惑和總體印象。

Mycroft.ai網站和github 頁面有很多你應該閱讀的信息。此外,還有一些關于該平臺的優秀書面評論和評論,例如:

我探索 Mycroft 并編寫此技能和其他技能的最終目標是回答以下問題:

  • 什么是好的語音界面設計?

Mycroft.ai/Picroft

Mycroft.ai是一個人工智能和語音識別系統。它類似于 Alexa、Google Assistant 或 Siri 等平臺,但它是完全開源的,并且是用 Python 編寫的。它有 3 個不同的版本:

  • Mycroft Mark 1 - 基于 Raspberry Pi 2 的開放硬件平臺
  • Linux Ubuntu 上運行桌面包
  • 用于在 Raspberry Pi 3 上運行Picroft 0.8

我一直在尋找一個很好的理由來開始認真地嘗試 Raspberry Pi 3,因此 Picroft 0.8 選項對我來說是一個自然的選擇。還有非常詳盡的安裝說明和兼容硬件指南也很吸引人。

從現在開始,我將交替使用 Mycroft 和 Picroft,但我專門為這個項目使用了 Picroft 0.8 版本。我也可以稱他或他為 Mycroft/Picroft,但在此我遵循 Manuel “Mannie” Garcia O'Kelly 的約定。

Picroft 安裝說明

對于這個項目,我使用了安裝在 Pi Top Ceed 外殼中的 Raspberry Pi 3。我使用它是因為建議使用鍵盤和屏幕可以更輕松地與 Picroft 交互和安裝。不過不要太興奮,我沒有在 Pi Top OS 上運行 Picroft,我只是覆蓋了 SD 卡。這是我感興趣的鍵盤和屏幕!

我還購買了兼容硬件列表中推薦的麥克風/揚聲器組合之一。

在 Raspberry Pi 3 上安裝 Mycroft 之前,有 2 套安裝說明和提示需要查看:

執行和完成這些步驟不到 1 小時,令人驚訝的是,這一切都奏效了!直到我告訴Mycroft去睡覺。當我試圖用喚醒詞喚醒他時,他拒絕這樣做。無奈之下,我重啟了。然后他會認出喚醒詞,我可以看到屏幕上顯示的文本響應,但聽不到任何音頻。所以我回到了安裝說明。. .

在上面第一個鏈接的安裝說明和提示的底部,是有關如何配置 USB 麥克風的提示:

使用 USB 音頻作為輸出
通常,USB 音頻應連接到 hwplug:1,0 但要驗證運行以下命令:
aplay -L
找到您要使用的設備的 hwplug 輸出,使用它并相應地更新 /etc/mycroft/mycroft.conf 文件:
"play_wav_cmdline": "aplay -Dhw:0,0 %1" 這行現在變成了 "play_wav_cmdline": "aplay -Dplughw:1,0 %1"
您現在可以運行 ./auto_run.sh 來啟動程序備份和測試,并確保輸出來自 USB 揚聲器。

按照這些說明使用nano作為文本編輯器并重新啟動,解決了麥克風問題。然而,讓他入睡仍然需要完全重啟才能讓他對喚醒詞做出反應。希望通過更多的工作,我將能夠解決這個問題。

這帶來了使用 Picroft 版本的重要一點。您應該對 Linux 中的基本命令行技能充滿信心。到目前為止,它只是簡單的東西,例如在目錄中移動、安全刪除文件和使用 nano。

技能的想法

我想創建一種比“Hello, World”示例更復雜的技能(他們已經有一個),但又不會復雜到阻止我完成它。

經過一番思考,我想出讓 Mycroft 告訴我國際空間站 (ISS) 相對于其地球經緯度坐標的當前軌道位置。由于這兩個數字對我沒有太多意義,我還希望 Mycroft 告訴我這些坐標對應于地圖上的什么。

好的,所以這不是最有用的技能,但它很有趣,并且有機會學習。以下兩個部分是特定領域的信息,雖然對于編寫技能不是必需的,但很有趣并且與技能的“輸出”相關。

國際空間站(ISS)

國際空間站是一個巨大的太空科學實驗室。它已經建成到目前的規模,航天飛機的許多最后任務都用于建造它。有趣的是,航天飛機的最初概念是讓它與軌道空間實驗室協同工作。它每 90 分鐘繞地球一圈,平均高度為 240 英里。通過計算,它在一天內繞地球運行 16 次(24*60/90)。它的速度為每小時 17,500 英里。意味著從洛杉磯到紐約的旅行只需不到 9 分鐘!這與我們的技能相關,因為通過如此快速的移動,它賦予了技能一些多樣性和對其響應的興趣,這是語音設計的一個重要特征。

反向地理編碼

我找到了兩個免費的開源 API,它們提供實時 ISS 坐標Open-Notifywheretheiss.at 。我選擇為這個項目使用 Open-Notify。

這兩個 API 都以 JSON 有效載荷的形式提供相對于地球的 ISS 軌道位置,以及 ISS 最新的經緯度。我們可以簡單地訪問其中之一,解碼 JSON 有效載荷以獲取緯度和經度,并讓 Mycroft 報告這兩個數字。但是,“緯度 5.218 經度 115.008”(南海上空)或“緯度 44.590 經度 -104.715”(美國懷俄明州魔鬼塔上空)的報告對普通用戶意味著什么?讓技能提供地圖坐標和有意義的地理特征名稱(又名地名)提供了上下文,甚至可能與技能建立個人聯系。因此,我們付出更多的努力將獲得更好的用戶體驗。

當我們與地圖服務(例如谷歌地圖)交互時,我們會在地圖上給它一個地址或 2 個已知點并詢問方向,或者我們可能會使用 Uber 等乘車服務應用程序讓我們的司機知道我們在哪里,并且我們想去的地方。這就是地理編碼:我們識別地圖上的點,然后應用程序將這些點轉換為可計算的坐標。然而,我們的技能要求我們做相反的事情,我們給它一組坐標,它為我們提供了一個可識別的地理特征。這就是所謂的反向地理編碼。許多映射 API 會將其作為功能提供到其服務中。

所以我們都準備好了,只需使用我們最喜歡的(和免費的)地圖服務的反向地理編碼功能,并解碼生成的 JSON 有效負載!但是,有一個問題!您會發現,這些服務中的大多數都不涵蓋主要水域,例如海洋!嘗試使用大西洋和太平洋等要素的坐標,“未找到結果”是報告!我想這與將服務貨幣化有關。你真的找不到人去珊瑚海中央最近的星巴克!

幸運的是,GeoNames.org提供了一個 Web 服務,它確實在主要水域返回了有意義的有效載荷!我找不到另一個這樣做的免費服務。如果你這樣做,請告訴我!

訪問 GeoNames.org 網站,申請用戶名/帳戶,每天最多可獲得 30,000 次訪問!請記住為您的用戶名/帳戶激活網絡服務!問題解決了。

寫作技巧

Mycroft 核心文檔包含一個關于創建技能的優秀教程,并且在Mycroft github 頁面上有許多技能可供學習。我不會在這里重復該教程,但會指出我在創建此技能時使用的要點。

創建技能需要具有特定結構的多個不同文件,并具有特定的文件名約定:

?
poYBAGOYPp-AVkMjAACubWTHfN8579.png
來自 Mycroft 的 github 頁面,可以使用一個空白技能模板。
?

/dialog文件夾包含基于語言的文件,這些文件告訴 Mycroft 在執行技能時要說什么。這是來自 Mycroft.ai 的 github 存儲庫的Skill-hello-world/dialog/en-us/hello.world.dialog :

Hello world
Hello
Hi to you too

在回應你說“Hey Mycroft,Hello world”時,Mycroft 會從上面的 3 個回應中選擇一個說出來。“Hey Mycroft”或只是“Mycroft”這些詞是指示 Mycroft 應該開始聆聽的喚醒詞或觸發詞。

他怎么知道要聽什么才能執行這項技能?這就是 /vocab 文件夾的來源。從教程中,

  • vocab 文件夾包含支持的每種語言的子文件夾,例如 en-us。在每個語言文件夾中,我們放置 .voc 文件,其中包含確定 Mycroft 將聽什么來觸發技能的短語或關鍵字。

我的技能的對話和 voc 文件有點復雜。這是Skill-iss-location/dialog/en-us/location.current.dialog

{{latitude}} latitude {{longitude}} longitude which corresponds to {{toponym}}
The space station is at {{latitude}} latitude {{longitude}} longitude over {{toponym}}
It's at {{latitude}} latitude {{longitude}} longitude, {{toponym}}
The ISS is now over {{toponym}} at {{latitude}} latitude {{longitude}} longitude
{{toponym}} at {{latitude}} latitude and {{longitude}} longitude

術語{{latitude}}、{{longitude}}{{toponym}}是在執行與此技能關聯的__init__.py文件期間填充的值的鍵。您在 python 代碼中獲得的值與這些鍵之間存在一對一的關系,這使得提供交互式體驗變得非常容易。這些鍵周圍的文本是自由形式的,您可以在此處放置任何內容,Mycroft 會在這些選項中進行選擇以進行響應。

技能的核心在于__init__.py文件。我是這樣看的:用python寫的任何東西,都可以融入技能!有了可用的 Python 庫的數量和種類,這里沒有限制!該文件有一個特定的結構,我建議閱讀教程并查看Mycroft.al github 站點中的技能,以了解如何從這里開始。我將在這里詳細介紹我的代碼??磥磉@一切都在 Python 2.7 中)。

/test/intent文件夾是什么?我花了一段時間才開始理解這個文件夾的用途,我還在學習它。為了理解它,這些用 JSON 編寫的文件允許 Mycroft 確保您的技能意圖和您創建的文件中定義的聲音表達都可以正常工作。他們沒有定義聲音交互,而是測試它,因此得名。在我比較了來自維基百科的測試/意圖文件hello-world技能之前,我并不清楚這一點:

來自 hello-world測試/意圖文件之一:

{
 "utterance": "Hello world",
 "intent_type": "HelloWorldIntent",
 "intent": {
   "HelloWorldKeyword": "hello world"
 }
}

這是來自維基百科的技能:

{
 "utterance": "tell me about the first world war",
 "intent_type": "WikipediaIntent",
 "intent": {
   "WikipediaKeyword": "tell me about",
   "ArticleTitle": "the first world war"
 }
}

比較這些文件,幫助我理解了這些文件的作用。該話語是 Mycroft 可能會聽到的內容的示例,其中包含關鍵字和細節。intent_type對應于您的__init__.py文件中定義的意圖處理程序,當您比較 JSON 文件的“intent:”鍵時可以看到,該鍵包含來自您的 vocab 文件的關鍵字,并且在 wiki 技能的情況下是鍵:值對通過。

所以這些文件并沒有定義你可能的交互,而是特定的測試用例,以確保你的技能文件一起工作。

上面沒有顯示可選的/regex文件夾,它包含正則表達式,幫助 Mycroft 響應并解析它所聽到的信息!這是非常令人興奮的,但不是這個項目的主題。

使用安裝了 Picroft 0.8 的 Raspberry PI 3 編寫技能,需要您熟悉使用 linux 命令行。為了方便編寫這項技能,我在我的 Windows 10 筆記本電腦上使用 atom 編寫了所有需要的文件,然后將所有內容上傳到 Github。

為了安裝這項技能,我從我的 github 頁面克隆了存儲庫并從那里開始工作。這不是處理軟件的理想方式。但是,既然我對這個過程感到滿意,我可能會提取模板技能并直接從那里使用nano作為我的編輯器,并正確地將更改推送/合并到我自己的存儲庫中。

該技能必須放在/opt/mycroft/skills 技能文件夾中。使用sudo reboot 重新啟動系統后,我可以使用該技能。MSM(Mycroft Skill Manager)提供了一個工具,但我沒有在這個項目中使用它。我還有很多東西要學!

Python 代碼亮點

我發現通過命令行/納米/語音界面進行調試的過程有點挑戰。因此,我編寫了一個測試腳本issTest006.py來調試__init__.py 意圖函數處理程序的基本功能,以便在我的桌面上運行。

通過確保將非 Mycroft 相關功能與我的代碼中與 Mycroft 平臺相關的錯誤分開,這有助于簡化我的調試過程。

?
pYYBAGOYPqGAMKeGAADyfsPwA-0325.jpg
使用測試腳本驗證 python 代碼。
?

我們實際上只是在這里編寫一個 Python 腳本。該技能在 Python 中被創建為一個類。要在 Mycroft 環境中工作,該類必須包含它的功能。這些在教程和模板技能中都有概述:

class HelloWorldSkill(MycroftSkill): 
   def __init__(self): 
   def initialize(self): 
   def handle_thank_you_intent(self, message): 
   ... 
   def stop(self): 
def create_skill(): 
   return HelloWorldSkill() 

就我而言,我修改了這個模板以適應 ISS 定位技能:

__init__(self)函數用于創建 Skill 的實例

class ISSLocationSkill(MycroftSkill):
   def __init__(self):
       super(ISSLocationSkill, self).__init__(name="ISSLocationSkill")
   ...

這與任何其他 Python 類的__init__(self)構造函數沒有什么不同。我沒有要在這里設置的實例變量,所以這就是這里所需要的。

def initialize(self)是我們構建意圖和注冊意圖處理程序的地方。就我而言,只有一個。

您還可以在此處看到傳遞給函數的值匹配文件名、關鍵字 .voc 或我們之前編碼中的 JSON 鍵。這是關鍵字、意圖測試和意圖處理程序之間建立聯系的地方。因此,遵守 Mycroft 平臺的命名約定很重要。

def initialize(self):
       iss_location_intent = IntentBuilder("ISSLocationIntent").require("ISSKeyword").build()
       self.register_intent(iss_location_intent, self.handle_intent)
...

我的技能只有一個意圖,但您可以從Hello World Skill 中看到注冊多個意圖處理程序的樣子:

def initialize(self):
       thank_you_intent = IntentBuilder("ThankYouIntent"). \
           require("ThankYouKeyword").build()
       self.register_intent(thank_you_intent, self.handle_thank_you_intent)
       how_are_you_intent = IntentBuilder("HowAreYouIntent"). \
           require("HowAreYouKeyword").build()
       self.register_intent(how_are_you_intent,
                            self.handle_how_are_you_intent)
       hello_world_intent = IntentBuilder("HelloWorldIntent"). \
           require("HelloWorldKeyword").build()
       self.register_intent(hello_world_intent,
                            self.handle_hello_world_intent)

我的技能的大部分代碼都包含在意圖處理程序中,這與稀疏的Hello World Skill 意圖處理程序形成對比。他們只需將 Mycroft 指向對話框文件即可訪問:

def handle_how_are_you_intent(self, message):
       self.speak_dialog("how.are.you")

需要注意的是,傳遞的值是執行技能時要訪問的對話文件的名稱,而不是您希望 Mycroft 說出的實際文本!傳遞的值是不帶.dialog擴展名的文件名。

讓我們深入了解我的意圖處理程序,并嘗試關注來自意圖處理程序的信息是如何傳遞回 Mycroft 的。

我們要做的第一件事是從 open-notify 獲取當前 ISS 位置。我們使用urllib2庫發出請求,然后使用json解析 JSON 有效負載響應(請注意,urllib2 不是 Python3 中的單個庫)。

 def handle_intent(self, message):
       # get the 'current' latitude and longitude of the ISS from open-notify.org in JSON
       reqISSLocation = urllib2.Request("http://api.open-notify.org/iss-now.json")
       resISSLocation = urllib2.urlopen(reqISSLocation)
       issObj = json.loads(resISSLocation.read()) # JSON payload of ISS location data
       latISS = issObj['iss_position']['latitude']
       lngISS = issObj['iss_position']['longitude']

你能看出上面的代碼有問題嗎?我可以并且經歷過。如果 Open-Notify 的服務器已關閉或連接出現問題,會發生什么情況?這將導致程序崩潰。它不會使 Mycroft 崩潰,它只是不會為這種“錯誤”情況提供可接受的語音響應,讓用戶(像我一樣)想知道到底發生了什么。為了糾正這個問題,在未來的版本中,我將使用 Python 中最棒的異常處理機制,就像我在后面的代碼中所做的那樣。

接下來,我們將使用從 Open-Notify 中解析出的 JSON 有效負載中的緯度和經度來創建 URL 請求字符串以訪問GeoNames.org Web 服務。我們在這里創建 2 個字符串,因為對陸地和海洋/水特征有不同的反向地理編碼 api 調用:

...
oceanGeoNamesReq = "http://api.geonames.org/oceanJSON?lat="+ latISS +"&lng="+ lngISS +"&username=YourUserName"
landGeoNamesReq  = "http://api.geonames.org/countryCodeJSON?formatted=true&lat=" + latISS + "&lng=" + lngISS +"&username=YourUserName&style=full"
...

不要忘記將您的用戶名插入到上面的字符串中!

盡管國際空間站的軌道旨在一次覆蓋全球 90% 的人口,但地球是 3/4 的水,每當我看時,大部分軌道似乎都在一片水域之上。因此,正如下面代碼中的注釋所示,我們首先檢查坐標是否將地理編碼反向到海洋位置。再次在這里我應該把它放在異常處理塊中。未來的東西。. .

# Since the Earth is 3/4 water, we'll chek to see if the ISS is over water first;
       # in the case where this is not so, we handle the exception by  searching for a country it is
       # over, and is this is not coded for on GenNames, we just we say we don't know
       oceanGeoNamesRes = urllib2.urlopen(oceanGeoNamesReq)
       toponymObj = json.loads(oceanGeoNamesRes.read())

在下一段代碼中,我們絕對必須將其包裝在異常處理塊中。當我們嘗試從海洋位置解析從GeoNames.org返回的 JSON 有效負載時,如果國際空間站位于陸地上方,則會產生錯誤,因為有效負載中不存在海洋名稱密鑰。

如果我們得到這個錯誤,我們的第一個假設將是我們在陸地上。因此,我們將嘗試訪問土地的反向地理編碼服務。實際上,我們可以通過檢查返回的狀態/錯誤代碼來使這更復雜,但是這個假設,陸地與水體,似乎工作得很好:

try:
           toponym = "the " + toponymObj['ocean']['name']
       except KeyError:
           landGeoNamesRes = urllib2.urlopen(landGeoNamesReq)
           toponymObj = json.loads(landGeoNamesRes.read())
           toponym = toponymObj['countryName']
       except:
           toponym = "unknown"

因此,在這里,如果出現 KeyError,我們會嘗試從有效負載中解析海洋名稱鍵,然后我們通過對陸地特征進行反向地理編碼來處理此錯誤,并從中獲取國家名稱。在訪問此 Web 服務產生錯誤的情況下,我們通過將其稱為未知位置來處理此問題。也許不是最好的,但它是開始處理海洋和陸地坐標都不能正確反轉地理編碼的情況的好方法。如果您從 GeoNames.org 探索許多反向地理編碼 Web 服務,您可能會發現來自 Mycroft 的其他有用的 JSON 有效負載項。看看,讓我知道或自己修改!

到目前為止,為 intent_handler 描述的所有代碼都只是 Python。我們還沒有與 Mycroft 互動!您可以通過將此代碼與我編寫的 Python 測試腳本進行比較來看到這一點。我想展示這一點,因為不僅再次用 Python 編寫很有趣,而且還證明在我看來,如果你可以用 Python 編寫它,你就可以讓 Mycroft 在語音控制下運行它!這是非常強大的東西!

現在讓我們看看我們如何將我們新發現的關于 ISS 在哪里的知識傳遞給 Mycroft:

if toponym == "unknown":
           self.speak_dialog("location.unknown",{"latitude": latISS, "longitude": lngISS})
      else:
           self.speak_dialog("location.current",{"toponym":toponym, latitude": latISS, "longitude": lngISS})

就在這里!還記得我們討論過location.current.dialog文件中的{{latitude}}鍵嗎?好吧,這是我們將值傳遞給這些鍵的地方!

正如您在此處看到的,如果我們找到了陸地或水的地名,我們會將緯度、經度和地名傳回對話文件以供 Mycroft 發言。如果兩者都失敗了,并且我們為給定的緯度和經度生成了一個未知的地名,我們選擇location.unknown.dialog文件并讓 Mycroft 從那里執行一個短語!

很酷,對吧?

如您所知,為 Mycroft 編寫代碼比記錄所有這些更容易!

示威

讓我們看看幾種不同情況下的技能:

需要改進

完美是完整的敵人。所以我選擇了代碼,因為我得到了很多我想嘗試的想法,但我也想把它拿出來,這樣人們就可以看到在這個平臺上構建語音應用程序是多么容易和有趣.

話雖如此,正如您將在下面的演示中看到的那樣,我仍然沒有弄清楚如何讓 Mycroft 在識別方面正確處理首字母縮寫詞或首字母縮寫詞,如 ISS。

在語音方面,從請求到響應也有一點延遲。這可能是由于我的設置、編碼或此時平臺固有的。我知道所有這些都可能會隨著時間的推移而改善。

我們還依賴 2 個 Web 服務,Open-Notify 和 GeoNames。如您所見,我真的沒有嘗試處理服務器錯誤。一個簡單的修復,但仍然需要做一個來提高這個技能!

結論/一些觀察

我已經讓 Mycroft(Picroft 0.8) 在 Raspberry Pi 3 上運行了一周多一點,并為此編寫了我的第一個技能。這個平臺激勵我的一件事是我對它的參與感。我覺得我想要進行的不僅僅是“單回合”事件或技能。一旦我習慣了在命令行上并再次使用 nano,就很容易編寫該技能,我真的很喜歡一切都在 Python 中。我最近沒有機會用 Python 編寫代碼,所以這是一個再次這樣做的好機會,也開始夢想 Mycroft 和 Python 可以在 Raspberry Pi 3 上組合完成的所有事情。

到目前為止,對于 Mycroft 是否允許我創建一個好的聲音設計這個問題的答案是肯定的。dialog、vocab__init__.py文件之間的相互聯系清晰且易于使用。

沿消息總線傳遞信息的意圖和意圖處理程序的概念對我來說很有意義。我期待在我的語音詢問中探索正則表達式,然后嘗試創建多輪技能。

什么是好的聲音設計?我希望通過這個平臺更多地探索這個問題并提高我的能力。如果你有一個 Raspberry Pi 3 和 Ubuntu 盒子可以使用,或者即使你可以購買 Mycroft Mark 1,我認為在這個平臺上進行實驗是非常值得的!


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

評論

查看更多

下載排行

本周

  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次下載  |  免費
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>