{
const width = 560;
const height = 520;
const cx = width / 2;
const cy = height / 2;
const R = 185; // orbit radius
const r = 72; // node circle radius
const crimson = "#0b1d12";
const light = "#2d948a";
const nodes = [
{
label: "Improved\nambient\nclassification",
detail: "Distinguish natural sounds (birdsong, rain) from low-level anthropogenic background noise."
},
{
label: "Expanded\ntraining\ndataset",
detail: "Collect more labeled samples per category to improve model robustness, especially for 'impacts'."
},
{
label: "Connectivity\nfor continuous\nmonitoring",
detail: "Add WiFi or 4G transmission so data can be accessed remotely without physical retrieval."
},
{
label: "Cloud\nstorage\nsystem",
detail: "Centralize data from multiple devices in a shared platform for city-wide analysis."
},
{
label: "Detailed\nacoustic\nindicators",
detail: "Generate richer per-source indicators (Ld, Ln, Lden) beyond the current LAeq classification."
},
{
label: "Land use\nsimulations &\nreclassification",
detail: "Use classified data to model noise impact under different zoning scenarios and normative frameworks."
}
];
// Positions: start top-center, clockwise
const angles = nodes.map((_, i) => -Math.PI / 2 + (2 * Math.PI / nodes.length) * i);
const svg = d3.create("svg")
.attr("viewBox", `0 0 ${width} ${height}`)
.attr("width", "60%")
.style("font-family", "Arial, sans-serif");
// Defs: drop shadow
const defs = svg.append("defs");
const filter = defs.append("filter").attr("id", "shadow").attr("x", "-20%").attr("y", "-20%").attr("width", "140%").attr("height", "140%");
filter.append("feDropShadow").attr("dx", 0).attr("dy", 3).attr("stdDeviation", 4).attr("flood-color", "rgba(0,0,0,0.18)");
// Arrow markers between nodes (curved, using quadratic bezier)
const arrowId = (i) => `arrow-${i}`;
nodes.forEach((_, i) => {
defs.append("marker")
.attr("id", arrowId(i))
.attr("markerWidth", 8)
.attr("markerHeight", 8)
.attr("refX", 6)
.attr("refY", 3)
.attr("orient", "auto")
.append("path")
.attr("d", "M0,0 L0,6 L8,3 Z")
.attr("fill", "#2d948a")
.attr("opacity", 0.7);
});
// Draw curved arrows between consecutive nodes
nodes.forEach((_, i) => {
const j = (i + 1) % nodes.length;
const ax = cx + R * Math.cos(angles[i]);
const ay = cy + R * Math.sin(angles[i]);
const bx = cx + R * Math.cos(angles[j]);
const by = cy + R * Math.sin(angles[j]);
// Midpoint pulled slightly outward for a gentle arc
const midAngle = (angles[i] + angles[j]) / 2;
const pull = R + 28;
const mx = cx + pull * Math.cos(midAngle);
const my = cy + pull * Math.sin(midAngle);
// Shorten endpoints to stop at circle edge
const shorten = (px, py, tx, ty, s) => {
const dx = tx - px, dy = ty - py;
const d = Math.sqrt(dx*dx + dy*dy);
return [px + dx/d * s, py + dy/d * s];
};
const [sx, sy] = shorten(ax, ay, mx, my, r + 4);
const [ex, ey] = shorten(bx, by, mx, my, r + 14);
svg.append("path")
.attr("d", `M${sx},${sy} Q${mx},${my} ${ex},${ey}`)
.attr("fill", "none")
.attr("stroke", "#2d948a")
.attr("stroke-width", 2.5)
.attr("opacity", 0.65)
.attr("marker-end", `url(#${arrowId(i)})`);
});
// Tooltip div
const tooltip = d3.select("body").selectAll(".ojs-tooltip").data([0]).join("div")
.classed("ojs-tooltip", true)
.style("position", "fixed")
.style("background", "#fff")
.style("border", `1.5px solid ${crimson}`)
.style("border-radius", "8px")
.style("padding", "10px 14px")
.style("font-size", "13px")
.style("color", "#333")
.style("max-width", "220px")
.style("box-shadow", "0 4px 12px rgba(0,0,0,0.15)")
.style("pointer-events", "none")
.style("opacity", 0)
.style("transition", "opacity 0.15s");
// Nodes
nodes.forEach((node, i) => {
const nx = cx + R * Math.cos(angles[i]);
const ny = cy + R * Math.sin(angles[i]);
const g = svg.append("g")
.style("cursor", "pointer")
.on("mouseover", function(event) {
d3.select(this).select("circle").attr("r", r + 5).attr("fill", "#2d948a");
tooltip
.style("opacity", 1)
.html(`<strong>${node.label.replace(/\n/g, " ")}</strong><br/><span style="color:#555">${node.detail}</span>`);
})
.on("mousemove", function(event) {
tooltip
.style("left", (event.clientX + 14) + "px")
.style("top", (event.clientY - 10) + "px");
})
.on("mouseout", function() {
d3.select(this).select("circle").attr("r", r).attr("fill", crimson);
tooltip.style("opacity", 0);
});
g.append("circle")
.attr("cx", nx).attr("cy", ny).attr("r", r)
.attr("fill", crimson)
.attr("filter", "url(#shadow)");
// Wrap label lines
const lines = node.label.split("\n");
const lineH = 15;
const offsetY = -(lines.length - 1) * lineH / 2;
lines.forEach((line, li) => {
g.append("text")
.attr("x", nx).attr("y", ny + offsetY + li * lineH)
.attr("text-anchor", "middle")
.attr("dominant-baseline", "middle")
.attr("fill", "white")
.attr("font-size", "11.5px")
.attr("font-weight", "600")
.text(line);
});
// Step number badge
g.append("circle")
.attr("cx", nx + r * 0.65).attr("cy", ny - r * 0.65)
.attr("r", 12).attr("fill", "white").attr("stroke", crimson).attr("stroke-width", 1.5);
g.append("text")
.attr("x", nx + r * 0.65).attr("y", ny - r * 0.65)
.attr("text-anchor", "middle").attr("dominant-baseline", "middle")
.attr("fill", crimson).attr("font-size", "11px").attr("font-weight", "bold")
.text(i + 1);
});
// Center label
svg.append("text")
.attr("x", cx).attr("y", cy - 12)
.attr("text-anchor", "middle").attr("fill", "#888")
.attr("font-size", "12px")
.text("Future");
svg.append("text")
.attr("x", cx).attr("y", cy + 8)
.attr("text-anchor", "middle").attr("fill", "#888")
.attr("font-size", "12px")
.text("Work");
return svg.node();
}
Note
If you want to explore the full study, you can read the article “Intelligent Classification of Urban Noise Sources Using TinyML: Towards Efficient Noise Management in Smart Cities.”
The noise we don’t see but do feel
Bogotá never stops sounding. The rumble of bus traffic, the roar of aircraft descending into El Dorado, motorcycles accelerating at traffic lights, car alarms, and the constant hum of millions of people sharing the same space — all of this makes up what experts call the urban acoustic environment.
What many people don’t realize is that this noise has direct health consequences. According to the World Health Organization, noise pollution is the second most significant environmental risk factor for health in Europe, surpassed only by air pollution. In cities like Bogotá, the situation is not very different.
Note
Key fact: 80% of urban noise in Bogotá originates from road traffic. Yet until now it was impossible to know in real time which source — a truck, a motorcycle, an aircraft — was driving the highest peaks at any given moment of the day.
Bogotá operates approximately 32 acoustic monitoring stations distributed across the city, managed by the Secretaría Distrital de Ambiente (SDA). These stations measure noise levels in decibels with high precision — but they cannot answer a fundamental question: where is that noise coming from?
Knowing that a corner registers 75 dB(A) is useful. Knowing that the level is being driven by the constant passage of heavy vehicles — and not, say, construction work — is entirely different information, and far more valuable for evidence-based policymaking.
That was the question that motivated this research project.
The idea: Teaching a small device to recognize sounds
The research team proposed an innovative solution: develop a low-cost, low-power embedded system capable of listening to the environment in real time, automatically classifying the type of sound it detects, and generating data that complement the information from traditional monitoring stations.
The key technology is TinyML (Tiny Machine Learning) — a branch of artificial intelligence that makes it possible to run machine learning models directly on small devices, such as microcontrollers or single-board computers, without requiring internet connectivity or cloud servers. In other words, it is AI that fits in the palm of your hand.
To understand why this matters: instead of recording audio all day, sending it to a remote server, and waiting for an analysis, the device does all the processing on-site, second by second, without interruption. That makes it cheaper, faster, more privacy-preserving, and far more scalable.
What sounds can the system recognize?
The system was trained to identify eight categories of urban noise sources, defined based on Bogotá’s main acoustic challenges:
| # | Category | Description |
|---|---|---|
| 1 | Heavy vehicle | Trucks, buses, industrial vehicles |
| 2 | Motorcycles | One of the most numerous and noisy vehicles on urban roads |
| 3 | Aircraft | Airplanes on approach or takeoff |
| 4 | Alarms | Car horns, vehicle alarms, sirens |
| 5 | Impacts | Door slams, speed bumps, short high-energy events |
| 6 | Humans | Voices, music, anthropogenic activities |
| 7 | Applause | Crowd noise at public events |
| 8 | Ambient | Natural sounds without anthropogenic sources (rain, wind, birds) |
The hardware: A solar-powered autonomous station
One of the most important challenges was ensuring the device could operate continuously, 24 hours a day, at an outdoor urban location, without relying on a fixed power outlet.
The solution was to design an autonomous solar energy system. The device integrates:
- A 90 W solar panel (PS 90 model) with a maximum current of 4.33 A at 18.625 V
- A 40-ampere PWM solar charge controller that optimizes battery charge and discharge, with overload protection and a 2.5 A USB output
- A 12-volt battery as energy storage
- A Raspberry Pi 4 as the processing brain, with up to 8 GB RAM and large-capacity microSD support
- A calibrated recording microphone with weatherproof protection
- A 64 GB USB drive for local audio storage
The system records audio in approximately 59-second segments, processes them in parallel, and classifies each second of audio automatically. Uncompressed audio occupies around 5.44 MB per minute, meaning that seven days of continuous operation requires approximately 55 GB of storage — hence the 64 GB USB drive.
Note
Energy note: The device’s maximum current draw is 2.5 A through the charge controller’s USB output, making it compatible with solar generation even on Bogotá’s characteristically cloudy days.
The model: How it learns to recognize sounds
The heart of the system is a neural network model called YAMNet, originally developed by Google. YAMNet is a deep neural network trained to recognize more than 500 types of sounds — from dog barks to sirens or applause.
However, simply using YAMNet as-is was not enough: it had to be retrained with audio recorded specifically in Bogotá’s acoustic environment. A motorcycle in Bogotá’s streets can sound quite different from one in another country, and the model needed to learn those local characteristics.
The data collection process was carefully designed. The researchers developed a recording system where the operator presses a different key for each noise source occurring at that moment (for example, m for motorcycles, a for alarms, p for heavy vehicle). This produced a labeled audio dataset of 657 files, distributed as follows:
- Ambient: 126 files — the most frequent category
- Heavy vehicle: 120 files
- Motorcycles: 112 files
- Aircraft: 109 files
- Humans: 59 files
- Alarms: 52 files
- Applause: 39 files
- Impacts: 40 files
How well does the model perform?
The retrained model’s results are notably strong. When evaluated on data it had never seen, the system achieved precision and recall values between 0.92 and 1.00 for most categories. In plain terms: when the model says it heard a motorcycle, it is almost always right — and it almost never misses a motorcycle when one actually passes.
Note
Hardest category: Impacts achieved a recall of 0.75, meaning the model missed some impact events. This is explained by the transient nature of these sounds — they often last only fractions of a second.
The results: Who makes the most noise, and when?
The system was deployed for one week (May 7–13, 2024) alongside Station No. 13 of the RMRAB network, located at the CAI Álamos in the Engativá locality. This zone is particularly interesting because it combines residential and commercial land uses and sits directly beneath the approach path to El Dorado International Airport.
Over those seven days, the system analyzed more than 602,000 one-second audio samples. The findings are revealing.
The unexpected protagonist: aircraft
Although the heavy vehicle category was by far the most frequent source over time (78% of all classified samples), it does not generate the loudest events. That distinction belongs to aircraft.
Analysis revealed that 87% of classified aircraft events exceeded the limits set by Colombian regulations for industrial zones (Sector C1: 75 dB(A) daytime). Some aircraft overflight events reached peaks of up to 88.4 dB(A) — equivalent to standing next to a lawn mower or inside a mechanical workshop.
Heavy vehicles: omnipresent but moderate
Heavy vehicles accounted for 78.3% of all samples and 50.8% of the loudest events (L10 percentile). However, compared to aircraft, their contribution to peak levels is lower: only 7% of their events exceeded the Sector C1 limit, reaching a maximum of 82.1 dB(A). Their true impact is the sustained acoustic pressure throughout the entire day and night.
Does the city comply with the noise standard?
Colombian regulation (Resolución 0627 de 2006) establishes maximum noise limits based on land use. The CAI Álamos environment corresponds primarily to Sector C1 (industrial use), with a daytime limit of 75 dB(A) and a nighttime limit of 70 dB(A).
The table below shows the percentage of events in each category that fall within different exceedance bands above the Sector C1 threshold, along with the share of events that remain within compliance:
| Category | 0–10 dB(A) over limit (%) |
10–20 dB(A) over limit (%) |
20–30 dB(A) over limit (%) |
Within compliance (%) |
Total events |
|---|---|---|---|---|---|
| Unclassified | 48.1 | 5.3 | 0 | 46.6 | 2,582 |
| Alarms | 34.8 | 3.4 | 0.2 | 61.7 | 2,470 |
| Ambient | 27.8 | 1.3 | 0 | 71.0 | 1,398 |
| Applause | 34.6 | 2.8 | 0 | 62.6 | 107 |
| Aircraft ⚠️ | 62.0 | 24.0 | 0.8 | 13.2 | 15,883 |
| Humans | 34.0 | 0.8 | 0 | 65.2 | 1,233 |
| Impacts | 40.7 | 6.8 | 0.3 | 52.2 | 928 |
| Motorcycles | 34.7 | 1.6 | 0 | 63.7 | 5,425 |
| Heavy vehicle | 32.5 | 1.1 | 0 | 66.4 | 31,040 |
Table 1. Share of samples per category associated with Sector C1 (75 dB(A) daytime). Aircraft stands out with only 13.2% of events within the legal limit.
The results confirm consistent exceedance of permissible limits across both daytime and nighttime hours, throughout every day of the monitoring week. What the project now makes possible is knowing precisely which source is generating those violations — and when.
Why does this matter?
This project represents a meaningful step forward in how cities can manage acoustic pollution. Until now, noise monitoring systems answered the question “how much noise is there?” This system adds the missing dimension: “where is that noise coming from?”
The practical implications are significant:
- Environmental authorities can identify which specific sources generate normative exceedances and design more targeted mitigation strategies.
- Urban planners can correlate the temporal distribution of noise sources with land uses and propose evidence-based regulatory adjustments.
- Communities can access concrete data on the composition of noise in their environment — not just its overall level.
- Scalability: The system can be deployed at multiple points across the city at a significantly lower cost than traditional acoustic monitoring stations.
Note
The retrained model — built on data from Bogotá — can be adapted for other Latin American cities with similar acoustic characteristics, providing the foundation for a low-cost intelligent monitoring network across the region.
What comes Next: toward an urban listening network
The research team identified several priorities for continuing and improving the system. The six key future work lines are shown in the interactive diagram below.
Conclusion: A City that learns to listen to itself
What this project demonstrates is that artificial intelligence, combined with accessible hardware and renewable energy, can become a powerful tool for urban wellbeing. No large servers or costly infrastructure are needed: a solar panel, a wallet-sized computer, and a well-trained algorithm are enough to give city managers information that simply didn’t exist before.
Bogotá is a noisy city. That we already knew. Now, thanks to this project, we can begin to know why, when, and because of what.
And that knowledge is the first step toward changing something.
About the Authors
Brian Amaya Guzmán and Maykol Sneyder Remolina Soto are graduate students in the Master’s Program in Intelligent and Sustainable Cities at Universidad del Rosario (Bogotá, Colombia). This article is based on their thesis, directed by Ing. Jefferson Sarmiento Rojas and Ing. Pedro Antonio Aya Parra.