<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Martin Espericueta</title>
    <description>The latest articles on DEV Community by Martin Espericueta (@martineg).</description>
    <link>https://dev.to/martineg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F775616%2F3cbca6b8-5155-48c7-b90f-131b4b4c6086.jpg</url>
      <title>DEV Community: Martin Espericueta</title>
      <link>https://dev.to/martineg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martineg"/>
    <language>en</language>
    <item>
      <title>I turned my neighborhood into an offline audio tour with Gemma and Piper</title>
      <dc:creator>Martin Espericueta</dc:creator>
      <pubDate>Sun, 11 Oct 2026 08:15:20 +0000</pubDate>
      <link>https://dev.to/martineg/i-turned-my-neighborhood-into-an-offline-audio-tour-with-gemma-and-piper-1m9</link>
      <guid>https://dev.to/martineg/i-turned-my-neighborhood-into-an-offline-audio-tour-with-gemma-and-piper-1m9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Have you ever thought there's nothing to do in your city? I did. I used to think I lived in a small city with nothing to see. The truth is I wasn't looking. I was looking at my phone.&lt;/p&gt;

&lt;p&gt;So I built an app that finds the places worth stopping at near me, tells me their stories, and lets me keep the phone in my pocket. On the first tour I made with it, I learned about places in my own city I had never really noticed: parks, murals, churches and sculptures.&lt;/p&gt;

&lt;p&gt;Walk &amp;amp; Talk turns any spot on the map into a walking tour you listen to. Pick a starting point, how far you want to walk, how many stops, and the language. The app finds the places nearby and writes a short story for each one.&lt;/p&gt;

&lt;p&gt;Then put on your headphones, start the walk, and put the phone in your pocket. You won't need it again. When you reach a stop, its story plays, so you look at the place, not your screen.&lt;/p&gt;

&lt;p&gt;Every story is written by Gemma and voiced by Piper, two open models running on my own machine. Once the tour is built, it works with no signal at all, even in airplane mode.&lt;/p&gt;

&lt;p&gt;A foreign city isn't the only place with stories to find. Your own neighborhood has them too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/6-do1PsBFxE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh82eiy8n7dkyzyuglsnm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh82eiy8n7dkyzyuglsnm.gif" alt="Creating a tour in Walk &amp;amp; Talk" width="320" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My real walk: a 3-stop tour near home, in airplane mode. At the first stop, the story is on screen and GPS accuracy is ±2 m:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foj7ng66bummhg41l468e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foj7ng66bummhg41l468e.png" alt="Walk screen at Campo de beisbol Lomas Altas, airplane mode on, story text and debug info showing ±2 m GPS accuracy" width="594" height="1260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Six minutes and 500 meters later, the summary card. I skipped the third stop on purpose to show what happens: missed stops are listed, and you can still play their stories from the card. The battery went from 78% to 77% between the two screenshots:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffqt353tsvv57luwdwudc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffqt353tsvv57luwdwudc.png" alt="Walk complete card: 2 of 3 stops, 6 minutes, 500 meters, one missed stop with a play button" width="594" height="1260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Martin-EG" rel="noopener noreferrer"&gt;
        Martin-EG
      &lt;/a&gt; / &lt;a href="https://github.com/Martin-EG/Walk-and-Talk-Audio-Guide" rel="noopener noreferrer"&gt;
        Walk-and-Talk-Audio-Guide
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An iOS app that narrates the places around you while you walk, so the phone stays in your pocket. Before the walk, it downloads nearby points of interest and uses open-weight models to write and voice a short story for each one. During the walk, it plays each story when you get close, fully offline.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Martin-EG/Walk-and-Talk-Audio-Guide/docs/walk-n-talk-header.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FMartin-EG%2FWalk-and-Talk-Audio-Guide%2FHEAD%2Fdocs%2Fwalk-n-talk-header.png" alt="Walk &amp;amp; Talk: offline audio walking tours"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Walk &amp;amp; Talk&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An offline audio walking tour: pick a spot, and open models write and voice a short story for each place nearby. Then you lock your phone, walk, and each story plays as you arrive, even in airplane mode.&lt;/p&gt;
&lt;p&gt;Built for the DEV "Touch Grass" challenge. Story text comes from Gemma (via Ollama) and audio from Piper, both running on hardware I control. No paid AI APIs, no user accounts.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Martin-EG/Walk-and-Talk-Audio-Guide/docs/walk-n-talk-create-tour.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FMartin-EG%2FWalk-and-Talk-Audio-Guide%2FHEAD%2Fdocs%2Fwalk-n-talk-create-tour.gif" alt="Creating a tour in the Walk &amp;amp; Talk app"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Martin-EG/Walk-and-Talk-Audio-Guide/docs/architecture.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FMartin-EG%2FWalk-and-Talk-Audio-Guide%2FHEAD%2Fdocs%2Farchitecture.png" alt="Architecture: OpenStreetMap and Wikipedia feed Gemma and Piper, which build a tour pack the iPhone plays offline by GPS"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick a spot&lt;/strong&gt;: drop a pin or search an address, choose a radius (200 m–2 km) and 3–12 stops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt;: the pipeline finds named places (landmarks, museums, churches, theatres, parks, sports grounds and plazas, with malls only as filler when an area is short of places), ranks them into a loop, has Gemma write a story from those facts only, and has Piper record it. Each story is written to stand on its…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Martin-EG/Walk-and-Talk-Audio-Guide" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5y95g4r5i42uej0cc8xv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5y95g4r5i42uej0cc8xv.png" alt="Architecture: OpenStreetMap and Wikipedia feed a ranker, Gemma writes, Piper voices, the tour pack goes to the iPhone, which triggers stories by GPS offline" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pipeline&lt;/strong&gt; is five Python files, one per step in the diagram. The result is a "tour pack": a &lt;code&gt;tour.json&lt;/code&gt; with each stop's name, coordinates, story and sources, plus one audio file per stop. Every network, model and voice call is cached, so a rebuild only redoes what changed. My demo route built in 45.7 seconds on my Mac, and 20.7 seconds on a rebuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stories&lt;/strong&gt; follow one rule: only say what the sources say. After Gemma writes a story, code checks it. Is it in the word range? Does it contain a number the facts don't? A failed story goes back to Gemma with the reason. Each story lands in a &lt;code&gt;review.md&lt;/code&gt; beside its facts, unknown names flagged.&lt;/p&gt;

&lt;p&gt;That check is why I chose &lt;code&gt;gemma3:4b&lt;/code&gt;. On the same 10 stops, &lt;code&gt;gemma3:1b&lt;/code&gt; was three times faster but praised "a unique architectural style that remains remarkably intact" with no source behind it. &lt;code&gt;gemma3:4b&lt;/code&gt; was the smallest model with zero stories still failing a check. For stops with only map tags, the Mac pipeline switches to &lt;code&gt;gemma3:12b&lt;/code&gt;, which follows "don't invent" more reliably.&lt;/p&gt;

&lt;p&gt;A stop with a Wikipedia article behind it, a 23-meter concrete monument to Chinese immigration:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Look up at the monument. In front of you stands El cocinero chino. This sculpture, created by Óscar Ortega, celebrates the immigration of Chinese people to Mexicali. […] The sculpture cost approximately 10 million pesos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A park with nothing but a name and a map tag:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Look around you at Parque Mágica. You are standing in a park. Take a look at the space before you. It is a place for leisure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second is plain on purpose. Short beats invented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The app&lt;/strong&gt; is SwiftUI. A small proximity engine decides when a stop fires: anywhere inside the place's outline from OpenStreetMap, or within 35 meters of it (or of its pin, for places with no outline), two GPS fixes in a row, accuracy of 25 meters or better, once per walk. Background audio and location modes keep it working with the screen off. The engine is a plain struct with no GPS dependency, so unit tests feed it made-up fixes. All 24 tests pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tour server&lt;/strong&gt; came later, so the app could build a tour anywhere. It's a FastAPI wrapper around the same pipeline, on Railway, with Ollama on a private network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;For this project, "open" meant four concrete things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works with no signal.&lt;/strong&gt; Once the tour pack is on the phone, the walk needs no network. I recorded the demo walk in airplane mode. A tour that streams its narration fails on a weak connection, abroad without data, or at the edge of coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's free to run.&lt;/strong&gt; My Mac builds tours with models I downloaded once. No per-request bill, no API key, no quota. A walk costs nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your walking location stays on the phone.&lt;/strong&gt; During a walk, GPS is matched against the stops on the device and nothing is sent. Building a tour sends one start point, to my Mac or to my server (which deletes packs after 24 hours), and the pipeline asks OpenStreetMap and Wikipedia about that area. One point, once. A cloud tour app typically needs your position the whole time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model and the voice are swappable.&lt;/strong&gt; Each is one line in &lt;code&gt;config.py&lt;/code&gt;. I compared three Gemma sizes in an afternoon with a benchmark script and picked by measurement, not price. When a better open model ships, I pull it and rebuild.&lt;/p&gt;

&lt;p&gt;Closed services make sense for many apps. But a walking tour is small, fixed content tied to one place. It doesn't need a data center while you walk past it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I used Claude Code as a coding partner, not as a writer of the tour. Story text and audio come only from Gemma and Piper. In the final session it fact-checked this post against the repo, catching an out-of-date test count in my README and that the bundled tours predated my latest story-rule fix. It also drew the architecture diagram from the pipeline code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 3 writes every story, locally through Ollama. I chose model sizes by measuring how well they stick to the facts on real stops, and built checks so Gemma says only what the sources say.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits and licenses
&lt;/h2&gt;

&lt;p&gt;Place data © OpenStreetMap contributors (ODbL). Facts from Wikipedia (CC BY-SA 4.0). Stories by Gemma 3 (Gemma Terms of Use). Voice by Piper &lt;code&gt;en_US-lessac-medium&lt;/code&gt;. Full table in the repo README.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ios</category>
      <category>gemma</category>
    </item>
  </channel>
</rss>
