field-audio-tools on a long dual-mic F3 takeYema Haizi, Kangding, Sichuan
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.
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-toolsCurrent 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.
This intention is expected to persist in future MAN network research.↩
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.
260115_002_Tr1.WAV and 260115_002_Tr2.WAVsoundciteWe 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-soundciteSHA256SUMS, and static HTML
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.
Open the generated packageOpen the bare CLI package page (tool-generated HTML)Read its manifest
lowdomlowdom 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-lowdomIn 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.
Open the multimedia reportOpen the bare CLI multimedia reportOpen the site data reportOpen the bare CLI timeline reportDownload the window dataDownload candidate clean intervalsRead the summary
birdidpvlowdom 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-birdidpv260115_002_Tr1.WAV onlyWe 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.
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.
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.
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 outputdetections.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.webpfscale=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.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.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.Open the multimedia reportOpen the bare CLI multimedia reportOpen the site data reportOpen the bare CLI timeline reportDownload every detectionDownload the species roll-upRead the summary
soundcite: citing a detectionThe 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
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.
Open the bare CLI package page (tool-generated HTML)Read its manifestSee its spectrogram
Kahl, S., Wood, C. M., Eibl, M., & Klinck, H. (2021). BirdNET: A deep learning solution for avian diversity monitoring. Ecological Informatics, 61, 101236.
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).
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.
Wikidata. Taxon identifiers for the eleven species, matched on iNaturalist taxon ID and resolved to Avibase, eBird, GBIF, ITIS, IUCN, EOL and iNaturalist.
Frames that start at the same time share an image, so 128 detections need only 126 files.↩
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.↩