docs: Ajout de la documentation en Français de l'utilisation de Tadam.py
This commit is contained in:
parent
175b3fdde3
commit
e6dc23c8f7
29
Snakefile
Normal file
29
Snakefile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
"""
|
||||||
|
Tadam!
|
||||||
|
|
||||||
|
Snakemake workflow for Vigie-Chiro audio preprocessing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
|
||||||
|
configfile: "config.yaml"
|
||||||
|
|
||||||
|
PREFIX = config["prefix"]
|
||||||
|
|
||||||
|
rule all:
|
||||||
|
input:
|
||||||
|
"output.zip.{archive_number}"
|
||||||
|
|
||||||
|
rule rename:
|
||||||
|
input:
|
||||||
|
"raw/{filename}.wav
|
||||||
|
output:
|
||||||
|
"raw/{prefix}{filename}.wav"
|
||||||
|
shell:
|
||||||
|
"if [[ {filename} = {PREFIX}* ]]; then echo 'Prefix already present'; else rename 's/^/{PREFIX}/' '{input}'; fi"
|
||||||
|
|
||||||
|
|
||||||
|
# rule time_expansion:
|
||||||
|
# input:
|
||||||
|
# "raw/*.wav"
|
9
config.yaml
Normal file
9
config.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: raw
|
||||||
|
dest: exp
|
||||||
|
prefix: Car910130-2021-Pass1-Z1-AR
|
||||||
|
ratio: 0.1
|
||||||
|
length: 5
|
||||||
|
archive_size: 700
|
||||||
|
archive_name: output
|
||||||
|
...
|
102
docs/fr/TADAM.md
Normal file
102
docs/fr/TADAM.md
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
# Comment utiliser Tadam
|
||||||
|
|
||||||
|
Tadam: un script qui réalise le traitement de l'audio, de la carte SD de votre enregistreur jusqu'au portail de Vigie-Chiro...
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
Tadam est un script python utilisé pour préprocesser un dossier d'enregistrements audio afin de le préparer pour l'envoie sur le portail [Vigie-Chiro](https://www.vigiechiro.herokuapp.com/), en vue d'une analyze des ultrasons par Tadarida.
|
||||||
|
|
||||||
|
## Prérequis
|
||||||
|
|
||||||
|
- Python3 (avec pip)
|
||||||
|
- Wget ou Git (pour récupérér le script)
|
||||||
|
- 7z (pour la compression en zip -- installer p7zip)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Récupérer le script
|
||||||
|
|
||||||
|
Il y a deux manières d'installer Tadam, soit en utilisant Git et en clonant [le dépôt](https://forge.chapril.org/Chiro-Canto/TadaridaTools), soit en récupérant juste le fichier .py, en le téléchargeant depuis le dépôt (méthode recommandée, si vous ne souhaitez pas modifier le code de Tadam).
|
||||||
|
|
||||||
|
Méthode Git:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://forge.chapril.org/Chiro-Canto/TadaridaTools
|
||||||
|
cd TadaridaTools
|
||||||
|
sudo cp ./src/tadam.py /usr/local/bin/tadam.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Méthode Wget:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://forge.chapril.org/Chiro-Canto/TadaridaTools/raw/branch/master/src/tadam.py
|
||||||
|
sudo cp tadam.py /usr/local/bin/tadam.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Dans les deux cas, il faut autoriser l'execution du script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo chmod +x /usr/local/bin/tadam.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### Récupérer les dépendences Python
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip3 install soundfile
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Maintenant que le script est installé, et est dans le PATH, il est utilisable dans n'importe quel dossier dans le terminal.
|
||||||
|
|
||||||
|
### Avant d'utiliser le script
|
||||||
|
|
||||||
|
Le plus simple est de commencer par créer un dossier concernant votre participation (par example avec un nom de dossier en YYYY-MM-DD, correspondant à la date de la participation, associé au point prospecté).
|
||||||
|
|
||||||
|
Ensuite, il faut crééer deux sous dossier, l'un pour les fichiers wav bruts, l'autre pour les fichiers wav en temps expansé.
|
||||||
|
|
||||||
|
Le nom de ces dossiers n'a pas d'importance, à conditions que vous adaptez correctement la ligne de commande Tadam après.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir {raw,exp}
|
||||||
|
```
|
||||||
|
|
||||||
|
Il faut dès lors copier les fichiers concernant la participation depuis la carte SD vers le dossier raw.
|
||||||
|
|
||||||
|
Sous Linux, cela peut être fait en interface graphique, ou par exemple avec rsync:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rsync -avz --progress /chemin/dossier/carte/sd/ /chemin/dossier/raw/
|
||||||
|
```
|
||||||
|
|
||||||
|
Notez les `/` à la fin des chemins, pour copier le contenu du dossier, et non le dossier lui-même, quand vous utilisez rsync.
|
||||||
|
|
||||||
|
### Utilisation du script
|
||||||
|
|
||||||
|
Ouvrir, si ce n'est pas déjà fait, le terminal, dans le dossier contenant les dossiers raw et exp.
|
||||||
|
|
||||||
|
Tadam vient avec une aide succinte intégrée, qui détaille un peu les options disponibles; pour la voir, tapez:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tadam.py --help
|
||||||
|
```
|
||||||
|
|
||||||
|
Dans une utilisation standard, il faut taper:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tadam.py -v -i raw -o exp -l 5 -z -p "Car910130-2021-Pass1-Z1-AudioMoth_" -r 0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
Détaillons un peu ce que fait cette commande.
|
||||||
|
|
||||||
|
- `-v` : active le mode verbeux, qui affiche des informations sur la progression du traitement.
|
||||||
|
- `-i` : indique le dossier contenant les fichiers wav bruts.
|
||||||
|
- `-o` : indique le dossier où seront stockés les fichiers wav en temps expansé.
|
||||||
|
- `-l` : indique la durée maximale des wav en sorties (les fichiers qui ferait plus que le nombre de secondes spécifié sont découpés en plusieurs fichiers)
|
||||||
|
- '-z': indique au script de compresser les fichiers wav en sorties, en utilisant 7z une taille de 700Mo comme préconisé par Vigie-Chiro, si l'on souhaite accélérer l'upload.
|
||||||
|
- `-p` : indique le préfixe des fichiers wav en sorties. Il doivent être conforment à ce qui est prévu par Vigie-Chiro, se référer au tuto renommage.
|
||||||
|
|
||||||
|
Enfin et surtout:
|
||||||
|
- '-r': indique le ratio de conversion de la fréquence d'échantillonage (*sample rate*) des fichiers wav en sorties. 0.1 correspond a une expansion x10. Il faut faire attention au type d'enregistreur utilisé, et se référer aux tutos Vigie-Chiro pour choisir la bonne valeur.
|
||||||
|
|
45
src/separate_tadarida_nights.sh
Normal file
45
src/separate_tadarida_nights.sh
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Separate TADARIDA nights into corresponding folders
|
||||||
|
|
||||||
|
# Specify starting and ending hours for fixed point protocol
|
||||||
|
START_TIME="22:00"
|
||||||
|
END_TIME="06:01" # add 1 minute to include exceeding records
|
||||||
|
|
||||||
|
# Specify records source and destination directories
|
||||||
|
SOURCE_DIR="/run/media/ortion/Teensy"
|
||||||
|
DESTINATION_DIR="/run/media/ortion/55E981D167764F75/Documents/nature/media/protocoles/vigie-chiro/pt_fixe/490982/Pass0"
|
||||||
|
|
||||||
|
# Function that separates records of each nights using regex
|
||||||
|
function separate_nights() {
|
||||||
|
START_TIME=$(echo $1 | sed 's/:/ /g')
|
||||||
|
END_TIME=$(echo $2 | sed 's/:/ /g')
|
||||||
|
SOURCE_DIR=$3
|
||||||
|
DESTINATION_DIR=$4
|
||||||
|
# Get list of files in source directory
|
||||||
|
FILES=$(ls $SOURCE_DIR/*.wav)
|
||||||
|
current_date=""
|
||||||
|
current_dir=""
|
||||||
|
for FILE in $FILES; do
|
||||||
|
# Get date of record
|
||||||
|
DATE=$(echo $FILE | cut -d'_' -f2)
|
||||||
|
# Get hour of record
|
||||||
|
HOUR=$(echo $FILE | cut -d'_' -f3 | cut -d'.' -f1)
|
||||||
|
# Copy record in proper directory
|
||||||
|
# If time is in night range, copy record in destination directory into the current night directory
|
||||||
|
if [ "$TIME" -ge "$START_TIME" ] && [ "$TIME" -le "$END_TIME" ]; then
|
||||||
|
# If current dir is not yet specified create a directory according to the current date
|
||||||
|
if [ "$current_dir" == "" ]; then
|
||||||
|
current_dir=$(echo $DATE | cut -b 1-4,5-6,7-8 --output-delimiter="-")
|
||||||
|
mkdir -p "$current_dir/raw"
|
||||||
|
echo "New night !"
|
||||||
|
echo "Created directory $current_dir."
|
||||||
|
fi
|
||||||
|
cp "$FILE" "$DESTINATION_DIR/$current_dir/raw/"
|
||||||
|
else
|
||||||
|
current_dir=""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
separate_nights "$START_TIME" "$END_TIME" "$SOURCE_DIR" "$DESTINATION_DIR"
|
39
src/tadam.py
39
src/tadam.py
@ -22,11 +22,9 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import getopt
|
import getopt
|
||||||
import zipfile
|
|
||||||
|
|
||||||
verbose = False
|
verbose = False
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
usage_str = """
|
usage_str = """
|
||||||
|
|
||||||
@ -56,7 +54,7 @@ def usage():
|
|||||||
-r (--ratio) - Specify samplerate convertion rate
|
-r (--ratio) - Specify samplerate convertion rate
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
tadam -v -i raw -o exp -l 5 -z -p "Car910130-2021-Pass1-Z1-AudioMoth_" -r 0.1
|
tadam.py -v -i raw -o exp -l 5 -z -p "Car910130-2021-Pass1-Z1-AudioMoth_" -r 0.1
|
||||||
"""
|
"""
|
||||||
print(usage_str)
|
print(usage_str)
|
||||||
|
|
||||||
@ -64,8 +62,10 @@ def usage():
|
|||||||
def rate(infile, outfile, rate_ratio):
|
def rate(infile, outfile, rate_ratio):
|
||||||
data, samplerate = sf.read(infile)
|
data, samplerate = sf.read(infile)
|
||||||
new_samplerate = int(samplerate * rate_ratio)
|
new_samplerate = int(samplerate * rate_ratio)
|
||||||
sf.write(outfile, data, new_samplerate)
|
try:
|
||||||
|
sf.write(outfile, data, new_samplerate)
|
||||||
|
except:
|
||||||
|
print(f"ERROR while converting sample rate {infile} to {outfile}")
|
||||||
|
|
||||||
def convert_folder(infolder, outfolder, rate_ratio, prefix):
|
def convert_folder(infolder, outfolder, rate_ratio, prefix):
|
||||||
try:
|
try:
|
||||||
@ -94,18 +94,25 @@ def chunk(outfolder, length):
|
|||||||
extension = infile.split(".")[-1]
|
extension = infile.split(".")[-1]
|
||||||
if not extension in ["wav", "WAV"]:
|
if not extension in ["wav", "WAV"]:
|
||||||
continue
|
continue
|
||||||
data, samplerate = sf.read(infile)
|
try:
|
||||||
if verbose:
|
data, samplerate = sf.read(infile)
|
||||||
print(f"\t Splitting {infile} in {length}s-long chunks.")
|
except:
|
||||||
sections = int(np.ceil(len(data) / samplerate / length))
|
print("ERROR: cannot read file " + infile + " for chunking.")
|
||||||
for i in range(sections):
|
else:
|
||||||
if verbose:
|
if verbose:
|
||||||
print(
|
print(f"\t Splitting {infile} in {length}s-long chunks.")
|
||||||
f"\t {str(i).zfill(len(str(sections)))}/{sections} \t {infile}")
|
sections = int(np.ceil(len(data) / samplerate / length))
|
||||||
filename = infile.replace('.wav', f'_{str(i).zfill(3)}.wav')
|
for i in range(sections):
|
||||||
temp = data[i*samplerate*length: i *
|
if verbose:
|
||||||
samplerate*length+samplerate*length]
|
print(
|
||||||
sf.write(filename, temp, samplerate)
|
f"\t {str(i).zfill(len(str(sections)))}/{sections} \t {infile}")
|
||||||
|
filename = infile.replace('.wav', f'_{str(i).zfill(3)}.wav')
|
||||||
|
temp = data[i*samplerate*length: i *
|
||||||
|
samplerate*length+samplerate*length]
|
||||||
|
try:
|
||||||
|
sf.write(filename, temp, samplerate)
|
||||||
|
except:
|
||||||
|
print(f"ERROR: cannot write chunk file {filename}.")
|
||||||
os.remove(infile)
|
os.remove(infile)
|
||||||
|
|
||||||
def zip_folder(outfolder):
|
def zip_folder(outfolder):
|
||||||
|
Loading…
Reference in New Issue
Block a user