ساختن یک دستیار صوتی در زمان واقعی با LLM های محلی در PI Raspberry

مقدمه
در این سند ، من سفر خود را برای تبدیل یک Raspberry Pi به یک دستیار صدا قدرتمند و در زمان واقعی به اشتراک می گذارم. هدف این بود:
- ورودی صدا را ضبط کنید از طریق رابط وب.
- متن را پردازش کنید با استفاده از یک LLM محلی (مانند MISTRAL) که روی PI اجرا می شود.
- پاسخ های صوتی ایجاد کنید استفاده از پیپر برای متن به گفتار (TTS).
- همه چیز را در زمان واقعی پخش کنید از طریق WebSockets.
همه اینها اجرا می شود زیر در Raspberry Pi – هیچ سرویس ابری درگیر نیست. بیایید به نحوه ساخت من قدم به قدم شیرجه بزنیم!
1. تنظیم Raspberry Pi
اول ، من تمشک Pi خود را با جدیدترین سیستم عامل Raspberry Pi تنظیم کردم. فعال کردن رابط های سخت افزاری و اتصال یک میکروفون و بلندگو USB مهم است.
مراحل:
- سیستم را به روز کنید:
sudo apt-get update
sudo apt-get upgrade
- رابط صوتی را فعال کنید:
sudo raspi-config
به سمت گزینه های سیستم> صوتی و دستگاه ورودی/ورودی صحیح را انتخاب کنید.
2. نصب Ollama برای LLM های محلی
Ollama اجرای LLM های محلی را آسان می کند غلط روی تمشک پی. من آن را با استفاده از:
curl -fsSL https://ollama.com/install.sh | sh
پس از نصب ، من غلط مدل:
ollama pull mistral
برای تأیید این کار ، من یک آزمایش سریع انجام دادم:
ollama run mistral
این مدل آماده پردازش متن درست در PI بود!
3. تنظیم پیپر برای متن به گفتار (TTS)
برای تولید صدای آفلاین ، من انتخاب کردم قیطار -یک موتور TTS منبع باز فوق العاده.
- وابستگی ها را نصب کنید:
sudo apt-get install wget build-essential libsndfile1
- بارگیری Piper for ARM64 (Raspberry Pi):
wget https://github.com/rhasspy/piper/releases/download/v1.0.0/piper_arm64.tar.gz
tar -xvzf piper_arm64.tar.gz
chmod +x piper
sudo mv piper /usr/local/bin/
- اگر پیپر کار می کند آزمایش کنید:
echo "Hello, world!" | piper --model en_US --output_file output.wav
aplay output.wav
حالا PI می تواند “صحبت” کند!
4. ایجاد باطن (node.js)
من یک ساده ساختم node.js سرور به:
- متن را از مشتری قبول کنید (ورودی صوتی از یک برنامه وب).
- پردازش آن با استفاده از غلط (از طریق اولاما).
- پاسخ LLM را به گفتار تبدیل کنید قیطاربشر
- صدا را به مشتری برگردانید.
server.js:
const express = require('express');
const { exec } = require('child_process');
const WebSocket = require('ws');
const app = express();
const PORT = 3001;
// WebSocket setup
const wss = new WebSocket.Server({ port: 3002 });
wss.on('connection', (ws) => {
console.log('Client connected');
ws.on('message', (message) => {
console.log('Received:', message);
// Run Mistral LLM
exec(`ollama run mistral "${message}"`, (err, stdout) => {
if (err) {
console.error('LLM error:', err);
ws.send('Error processing your request.');
return;
}
// Convert LLM response to speech using Piper
exec(`echo "${stdout}" | piper --model en_US --output_file output.wav`, (ttsErr) => {
if (ttsErr) {
console.error('Piper error:', ttsErr);
ws.send('Error generating speech.');
return;
}
// Send the audio file back to the client
ws.send(JSON.stringify({ text: stdout, audio: 'output.wav' }));
});
});
});
});
app.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});
5. ایجاد رابط وب در زمان واقعی (React)
برای جبهه ، من یک ساده ایجاد کردم برنامه واکنش به:
- ورودی صدا را ضبط کنید.
- پاسخ های متن در زمان واقعی را نمایش دهید.
- پخش صوتی تولید شده را پخش کنید.
app.js:
import React, { useState } from 'react';
function App() {
const [text, setText] = useState('');
const [response, setResponse] = useState('');
const [audio, setAudio] = useState(null);
const ws = new WebSocket('ws://localhost:3002');
const handleSend = () => {
ws.send(text);
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
setResponse(data.text);
fetch(`http://localhost:3001/${data.audio}`)
.then(res => res.blob())
.then(blob => {
setAudio(URL.createObjectURL(blob));
});
};
return (
<div>
<h1>Voice Assistant</h1>
<textarea value={text} onChange={(e) => setText(e.target.value)} />
<button onClick={handleSend}>Send</button>
<h2>Response:</h2>
<p>{response}</p>
{audio && <audio controls src={audio} />}
</div>
);
}
export default App;
6. اجرای پروژه
پس از آماده شدن پس زمینه و جلو ، من هر دو را راه اندازی کردم:
node server.js
npm start
من به برنامه وب در IP Raspberry Pi در پورت 3000 دسترسی پیدا کردم و در میکروفون صحبت کردم – و Voilà! دستیار در زمان واقعی پاسخ داد ، همه به صورت محلی پردازش می شوند.
پایان
ساختن یک دستیار صوتی کاملاً آفلاین در Raspberry Pi یک چالش هیجان انگیز بود. با:
- اولاما برای اجرای LLM های محلی (مانند mistral)
- قیطار برای متن با کیفیت بالا
- جوراب برای برقراری ارتباط در زمان واقعی
- واکنش نشان دادن برای یک رابط وب صاف
… من اکنون یک AI صوتی شخصی دارم که بدون تکیه بر ابر کار می کند.