This project is called Noctiluca. A hydrophone is a waterproof microphone you lower into the water. With a few electronic parts and a little code, you can record and listen to underwater life. Here are the parts, the plans and the code to build one.
Simple, affordable parts. The heart of the build is a piezoelectric sensor, which turns vibrations in the water into an electrical signal.
| Part | Role | Note |
|---|---|---|
| Piezoelectric sensor | Pick up sound vibrations in the water | Piezo disc, 20 to 35 mm |
| Shielded cable | Carry the signal without interference | 2 to 5 m, shielded mono |
| Preamplifier | Boost the weak raw signal | Op-amp mic module |
| Epoxy resin | Make the sensor fully waterproof | Solvent-free resin |
| Heat-shrink tubing | Protect and insulate the joints | A few diameters |
| 3.5 mm jack connector | Plug into the recorder | Mono or stereo jack |
| Recorder | Capture and save the sounds | Computer, Raspberry Pi or audio recorder |
| Weight and float | Set the listening depth | Small weight and buoy |
Tip: a preamp module with adjustable gain makes the first tests much easier.
The idea: the waterproof sensor sends its signal to the preamp, which sends it to the recorder. Follow it in order.
Always stay with an adult near the water. Never play loud sounds underwater, and keep your distance from animals: the goal is to listen without disturbing them.
A bit of Python to record the sounds, then turn them into an image (a spectrogram) to see what you captured.
# Record 30 seconds of underwater sound
import sounddevice as sd
from scipy.io.wavfile import write
fs = 44100 # sampling rate
duration = 30 # seconds
print("Recording...")
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait()
write("ocean.wav", fs, audio)
print("Done: ocean.wav created")
# Turn the recording into an image
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
fs, data = wavfile.read("ocean.wav")
if data.ndim > 1:
data = data[:, 0] # keep a single channel
plt.specgram(data, Fs=fs, cmap="ocean")
plt.ylabel("Frequency (Hz)")
plt.xlabel("Time (s)")
plt.title("Sounds captured underwater")
plt.savefig("spectrogram.png", dpi=150)
print("Image saved: spectrogram.png")
A single command, in a terminal, to install the libraries used here:
pip install sounddevice scipy numpy matplotlib
NOCTILUCA is a small free app for Android. Plug the hydrophone into your phone's headphone jack and the phone becomes the recorder from Step 2: watch the sounds live on a scrolling spectrogram, and save uncompressed WAV files you can study on a computer.
Android phone or tablet, Android 7.0 or newer. A 3.5 mm headphone jack (or a USB-C audio adapter) is needed to plug in the hydrophone.
Download NOCTILUCA · Android (.apk)Version 1 · about 7 MB · free. Android only (no iPhone yet).
Because NOCTILUCA is a personal project, it is not on the Play Store. So when you install it, Android will show a warning saying it does not recognise this app. This does not mean there is a problem — it is the standard message for any app installed outside the Play Store. You simply have to confirm the installation: allow installs from your browser, and when Play Protect shows the “unknown app” alert, tap Install anyway (sometimes hidden behind “More details”). Full step-by-step in the user guide.
The project is open. Write to me to share your tests or your advice.
Get in touch