引言
隨著人工智能技術(shù)的廣泛應(yīng)用,各種專門為AI設(shè)計的硬件設(shè)備正迅速涌現(xiàn)。這些設(shè)備不僅提升了AI應(yīng)用的性能,還將其帶入更多生活和工作場景。
比如最先乘著大語言模型的東風(fēng),在互聯(lián)網(wǎng)上火起來的rabbit R1硬件。其擁有一塊觸摸屏(官方設(shè)定為非觸摸,聽說可以修改系統(tǒng)設(shè)置變成可以識別觸屏),以及上下推拉式的對話按鈕,同時還配備了一個360度攝像頭。我們在rabbit R1官網(wǎng)上可以查看到,其擁有一些很酷的小技能。如語音對話,物品識別,雙向翻譯,網(wǎng)絡(luò)購物之類的。其在系統(tǒng)級別集成大語言模型的接口,將設(shè)備傳感器獲取的多模態(tài)數(shù)據(jù)(圖像,語言,文字等等,甚至是按鈕操作),在本地進(jìn)行一些低算力的應(yīng)用,如果需要高算力的應(yīng)用支持則需要接入網(wǎng)絡(luò),借助服務(wù)器的算力識別。
另外最近各個公司都在積極推出結(jié)合自家大模型技術(shù)的ai硬件產(chǎn)品,比如智能戒指,智能鼠標(biāo)之類的。其中最引入矚目的便是字節(jié)跳動公司計劃推出的ai眼鏡、智能耳機(jī)產(chǎn)品,相關(guān)計算接入了自家的豆包大模型。處理一些語音對話,實時翻譯之類的任務(wù)。通過在硬件上搭載的傳感器,收集相關(guān)語音輸入,把ai推理所需要的計算放在云端,云端處理完過后將處理結(jié)果返回。當(dāng)然本地也可以執(zhí)行一些算力低的推理任務(wù),將一部分計算上傳至云,此時如何將調(diào)度部分任務(wù)卸載至云的問題亟待解決。
另外就是一些將ai計算加速硬件,嵌入到產(chǎn)品中。比如npu加速,以及最近很火的ai pc名詞。
為了支持大規(guī)模AI計算,硬件廠商推出了大量適合邊緣設(shè)備和嵌入式應(yīng)用的AI芯片。例如:
谷歌 Coral:基于 Edge TPU,專為邊緣AI任務(wù)設(shè)計,支持低功耗運行和快速模型推理。英偉達(dá) Jetson 系列:提供強大的GPU性能,用于邊緣設(shè)備上的計算密集型AI任務(wù)。自家廠商推出的npu,適用于自家硬件平臺,在一些特定任務(wù)上有高效加速作用。
此前在llama.cpp剛出來的時候,本人在樹莓派4B上測試推理結(jié)果,一個7B參數(shù)的模型,推理速度大概是每20s一個token,速度完全不能夠?qū)嵱谩,F(xiàn)如今,各種場景下的應(yīng)用ai模型發(fā)展的都十分迅速,技術(shù)更迭也很快,如今已經(jīng)出現(xiàn)了很多易于配置,應(yīng)用大模型的一套解決方案。比如dify,ollama之類的大模型應(yīng)用框架。直接在應(yīng)用中就可以拉取模型,處理輸入輸出。剛好感謝得捷電子以及電源網(wǎng)聯(lián)合推出的diy活動,希望能通過這個機(jī)會體驗一下ai應(yīng)用,嘗試將大模型更好地、方便地帶入生活之中。
項目目標(biāo)
計劃是基于樹莓派實現(xiàn)一個本地語言助手,數(shù)據(jù)保存本地保護(hù)隱私。
tip:但在實際開發(fā)過程中,覺得ollama的性能在樹莓派上的表現(xiàn)實在還是不夠,需要更換一些更快的推理引擎。
語音識別:通過 SenseVoice 模型將語音轉(zhuǎn)化為文字,支持多種語言的語音輸入。
自然語言理解與生成:通過調(diào)用 Ollama API 的 Qwen 模型生成智能對話,理解用戶問題并給予自然語言的響應(yīng)。
語音輸出:通過 pyttsx3 將 Qwen 模型生成的文字回答轉(zhuǎn)換為語音,返回給用戶。
喚醒功能:實現(xiàn)按鍵和語音(通過 Snowboy)喚醒功能,允許用戶通過不同方式啟動語音助手。
項目材料
樹莓派 5:主控板,負(fù)責(zé)運行所有邏輯。
USB 聲卡 + 麥克風(fēng):用于高質(zhì)量語音輸入以及輸出。樹莓派是自帶有i2s接口的,但是為了方便還是用的usb免驅(qū)的。
軟件
操作系統(tǒng):基于 ubuntu 24。
語音處理:ASR:使用 阿里推出的sensevoice模型,支持多國語言,擁有情感分析
TTS:基于 pyttsx3
LLM 推理:使用ollama大模型應(yīng)用框架,進(jìn)行本地語音模型推理
安裝ollama推理框架
Ollama 是一個開源框架,專注于本地部署大型語言模型(LLM),讓用戶無需依賴云服務(wù)即可運行強大的 AI 應(yīng)用。它通過容器化模型管理和輕量化的 API 接口,支持聊天交互、文本生成、模型定制等功能。
curl https://ollama.ai/install.sh | sh
ollama并不支持使用rapberrypi5的gpu處理,雖然自帶的gpu很羸弱。樹莓派5可以裝配pcie擴(kuò)展的ai加速 kit。
ollama pull tinyllama //拉取模型
ollama list //顯示本地模型
ollama有一套很完整的大模型調(diào)用框架。
ollama有對話模式,以及可以調(diào)用api。但在我實際運行中,樹莓派上本地調(diào)用api返回回答非常慢。
可以通過簡單的 HTTP 請求調(diào)用 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)
# 輸出結(jié)果
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 模型進(jìn)行文本生成,可以執(zhí)行:
ollama run llama "What is the meaning of life?"
模型列表
可以列出 Ollama 支持的所有可用模型:
ollama models
此命令會列出當(dāng)前可以使用的
安裝阿里的sencevoice
SenseVoice 是一個語音基礎(chǔ)模型,具有多種語音理解功能,包括自動語音識別 (ASR)、口語識別 (LID)、語音情感識別 (SER) 和音頻事件檢測 (AED)。
安裝為python模塊
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./
tts可以使用pip 下的pyttsx3
喚醒進(jìn)行錄音
# 按鍵喚醒線程
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語音轉(zhuǎn)文字
# SenseVoice 音頻轉(zhuǎn)錄函數(shù)
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",
)
# 將錄音傳給模型進(jìn)行轉(zhuǎn)錄
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
調(diào)用ollama的api功能進(jìn)行推理
# Ollama API 調(diào)用
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進(jìn)入對話模式的時候,推理速度是很快的,但是調(diào)用api的時候推理十分慢。感覺應(yīng)該是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("錄音結(jié)束。")
return audio
調(diào)用tts語音
# 全局變量
wakeup_flag = False
lock = threading.Lock()
# 初始化語音合成
def speak(text):
engine = pyttsx3.init()
engine.setProperty('rate', 150) # 設(shè)置語速
engine.setProperty('voice', 'english') # 設(shè)置語音
engine.say(text)
engine.runAndWait()
語音本來是也想用阿里的cozyvoice模型的,但是看了一下好像對arm支持不是很好,并且自帶了英偉達(dá)顯卡的加速,如果不能用加速的話本地跑是非常非常慢的,對于想實時對話來說不太現(xiàn)實??梢钥紤]在服務(wù)器部署然后調(diào)用相關(guān)的api。
總結(jié):
在本項目中,我開發(fā)了一個基于大語言模型(LLM)的語音助手系統(tǒng),使用了Ollama API來處理文本生成任務(wù),結(jié)合 SenseVoice 進(jìn)行語音轉(zhuǎn)錄,最終使用 pyttsx3 進(jìn)行語音合成,使用了按鍵或者是snowboy進(jìn)行喚醒錄音。
項目不足:推理速度較慢: 使用 Ollama API 進(jìn)行大語言模型推理時,響應(yīng)速度不盡如人意。雖然 OLLama 提供了便捷的接口,但由于網(wǎng)絡(luò)延遲及模型本身推理的時間,導(dǎo)致響應(yīng)速度較慢,尤其是在進(jìn)行長文本生成時。
語音識別的準(zhǔn)確性問題: 盡管 SenseVoice 支持多語言轉(zhuǎn)錄,但在嘈雜環(huán)境或發(fā)音不清晰時,識別效果仍存在一定局限性,尤其是在口音多樣化的情況下。
改進(jìn)方向:本地部署優(yōu)化: 為了提升推理速度,考慮將 Ollama 或類似的大語言模型替換為其他支持大模型的推理引擎llama.cpp,這樣可以提升響應(yīng)速度。
由于在大模型應(yīng)用做實踐的比較少,ollama在算力高的平臺是非常易用的,但是跑在樹莓派5上性能就有點不盡人意。這也讓我認(rèn)識到,在項目初期制定方案的時候,應(yīng)該參考網(wǎng)上已有的用例,看是否可行并且高效。在邊緣設(shè)備上一般采用性能更好的使用c++推理的框架。