Van-to-Quote:將口述工作記錄轉成定價 PDF 報價單的本地應用程式
Van-to-Quote
Van-to-Quote 是一款本地應用程式,可將技工口述的工作記錄轉成包含項目、數量、人工及 VAT 的 PDF 報價單。faster-whisper 負責轉錄,Qwen2.5 3B 在本地抽取資料,價格及計算則由用戶的價目表和程式碼決定,模型不會設定價格。下載模型後,整個流程可離線執行,客戶姓名、地址及價格不會離開筆記簿電腦。
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle*
What I Built
Van-to-Quote is a local app that turns a tradesperson's spoken job notes into a priced PDF quote.
Plumbers, electricians and other tradespeople finish a job and then spend an evening typing up quotes. Cloud quoting apps charge a monthly fee, need a signal, and keep customer data on someone else's server. With Van-to-Quote you hold a button and say "replaced two radiators, three hours, forty meters of pipe". A draft quote appears with the right items, quantities, labour and VAT. You fix anything that looks off, then download the PDF.
Who would pay: solo tradespeople and small trade businesses who quote on site, often with poor signal. Because there is no per-quote cost, it could be sold as a one-time license or a small flat fee.
Demo
See the demo GIF and screenshots in the README: [PASTE REPO LINK]
Code
Van-to-Quote 🔧
Talk about a job, get a priced PDF quote. Runs fully offline once models are downloaded.
Setup
- Install Ollama (https://ollama.com), then:
ollama pull qwen2.5:7b(orqwen2.5:3bfor small laptops) pip install -r requirements.txt- Edit
prices.jsonwith your business name, rates, VAT and price list -
python app.pyand open http://localhost:5000
Mic access works on localhost. To use from a phone on your wifi, serve over HTTPS or use the text box.
How it works
Whisper (faster-whisper) transcribes -> a local LLM extracts items, quantities and hours as JSON -> your own price list supplies every price and all maths is plain code. The model never makes up a price. Config via env vars: LLM_MODEL, WHISPER_MODEL, OLLAMA_URL.
How I Built It
The whole pipeline runs on a laptop:
- faster-whisper (open-source speech recognition) transcribes the recording.
- Qwen2.5 3B, running locally through Ollama, extracts the customer, items, quantities and labour hours as JSON.
- Plain Python matches items against the tradesperson's own
prices.json, calculates VAT and totals, and builds the PDF with ReportLab. - A small Flask web page shows an editable draft. Items that aren't in the price list are flagged orange so a price can be set by hand.
The key design choice: the model never sets a price. It only decides what was done. The price list and ordinary code decide what it costs. A small model can mishear a number, but it can't invent a price or get the maths wrong, and every mistake is visible on the draft screen before anything is sent.
I tested the full flow end to end on my own laptop with spoken job descriptions.
Why Does Open Innovation Matter?
- Private by design. Customer names, addresses and prices never leave the laptop. A cloud API can't offer that.
- Works with no signal. Basements, new builds and rural jobs are exactly where tradespeople quote.
- Costs nothing per quote. There is no API bill, so a flat price for the tool still leaves real margin however many quotes someone writes.
- Swappable and adaptable. Changing the model is one setting, and the price list and prompt are plain files. A plumber, a painter and an electrician can each have their own setup, and nobody's pricing or terms can change under them.
來源:DEV Community · dev.to