【Python 軍火庫🧨 - websockets】傳送/接收音檔並轉換成numpy(基礎篇)

閱讀時間約 6 分鐘
raw-image



關於Websockets的篇章, 有興趣的朋友歡迎參考:

而這一篇章的主題主要是來分享如何透過websockets傳遞音檔並進行解碼, 我們都知道聲音的運算在Python的世界裡通常會轉成numpy或者是torch.Tensor這樣的資料結構來進行語音辨識、VAD、人聲分離…相關的語音計算, 但這會牽涉到音訊的編碼與解碼, 對於一般工程背景的開發者來說會相對較為複雜一些, 我們會嘗試著以較為基本知識的角度來進行傳輸層的說明與分析作法。

那麼首先在進入主題之前, 我們非常推薦您閱讀「【Python 軍火庫 - websockets】雙向溝通的渠道」, 因為當我們掌握了基本的傳輸方式之後, 之後的難題僅是編碼與解碼的過程, 所以請嘗試著根據說明搭建起websockets的傳輸與接收框架吧!

那麼關於編碼與解碼就會面臨到兩個問題了, 究竟是要Client端解碼後送到後端,還是後端再進行解碼呢?

那麼我們今天的主題就先來談談第一種,從Client端對音檔解碼之後傳送到後端的過程吧!

Client端

對於Client端來說,要進行音訊的讀取勢必會需要一些好用的套件,包括soundfile、pydub、…等,那我們就先用soundfile這個套件來進行示範吧!

關於soundfile我們先來簡單的說明一下, 它提供了對各種音頻文件格式的支持,這個模組的主要目的是簡化在 Python 中處理音頻文件的任務,使用戶能夠輕鬆地讀取和編寫不同格式的音頻數據。

安裝的部分:

# 記得安裝一下ffmpeg,我們的底層端會透過ffmpeg進行音訊處理
apt install ffmpeg

# 透過pip安裝soundfile套件
pip install soundfile

正式進入音訊解碼片段,以下是片段示範,透過soundfile音訊解碼後成numpy資料再轉成bytes進行傳送:

import asyncio
import websockets
import soundfile as sf

async def client():
async with websockets.connect(
'ws://0.0.0.0:8766',
ping_interval=None,
) as websocket: # noqa
sound_file = 'test.wav'
print(f'Sending {sound_file}')

chunk_size = 4096

# 讀取音檔並解碼成numpy再轉成bytes送websockets
with sf.SoundFile(sound_file, 'r') as file:
while True:
data = file.read(chunk_size, dtype='float32')
if data.size == 0:
break
chunk = data.tobytes()
await websocket.send(chunk)

await websocket.send('Done')

asyncio.run(client())

Server端

Server端的部分則是將接收到的bytes資料透過numpy的轉換轉成陣列結構, 後續我們可以進行語音辨識、VAD、去背景噪音…等音訊處理的作業。

import asyncio
import websockets
import numpy as np

async def server(websocket, path):
while True:
try:
message = await websocket.recv()
if message == 'Done':
return None

# 轉換成numpy資料型態準備進行後續運算
array = np.frombuffer(message, dtype=np.float32)

print(len(array))
except websockets.exceptions.ConnectionClosedOK:
print("Client disconnected")
break

async def main():
async with websockets.serve(server, "0.0.0.0", 8766):
print('start server: 0.0.0.0:8766')
await asyncio.Future() # run forever

asyncio.run(main())

我們可以接收到的資料長度如下:

raw-image


結語

音訊又是一門不同境界的學問, 不過我們也不要氣餒,所有跟程式有關的運作都離不開一些共同的核心邏輯,只要我們按部就班,打好基礎耐心學習,相信總有一天會將所有知識點融會貫通,也希望這個篇章能夠讓您學習到如何透過websockets來傳遞音訊並進行運算處理。

對了,今天的方式主要是透過Client端進行音訊解碼的動作,這樣的方式雖然簡單,但額外的傳輸成本較大,因此我們會在「【💎Python 軍火庫 - websockets】傳送/接收音檔並轉換成numpy(進階篇)」教您如何在Server端進行解碼,而Client端只要將檔案原封不動的傳送即可。

113會員
254內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
本文介紹了Python如何使用websockets進行雙向溝通,包括文字、json、xml和音訊的傳遞。特別著重於json資料交換格式,以及websockets通道的基本流程和關鍵的編碼與解碼。最終談到WebSocket對於傳統同步程式的轉變及對asyncio等套件的重要性。
我們常常在看開源專案時, 會在函式中看到「*args」與「**kwargs」這兩個參數, 一直以來都很好奇也尚未使用, 趁著好奇心強烈的時期趕緊來了解一番, 並且將學習過程轉化為易懂的概念提供給有需要的朋友參考, 也期望我們能夠共同學習程式語言, 讓科技引領世界進步。 首先是 *args 會
Websocket是一種網路傳輸的協定,讓建立一次handshake的過程就可以相互傳遞資料,而非同步的過程能夠讓處理事情更有效率,這篇文章將帶你深入瞭解Websocket如何運作、以及其特點與優勢。
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
我們在處理音檔時常常會使用到 [soundfile](https://pypi.org/project/soundfile/) 這套工具, 當我們試圖讀取檔案時卻發生了這樣的錯誤訊息… TypeError: Not allowed for existing files (except 'RAW')
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
本文介紹了Python如何使用websockets進行雙向溝通,包括文字、json、xml和音訊的傳遞。特別著重於json資料交換格式,以及websockets通道的基本流程和關鍵的編碼與解碼。最終談到WebSocket對於傳統同步程式的轉變及對asyncio等套件的重要性。
我們常常在看開源專案時, 會在函式中看到「*args」與「**kwargs」這兩個參數, 一直以來都很好奇也尚未使用, 趁著好奇心強烈的時期趕緊來了解一番, 並且將學習過程轉化為易懂的概念提供給有需要的朋友參考, 也期望我們能夠共同學習程式語言, 讓科技引領世界進步。 首先是 *args 會
Websocket是一種網路傳輸的協定,讓建立一次handshake的過程就可以相互傳遞資料,而非同步的過程能夠讓處理事情更有效率,這篇文章將帶你深入瞭解Websocket如何運作、以及其特點與優勢。
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
我們在處理音檔時常常會使用到 [soundfile](https://pypi.org/project/soundfile/) 這套工具, 當我們試圖讀取檔案時卻發生了這樣的錯誤訊息… TypeError: Not allowed for existing files (except 'RAW')
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
Thumbnail
我們將探索函式的定義和調用,這是程式設計中非常重要且強大的概念,它可以將大型程式切割成小的、可重複使用的函式。讓我們一起來了解吧!函式的定義、呼叫和返回值是學習函式的核心。
Thumbnail
探索Python學習筆記中列表的建立、存取和常用方法。從使用中括號定義列表到了解索引、新增、刪除、修改等操作,並介紹append、remove、count等常用方法。
Thumbnail
在本篇Python學習筆記中,我們探討了字典的建立與存取,以及常用方法,字典是一種強大的資料型態,透過key和value的對應關係存儲和取得資料,我們學會了建立字典、存取資料、新增/修改/刪除項目,以及取得key和value的方法,字典是Python中不可或缺的工具!
Thumbnail
我們探討了while迴圈的使用,不同於for迴圈,while迴圈以條件式判斷為基礎,而非限定重複次數。我們介紹了使用break語句強制結束迴圈,以及使用continue語句跳過特定程式碼並返回迴圈開頭,同時,我們提及了無窮迴圈的概念,強調了在迴圈中必須更改迴圈變數的值,以避免無窮迴圈的發生。
在這篇文章中,我們將講解一些常見的語音技術以及如何在Python中使用這些技術。 安裝套件 匯入套件 語音辨識:
Thumbnail
當我們抓取了相當多的網站資料,這些來自不同網站的資料總不可能全都匯集成一張Excel吧,因此通常在寫程式的使用者,都需要一個可以存放資料,並進行串聯的資料庫(SQL),因此我們今天就來教大家如何安裝使用免費的資料庫吧!!
Thumbnail
今天我們再來教更多不一樣的回訊方式,像是讓機器人回傳圖片、影片,甚至是音訊,使我們的機器人更佳的活靈活現,就讓我們趕快開始今天的教學吧!!
Thumbnail
今天我們繼續來教學LINE Bot的一些基本功能,在之前的教學中,我們都單純的讓機器人回覆文字,但這樣就讓機器人顯得有點生硬,為了讓其更加的活靈活現,LINE官方還提供其他不一樣的回訊方式,而今天我們就來教大家如何讓機器人回傳貼圖以及位置座標吧!!
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
Thumbnail
我們將探索函式的定義和調用,這是程式設計中非常重要且強大的概念,它可以將大型程式切割成小的、可重複使用的函式。讓我們一起來了解吧!函式的定義、呼叫和返回值是學習函式的核心。
Thumbnail
探索Python學習筆記中列表的建立、存取和常用方法。從使用中括號定義列表到了解索引、新增、刪除、修改等操作,並介紹append、remove、count等常用方法。
Thumbnail
在本篇Python學習筆記中,我們探討了字典的建立與存取,以及常用方法,字典是一種強大的資料型態,透過key和value的對應關係存儲和取得資料,我們學會了建立字典、存取資料、新增/修改/刪除項目,以及取得key和value的方法,字典是Python中不可或缺的工具!
Thumbnail
我們探討了while迴圈的使用,不同於for迴圈,while迴圈以條件式判斷為基礎,而非限定重複次數。我們介紹了使用break語句強制結束迴圈,以及使用continue語句跳過特定程式碼並返回迴圈開頭,同時,我們提及了無窮迴圈的概念,強調了在迴圈中必須更改迴圈變數的值,以避免無窮迴圈的發生。
在這篇文章中,我們將講解一些常見的語音技術以及如何在Python中使用這些技術。 安裝套件 匯入套件 語音辨識:
Thumbnail
當我們抓取了相當多的網站資料,這些來自不同網站的資料總不可能全都匯集成一張Excel吧,因此通常在寫程式的使用者,都需要一個可以存放資料,並進行串聯的資料庫(SQL),因此我們今天就來教大家如何安裝使用免費的資料庫吧!!
Thumbnail
今天我們再來教更多不一樣的回訊方式,像是讓機器人回傳圖片、影片,甚至是音訊,使我們的機器人更佳的活靈活現,就讓我們趕快開始今天的教學吧!!
Thumbnail
今天我們繼續來教學LINE Bot的一些基本功能,在之前的教學中,我們都單純的讓機器人回覆文字,但這樣就讓機器人顯得有點生硬,為了讓其更加的活靈活現,LINE官方還提供其他不一樣的回訊方式,而今天我們就來教大家如何讓機器人回傳貼圖以及位置座標吧!!