Mountaineering Acoustics Network

Mountaineering Acoustics at the Summit of Discovery

Running field-audio-tools on a long dual-mic F3 take

Yema Haizi, Kangding, Sichuan

written by Gewenxin Yu on 2026-08-07, last updated 2026-08-22

Background

Overview

We ran all three commands on Take 002, a three-hour Zoom F3 recording, and the notes below cover the input, the files written, and two gaps we found in lowdom reporting and threshold calibration.

Field details

The GPX trail to the recording site begins on highway S434 at Yagya Ge, Sichuan, at roughly 3,894 m elevation, with roadside access on the pass before the walk in. It ends at the dome tent at Yema Haizi, about 4,055 m, with Yema Haizi lake to the east of that camp. We were guided by Dong Sheng & Xiao Zhang (local mountain guides in Kangding) and made most of the recordings the next morning. Our electronic field gear is still heavy, so this trip we reached the camp and recording site partly on foot and partly on horseback.

Every recording in this report was made at a specific position on Yema Haizi lake itself. It was a good season for it, with the lake frozen over. On the northeast side, the ice thinned toward the deeper water shown in Fig. 2 and along the shelf leading into the area of Fig. 3; that is, to the right of where I stood in Fig. 4, where thinning ice and open water were clearly visible. We treated that edge with caution when passing through, but other positions on the lake were safe for extended recording.

Melting ice produced special sounds in that season, the locals call the phenomenon long hou (“dragon roar”). On the multimedia report, you can hear it throughout the whole recording.

After processing our recordings with lowdom, we identified desired fragments that could be handed on to birdidpv, which would run BirdNET on those ranges. The returned species list included instances where dragon roars were misclassified as avian calls. The identification report generates a spectrogram for each detected frame. What is even more interesting is that in the case of the frame at 01:41:05, BirdNET identified a waterbird, whereas the actual source was a human voice (Xiao Zhang) calling from across the lake. Confirmation required auditory inspection.

In future developments of the toolkit, we wish to develop a feature to automatically detect and exclude human speech from our recording segments (which are intended for sharing on bioacoustics platforms). This is useful for guided excursions in outdoor areas. While casual chats during recordings might have some anthropological or ethnographic value, we still need to remove them in post-processing if our goal is to isolate the soundscape or capture a dynamic, moving soundscape during expeditions.1

Field recording setups are varied. For the audio file used in this article, the specific setup is introduced under the Input section.

field-audio-tools

Current version of field-audio-tools is designed for recordings from this specific outdoor environment. Bare HTML comes from the CLI, and the demo packages linked here add site navigation and shared media styling.


  1. This intention is expected to persist in future MAN network research.

Input

Both commands used the same pair of synchronized mono WAV exports from Take 002, and they read the files in track order. Site access, camp, and on-lake conditions are under Field details above.

  • Files: 260115_002_Tr1.WAV and 260115_002_Tr2.WAV
  • Recordist: Gewenxin Yu
  • Microphones: two Primo EM273 omni-directional microphones, −37 dB ± 3 dB at 1 kHz sensitivity, 80 dB S/N ratio, 60 Hz ~ 20 kHz frequency range
  • Recorder: Zoom F3, firmware 1.10 metadata
  • Encoding: 48 kHz, mono, 32-bit floating-point PCM per track
  • Duration: 03:02:24 per track
  • Input size: 2,101,379,072 bytes per track

soundcite

We cut a 20-second passage beginning one hour into the take.

soundcite 260115_002_Tr1.WAV 260115_002_Tr2.WAV \
  --start 01:00:00 \
  --duration 20 \
  --title "Take 002 - 01:00:00 excerpt" \
  --recordist "Gewenxin Yu" \
  --recorded-at "2026-01-15T13:19:25+08:00" \
  --location "Yema Haizi, Kangding, Sichuan" \
  --license "CC BY-NC-SA 4.0" \
  --notes "Recorded with two Primo EM273 omni-directional microphones (−37 dB ± 3 dB at 1 kHz, 80 dB S/N ratio, 60 Hz ~ 20 kHz) connected to a Zoom F3." \
  --output 260115-002-soundcite
  • Runtime: about 2.2 seconds
  • Selected range: 01:00:00.000–01:00:20.000
  • Exact sample range: 172,800,000–173,760,000 at 48 kHz
  • Track excerpts: two 32-bit float WAV files, 3,840,206 bytes each
  • Preview: stereo Ogg Opus at 192 kbit/s, peak-limited at 0.95. The manifest records the limiter, so nobody has to guess why the preview is quieter than the excerpts
  • Other files: lossless-source spectrogram, manifest, SHA256SUMS, and static HTML

Two-channel logarithmic spectrogram generated by soundcite

Browser preview and two-channel logarithmic spectrogram generated in the same run. The preview is convenient but lossy, and the spectrogram is generated from the two WAV excerpts, which preserve floating-point samples.

We treat the two mono audio files as a pair here. Before any information extraction, the tool first verifies their sample rate, duration, channel count, recording time, and BWF time reference.

There is more information in the original recording files, including scene, take, date, recording time, track name, and coding history. These fields are then copied into the manifest.

lowdom

lowdom decoded both tracks to mono at 4 kHz, divided them into 10-second windows:

lowdom 260115_002_Tr1.WAV 260115_002_Tr2.WAV \
  --window 10 \
  --threshold 0.95 \
  --report both \
  --output 260115-002-lowdom
  • Runtime: about 67 seconds
  • Analysed duration: 03:02:20
  • Windows: 1,094 ten-second rows
  • Default threshold: 0.95
  • Rows above threshold: 833 (76.14%)
  • Rows below threshold: 261 (23.86%)

In an effort to gain more confidence in the threshold, we ran two blinded listening rounds using a cutoff of 0.95. In each round, ten windows above the threshold and ten below it were selected at random. Of the 20 windows scoring above 0.95, 19 were judged to exhibit obvious wind noise, and of the 20 scoring below it, 17 were judged not to exhibit obvious wind noise.

The threshold and the human listening judgement agreed on 36 of the 40 samples, and we therefore provisionally adopted this value. It should be acknowledged that this threshold is not a universal one, consistent with common sense, given that the sample was small and derived from a single recording setup.

birdidpv

lowdom produces a list of time ranges where wind is low enough for further work, so birdidpv runs BirdNET on those ranges. The candidate-clean-intervals.csv file supplies the timestamps, and we do not copy audio out of the source files. The model then hears only the 23.86% of the take that screening left unflagged.

We are not treating the windows at or above 0.95 as empty, because plenty of birds call through wind and the orange stretches of the timeline hold some of them. Try the orange bars next to a green one first, because they often contain calls. This run finds which species turn up where wind is low, and collects those seconds as recordings clean enough to send to a free archive like xeno-canto.

birdidpv 260115_002_Tr1.WAV \
  --intervals 260115-002-lowdom/candidate-clean-intervals.csv \
  --lat 29.898 --lon 102.030 --week 3 \
  --min-conf 0.25 \
  --photos \
  --spectrograms \
  --report both \
  --output 260115-002-birdidpv
  • Track analysed: 260115_002_Tr1.WAV only
  • Ranges: the 135 below-threshold intervals, 00:43:30 of the 03:02:24 take
  • Frame length: 3 seconds, fixed by the model
  • Minimum confidence: 0.25
  • Species filter: 29.898°N, 102.030°E, week 3 of 48
  • Runtime: about two minutes of analysis, plus 19 seconds for 126 spectrograms and about 25 seconds for 11 reference photographs
  • Detections: 128 frames across 11 species

Position filter

We use coordinate data from the end of the GPX trace, at the camp on Yema Haizi. BirdNET uses these to restrict its global list of 6,522 species to the 788 that could occur there in mid-January. Without the filter, the model still returns species from other regions at similarly high confidence. Even the filtered list still contains species absent from the site.

Detections at a glance

The 128 frames above bear out the limit of the position filter. Most of the eleven species labels still need scrutiny. Ninety-nine are corvids and verified against the audio, Red-billed Chough (82, 0.9998) and Large-billed Crow (17, 0.9118). Their harmonics extend above 2 kHz, and each outlevels the rest by 3–11 dB.

The remaining twenty-nine frames carry nine deep-voiced waterbird labels, including Great Bittern, Ruddy Shelduck, Eurasian Coot, Graylag Goose, Eurasian Curlew, Eurasian Wigeon, Mallard, Common Shelduck, and Gray Heron. The lake was frozen during recording, so these should be treated as false positives tied to the melting-ice bed described under Field details.

The worst offender is Great Bittern, with 12 detections, peak 0.9064, and eight within 70 seconds. None of the spectrograms show a call band above that LF bed. BirdNET assigns booming waterbirds because the ice boom (long hou) matches that acoustic template.

Compare the two by ear. The first page of xeno-canto for Botaurus stellaris has XC891071, XC1000766, XC832807 and XC741523, and the booms sound similar to the dragon roar, which helps explain the misidentifications. The ice has a ringing, electronic quality that the bird does not, and that is what tells them apart by ear. None of the spectrogram measurements we tried put a number on it.

False positive at 01:41:05

At 01:41:05 BirdNET returns Ruddy Shelduck (0.928) and this is the second-highest score in the run. The actual situation at 01:41:05 was that Xiao Zhang called across Yema Haizi lake to the recordist. For this frame, we can only confirm this by listening to the original recording.

Single-track limits

This birdidpv run read Tr1 only. lowdom had already screened both tracks and kept the higher score per window, so a call clearer on the second microphone may be missed. The run reports no stereo placement or direction. Both-track input with the highest confidence per frame is supported and planned for the next run.

birdidpv output

  • detections.csv has every 3-second frame above the minimum confidence, with its timecodes, species, and score. species.csv totals them by species.
  • summary.json records the source, the ranges analysed, the position and week used to filter, and every other setting of the run.
  • detection-spectrograms/ holds 126 WebP images, one per detected frame.1 FFmpeg made them from the source WAV, not from the lossy preview. Each one is a single call, here the Red-billed Chough frame at 00:40:35:
ffmpeg -ss 2435 -t 3 -i 260115_002_Tr1.WAV \
  -lavfi "[0:a:0]showspectrumpic=s=560x260:legend=1:scale=log:fscale=log:color=intensity" \
  -frames:v 1 frame-002435000.webp

fscale=log sets the frequency scale on the spectrogram. On a linear frequency axis the whole band below 500 Hz collapses into a line at the bottom of the image, and that band is where the ice sits and where most of these detections are argued about. scale=log does the same for amplitude, and legend=1 prints the frequency, time and dBFS axes.2

  • species-photos/ holds one reference photograph per species from iNaturalist, kept in the package instead of hot-linked. credits.json records each photographer, licence, and source, and nine of these eleven rows are flagged for manual review.
  • The multimedia report reuses lowdom's recording-preview-48k/ segments instead of copying 62 MB of audio, so click a detection to play its three seconds and see its spectrogram, or click a species to show only that species on the timeline.
  • As with lowdom, the site reports add navigation and styling, and the result pages the CLI writes are kept next to them as report-bare.html and report-multimedia-bare.html.

soundcite: citing a detection

The excerpt at the top of this test starts at 01:00:00. We chose that time from the clock before we had looked at the recording, so that excerpt illustrates the output format, not the content of the take.

After birdidpv, a more suitable excerpt is available, so sort detections.csv by time and the longest unbroken run in the take starts at 00:40:29: seven frames back to back, all Pyrrhocorax pyrrhocorax, scoring 0.9863 to 0.9998. The single highest frame in the whole take sits inside it, at 00:40:35, and a run is stronger evidence than one frame, so cut from the start of the run rather than from its best frame. detections.csv stores that time as start_timecode in HH:MM:SS.mmm, which is one of the formats --start accepts, so the value can be copied straight across:

soundcite 260115_002_Tr1.WAV 260115_002_Tr2.WAV \
  --start 00:40:29.000 \
  --duration 21 \
  --pad-start 3 \
  --pad-end 4 \
  --title "Take 002 - Red-billed Chough at 00:40:29" \
  --recordist "Gewenxin Yu" \
  --recorded-at "2026-01-15T12:59:54+08:00" \
  --location "Yema Haizi, Kangding, Sichuan" \
  --license "CC BY-NC-SA 4.0" \
  --notes "Seven consecutive BirdNET frames identified Pyrrhocorax pyrrhocorax here, scoring 0.9863 to 0.9998. Recorded with two Primo EM273 omni-directional microphones (-37 dB +/- 3 dB at 1 kHz, 80 dB S/N ratio, 60 Hz ~ 20 kHz) connected to a Zoom F3." \
  --output 260115-002-chough-004029

--duration 21 covers the seven frames. The two --pad values keep three seconds before them and four after, because 00:40:29 is a frame boundary, not the moment the bird began. BirdNET assigns each detection to a three-second frame, so the call may start anywhere inside those three seconds, and cutting exactly on the line can clip the first call.

The written excerpt therefore runs 00:40:26 to 00:40:54, starting at sample

  1. manifest.json keeps the two ranges apart: the top level describes the 28 seconds in the WAV because that is what the checksums cover, and clip.cited records the 21 seconds being cited. The excerpt is lossless and links back to both source tracks.

21 cited seconds, plus three before and four after.

Set --duration to cover the last frame you want, then use --pad for listening room around it.

References

  1. Kahl, S., Wood, C. M., Eibl, M., & Klinck, H. (2021). BirdNET: A deep learning solution for avian diversity monitoring. Ecological Informatics, 61, 101236.

  2. xeno-canto. Four Eurasian Bittern (Botaurus stellaris) recordings, used for the listening comparison in What came back: XC891071 (Christian Bøggild, Denmark), XC1000766 (Christian Bøggild, Denmark), XC832807 (Cedric Mroczko, Ukraine), XC741523 (Romuald Mikusek, Poland).

  3. iNaturalist. Eleven reference photographs, one per detected species, by Pavel Shukov, egorbirder, Joe Bourget, Tatyana Zarubo, Анна Голубева, Frans Vandewalle, Wei Li Jiang, zametnya, one anonymous, thegreatdodo and Frank Sengpiel. Licences and source URLs are in species-photos/credits.json.

  4. Wikidata. Taxon identifiers for the eleven species, matched on iNaturalist taxon ID and resolved to Avibase, eBird, GBIF, ITIS, IUCN, EOL and iNaturalist.


  1. Frames that start at the same time share an image, so 128 detections need only 126 files.

  2. The spectrogram itself is specified at 560×260 pixels (s = 560×260), and the legend adds roughly 280×130 pixels around it, giving a final file size of 844×388. We generated the spectrograms for the four xeno-canto recordings cited above with the same set of parameters.