From e6dc23c8f7b89373b7b78b1bd6645c7ce54c6a76 Mon Sep 17 00:00:00 2001 From: Samuel ORTION Date: Tue, 23 Aug 2022 16:49:17 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20Ajout=20de=20la=20documentation=20en=20?= =?UTF-8?q?Fran=C3=A7ais=20de=20l'utilisation=20de=20Tadam.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Snakefile | 29 +++++++++ config.yaml | 9 +++ docs/fr/TADAM.md | 102 ++++++++++++++++++++++++++++++++ src/separate_tadarida_nights.sh | 45 ++++++++++++++ src/tadam.py | 41 +++++++------ 5 files changed, 209 insertions(+), 17 deletions(-) create mode 100644 Snakefile create mode 100644 config.yaml create mode 100644 docs/fr/TADAM.md create mode 100644 src/separate_tadarida_nights.sh diff --git a/Snakefile b/Snakefile new file mode 100644 index 0000000..c1a703e --- /dev/null +++ b/Snakefile @@ -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" \ No newline at end of file diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..1d76439 --- /dev/null +++ b/config.yaml @@ -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 +... diff --git a/docs/fr/TADAM.md b/docs/fr/TADAM.md new file mode 100644 index 0000000..abb85be --- /dev/null +++ b/docs/fr/TADAM.md @@ -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. + diff --git a/src/separate_tadarida_nights.sh b/src/separate_tadarida_nights.sh new file mode 100644 index 0000000..80efc74 --- /dev/null +++ b/src/separate_tadarida_nights.sh @@ -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" \ No newline at end of file diff --git a/src/tadam.py b/src/tadam.py index 09c60e5..3ca2f15 100755 --- a/src/tadam.py +++ b/src/tadam.py @@ -22,11 +22,9 @@ import os import sys import numpy as np import getopt -import zipfile verbose = False - def usage(): usage_str = """ @@ -56,7 +54,7 @@ def usage(): -r (--ratio) - Specify samplerate convertion rate 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) @@ -64,8 +62,10 @@ def usage(): def rate(infile, outfile, rate_ratio): data, samplerate = sf.read(infile) 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): try: @@ -94,18 +94,25 @@ def chunk(outfolder, length): extension = infile.split(".")[-1] if not extension in ["wav", "WAV"]: continue - data, samplerate = sf.read(infile) - if verbose: - print(f"\t Splitting {infile} in {length}s-long chunks.") - sections = int(np.ceil(len(data) / samplerate / length)) - for i in range(sections): + try: + data, samplerate = sf.read(infile) + except: + print("ERROR: cannot read file " + infile + " for chunking.") + else: if verbose: - print( - 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] - sf.write(filename, temp, samplerate) + print(f"\t Splitting {infile} in {length}s-long chunks.") + sections = int(np.ceil(len(data) / samplerate / length)) + for i in range(sections): + if verbose: + print( + 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) def zip_folder(outfolder): @@ -160,4 +167,4 @@ def main(): print("Done.") if __name__ == "__main__": - main() + main() \ No newline at end of file