引言
隨著人工智能技術的廣泛應用,各種專門為AI設計的硬件設備正迅速涌現。這些設備不僅提升了AI應用的性能,還將其帶入更多生活和工作場景。
比如最先乘著大語言模型的東風,在互聯(lián)網上火起來的rabbit R1硬件。其擁有一塊觸摸屏(官方設定為非觸摸,聽說可以修改系統(tǒng)設置變成可以識別觸屏),以及上下推拉式的對話按鈕,同時還配備了一個360度攝像頭。我們在rabbit R1官網上可以查看到,其擁有一些很酷的小技能。如語音對話,物品識別,雙向翻譯,網絡購物之類的。其在系統(tǒng)級別集成大語言模型的接口,將設備傳感器獲取的多模態(tài)數據(圖像,語言,文字等等,甚至是按鈕操作),在本地進行一些低算力的應用,如果需要高算力的應用支持則需要接入網絡,借助服務器的算力識別。
另外最近各個公司都在積極推出結合自家大模型技術的ai硬件產品,比如智能戒指,智能鼠標之類的。其中最引入矚目的便是字節(jié)跳動公司計劃推出的ai眼鏡、智能耳機產品,相關計算接入了自家的豆包大模型。處理一些語音對話,實時翻譯之類的任務。通過在硬件上搭載的傳感器,收集相關語音輸入,把ai推理所需要的計算放在云端,云端處理完過后將處理結果返回。當然本地也可以執(zhí)行一些算力低的推理任務,將一部分計算上傳至云,此時如何將調度部分任務卸載至云的問題亟待解決。
另外就是一些將ai計算加速硬件,嵌入到產品中。比如npu加速,以及最近很火的ai pc名詞。
為了支持大規(guī)模AI計算,硬件廠商推出了大量適合邊緣設備和嵌入式應用的AI芯片。例如:
谷歌 Coral:基于 Edge TPU,專為邊緣AI任務設計,支持低功耗運行和快速模型推理。英偉達 Jetson 系列:提供強大的GPU性能,用于邊緣設備上的計算密集型AI任務。自家廠商推出的npu,適用于自家硬件平臺,在一些特定任務上有高效加速作用。
此前在llama.cpp剛出來的時候,本人在樹莓派4B上測試推理結果,一個7B參數的模型,推理速度大概是每20s一個token,速度完全不能夠實用。現如今,各種場景下的應用ai模型發(fā)展的都十分迅速,技術更迭也很快,如今已經出現了很多易于配置,應用大模型的一套解決方案。比如dify,ollama之類的大模型應用框架。直接在應用中就可以拉取模型,處理輸入輸出。剛好感謝得捷電子以及電源網聯(lián)合推出的diy活動,希望能通過這個機會體驗一下ai應用,嘗試將大模型更好地、方便地帶入生活之中。
項目目標
計劃是基于樹莓派實現一個本地語言助手,數據保存本地保護隱私。
tip:但在實際開發(fā)過程中,覺得ollama的性能在樹莓派上的表現實在還是不夠,需要更換一些更快的推理引擎。
語音識別:通過 SenseVoice 模型將語音轉化為文字,支持多種語言的語音輸入。
自然語言理解與生成:通過調用 Ollama API 的 Qwen 模型生成智能對話,理解用戶問題并給予自然語言的響應。
語音輸出:通過 pyttsx3 將 Qwen 模型生成的文字回答轉換為語音,返回給用戶。
喚醒功能:實現按鍵和語音(通過 Snowboy)喚醒功能,允許用戶通過不同方式啟動語音助手。
項目材料
樹莓派 5:主控板,負責運行所有邏輯。
USB 聲卡 + 麥克風:用于高質量語音輸入以及輸出。樹莓派是自帶有i2s接口的,但是為了方便還是用的usb免驅的。
軟件
操作系統(tǒng):基于 ubuntu 24。
語音處理:ASR:使用 阿里推出的sensevoice模型,支持多國語言,擁有情感分析
TTS:基于 pyttsx3
LLM 推理:使用ollama大模型應用框架,進行本地語音模型推理
安裝ollama推理框架
Ollama 是一個開源框架,專注于本地部署大型語言模型(LLM),讓用戶無需依賴云服務即可運行強大的 AI 應用。它通過容器化模型管理和輕量化的 API 接口,支持聊天交互、文本生成、模型定制等功能。
curl https://ollama.ai/install.sh | sh
ollama并不支持使用rapberrypi5的gpu處理,雖然自帶的gpu很羸弱。樹莓派5可以裝配pcie擴展的ai加速 kit。
ollama pull tinyllama //拉取模型
ollama list //顯示本地模型
ollama有一套很完整的大模型調用框架。
ollama有對話模式,以及可以調用api。但在我實際運行中,樹莓派上本地調用api返回回答非常慢。
可以通過簡單的 HTTP 請求調用 Ollama 提供的 API 生成文本。
import requests
# 定義請求的 URL 和頭部信息
url = "https://api.ollama.com/v1/generate"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
}
# 定義請求的 payload
payload = {
"model": "qwen", # 使用的模型名稱,支持多個模型
"input": "Hello, how are you?", # 輸入的對話或文本
}
# 發(fā)送請求
response = requests.post(url, json=payload, headers=headers)
# 輸出結果
if response.status_code == 200:
data = response.json()
print("Response:", data['text']) # 返回的生成文本
else:
print(f"Error: {response.status_code}")
使用不同的模型
除了 qwen,Ollama 還支持其他模型。想使用不同的模型,只需在命令中指定模型名稱:
ollama run <model_name> "<input_text>"
例如,如果您想使用 llama 模型進行文本生成,可以執(zhí)行:
ollama run llama "What is the meaning of life?"
模型列表
可以列出 Ollama 支持的所有可用模型:
ollama models
此命令會列出當前可以使用的
安裝阿里的sencevoice
SenseVoice 是一個語音基礎模型,具有多種語音理解功能,包括自動語音識別 (ASR)、口語識別 (LID)、語音情感識別 (SER) 和音頻事件檢測 (AED)。
安裝為python模塊
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./
tts可以使用pip 下的pyttsx3
喚醒進行錄音
# 按鍵喚醒線程
def button_wakeup():
import keyboard
global wakeup_flag
while True:
if keyboard.read_key() == "enter":
with lock:
wakeup_flag = True
print("按鍵喚醒成功!")
# Snowboy 喚醒線程
def snowboy_wakeup(model_path="resources/snowboy.umdl"):
def detected_callback():
global wakeup_flag
with lock:
wakeup_flag = True
print("語音喚醒成功!")
detector = snowboydecoder.HotwordDetector(model_path, sensitivity=0.5)
print("正在監(jiān)聽語音喚醒...")
detector.start(detected_callback=detected_callback)
detector.terminate()
sencevoice語音轉文字
# SenseVoice 音頻轉錄函數
def recognize_speech_with_sensevoice(audio_data, language="auto"):
model_dir = "iic/SenseVoiceSmall"
model = AutoModel(
model=model_dir,
trust_remote_code=True,
remote_code="./model.py",
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 30000},
device="cuda:0",
)
# 將錄音傳給模型進行轉錄
res = model.generate(
input=audio_data,
cache={},
language=language, # "zh", "en", "yue", "ja", "ko", "nospeech"
use_itn=True,
batch_size_s=60,
merge_vad=True,
merge_length_s=15,
)
text = rich_transcription_postprocess(res[0]["text"])
return text
調用ollama的api功能進行推理
# Ollama API 調用
def call_ollama(prompt, api_url="http://localhost:8000/api/generate"):
headers = {"Content-Type": "application/json"}
payload = {"prompt": prompt, "model": "qwen"}
try:
response = requests.post(api_url, json=payload)
if response.status_code == 200:
return response.json().get("text", "No response.")
else:
return f"Error: {response.status_code}"
except Exception as e:
return f"Exception occurred: {str(e)}"
這里的推理速度很奇怪,在ollama進入對話模式的時候,推理速度是很快的,但是調用api的時候推理十分慢。感覺應該是cpu占用問題,ollama的cpu占用較大,很影響效率。
錄音功能
# 錄音功能
def record_audio(duration=5, sample_rate=16000):
print("開始錄音...")
audio = sd.rec(int(duration * sample_rate), samplerate=sample_rate, channels=1, dtype=np.int16)
sd.wait()
print("錄音結束。")
return audio
調用tts語音
# 全局變量
wakeup_flag = False
lock = threading.Lock()
# 初始化語音合成
def speak(text):
engine = pyttsx3.init()
engine.setProperty('rate', 150) # 設置語速
engine.setProperty('voice', 'english') # 設置語音
engine.say(text)
engine.runAndWait()
語音本來是也想用阿里的cozyvoice模型的,但是看了一下好像對arm支持不是很好,并且自帶了英偉達顯卡的加速,如果不能用加速的話本地跑是非常非常慢的,對于想實時對話來說不太現實。可以考慮在服務器部署然后調用相關的api。
總結:
在本項目中,我開發(fā)了一個基于大語言模型(LLM)的語音助手系統(tǒng),使用了Ollama API來處理文本生成任務,結合 SenseVoice 進行語音轉錄,最終使用 pyttsx3 進行語音合成,使用了按鍵或者是snowboy進行喚醒錄音。
項目不足:推理速度較慢: 使用 Ollama API 進行大語言模型推理時,響應速度不盡如人意。雖然 OLLama 提供了便捷的接口,但由于網絡延遲及模型本身推理的時間,導致響應速度較慢,尤其是在進行長文本生成時。
語音識別的準確性問題: 盡管 SenseVoice 支持多語言轉錄,但在嘈雜環(huán)境或發(fā)音不清晰時,識別效果仍存在一定局限性,尤其是在口音多樣化的情況下。
改進方向:本地部署優(yōu)化: 為了提升推理速度,考慮將 Ollama 或類似的大語言模型替換為其他支持大模型的推理引擎llama.cpp,這樣可以提升響應速度。
由于在大模型應用做實踐的比較少,ollama在算力高的平臺是非常易用的,但是跑在樹莓派5上性能就有點不盡人意。這也讓我認識到,在項目初期制定方案的時候,應該參考網上已有的用例,看是否可行并且高效。在邊緣設備上一般采用性能更好的使用c++推理的框架。