Field service work is built on information: what the customer said, what you found, what parts you used, how long it took, and what needs to happen next. Most of that information lives in someone's head until it gets forgotten, shortened, or left out of the job record entirely. A quick voice note recorded right after the job is faster than filling out a form — but only if it actually turns into a usable record.
This weekend build takes that voice note and automatically transcribes it using a free, open-source model, then uses Claude to pull out the structured fields your job management system needs: work done, parts used, time on site, and follow-up actions. No subscription transcription service, no manual typing.
How the Pipeline Works
The build has three steps, and each one is straightforward:
- Record. After a job, record a voice memo on your phone. Say what you did, what parts you used, how long it took, and what the customer might need next. A minute or two is plenty.
- Transcribe. The audio file gets processed by Whisper, OpenAI's open-source speech recognition model, released under the MIT licence. Whisper runs entirely on your own machine — the audio never leaves your computer.
- Structure. The transcript goes to Claude via the Anthropic Python SDK, with a prompt that extracts specific fields: type of work, parts used, estimated time on site, and any follow-up actions.
The output is a clean JSON object you can drop into a spreadsheet, push to your CRM, or paste into your job management tool.
What You Need
- Python 3.9 or later
- Whisper from OpenAI — MIT licence, free to run locally
- The Anthropic Python SDK (
pip install anthropic) - An Anthropic API key
- ffmpeg for audio handling (see install note below)
No cloud transcription account, no SaaS subscription. The only ongoing cost is the Claude API calls, which are small for short transcripts.
Build It in Four Steps
Step 1 — Install the dependencies
pip install openai-whisper anthropic
Whisper also needs ffmpeg to decode audio files. On macOS: brew install ffmpeg. On Ubuntu or Debian: sudo apt install ffmpeg. On Windows, download the binary from ffmpeg.org and add it to your PATH.
Step 2 — Transcribe the audio
import whisper
model = whisper.load_model("turbo") # fast and accurate; ~1.5 GB download first run
result = model.transcribe("job-notes.m4a")
transcript = result["text"]
The turbo model is a solid starting point: faster than the large model and accurate enough for most field audio. Switch to large if you work in noisy environments and accuracy matters more than speed.
Step 3 — Structure the transcript with Claude
import anthropic, json
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from your environment
prompt = f"""You are a job-records assistant for a field service business.
Extract the following fields from this voice note transcript.
Return ONLY valid JSON, no explanation.
Fields:
- job_type: category of work (e.g. "HVAC repair", "plumbing", "electrical")
- work_done: short description of what was completed
- parts_used: list of parts, materials, or equipment mentioned
- time_on_site: duration if mentioned, otherwise "not stated"
- next_steps: list of follow-up actions mentioned
- customer_name: if mentioned, otherwise "not stated"
Transcript:
{transcript}"""
message = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=512,
messages=[{"role": "user", "content": prompt}]
)
job_record = json.loads(message.content[0].text)
Using claude-haiku-4-5-20251001 keeps the cost low for this extraction task. It is fast and reliable for pulling structured fields from a short, conversational transcript.
Step 4 — Save the record
import csv, os
out_file = "job_records.csv"
fields = ["job_type", "work_done", "parts_used", "time_on_site", "next_steps", "customer_name"]
file_exists = os.path.exists(out_file)
with open(out_file, "a", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fields)
if not file_exists:
writer.writeheader()
row = {k: "; ".join(v) if isinstance(v, list) else v for k, v in job_record.items()}
writer.writerow(row)
Drop an audio file in a folder, run the script, and the record lands in a CSV you can import anywhere — QuickBooks, a Google Sheet, your CRM, or a plain-text log.
What the Output Looks Like
Given a voice note like: "Finished the furnace at the McKenzie place. Replaced the heat exchanger and the igniter. Took about two and a half hours. Told them the filter should be changed in three months."
The script produces:
{
"job_type": "HVAC repair",
"work_done": "Replaced heat exchanger and igniter on furnace",
"parts_used": ["heat exchanger", "igniter"],
"time_on_site": "2.5 hours",
"next_steps": ["Customer to replace filter in 3 months"],
"customer_name": "McKenzie"
}
That is a record your office can work from immediately — no decoding required.
Take It Further
Once the basic script is running, a few natural extensions will save even more time:
- Watch a folder automatically. Use Python's
watchdoglibrary to trigger the pipeline whenever a new audio file appears in a designated drop folder. Record on your phone, share to Dropbox or a shared drive, and the record appears without any manual step. - Add a date and technician stamp. Pull the filename or system time to automatically tag each record with when it was created and who ran it — useful if more than one person is feeding notes into the same log.
- Email the record to your office. After extraction, send the JSON or a plain-text summary using Python's
smtplib. The office sees a clean note before you've even driven back. - Push directly to a spreadsheet. The Google Sheets API lets you append each record as a new row. One script, no copy-paste.
- Tune the prompt to your trade. Add fields specific to your work — for a plumbing shop, that might include fixture type, permit number, and water pressure reading. The more specific the prompt, the more consistent the output.
A Note on Accuracy
Whisper handles most field audio well, but noisy environments — compressors running, traffic nearby, wind — can reduce accuracy. A few habits help: record indoors or in your truck, speak clearly for the first few words to let the model orient, and use consistent terminology for your most common job types. If a record looks wrong, the raw transcript is right there to review.
Claude's extraction is reliable for clear transcripts. For the first week or two, review every output before it goes into your real job log. Once you trust the results on your specific vocabulary, you can let it run unreviewed.
The tools to build this have been freely available for years. What is new is that the AI piece — turning a messy spoken transcript into clean structured data — is now reliable enough to be worth putting into a real workflow. If your field notes are currently scattered across voice memos, paper, and memory, this is a weekend project that actually pays off on Monday morning.
