BirdNET on the river

This commit is contained in:
Samuel Ortion 2022-08-12 18:01:01 +02:00
parent 8f7af9da13
commit bd8a7bcbd6
23 changed files with 1156 additions and 1 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
CUDA_VISIBLE_DEVICES=""

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
var/
/.venv/
/analyzer/

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "BirdNET-Analyzer"]
path = analyzer
url = git@github.com:kahst/BirdNET-Analyzer.git

21
.ideas/create_database.sh Executable file
View File

@ -0,0 +1,21 @@
#! /usr/bin/env bash
# Load config file
config_filepath="./config/analyzer.conf"
if [ -f "$config_filepath" ]; then
source "$config_filepath"
else
echo "Config file not found: $config_filepath"
exit 1
fi
# Check if database location is specified
if [ -z "$DATABASE" ]; then
echo "DATABASE location not specified"
echo "Defaults to ./var/db.sqlite"
DATABASE="./var/db.sqlite"
fi
# Create database according to schema in structure.sql
sqlite3 "$DATABASE" < ./daemon/database/structure.sql

View File

@ -0,0 +1,202 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="297mm"
height="210mm"
viewBox="0 0 297 210"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
sodipodi:docname="database_entity_model.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.69121632"
inkscape:cx="537.45838"
inkscape:cy="237.26292"
inkscape:window-width="960"
inkscape:window-height="1011"
inkscape:window-x="20"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<rect
x="60.967851"
y="72.660463"
width="459.41278"
height="328.1489"
id="rect1143" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g1129">
<rect
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-dasharray:none"
id="rect131"
width="65.246124"
height="55.045082"
x="43.106831"
y="41.155899" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.515115;stroke-dasharray:none"
id="rect811"
width="65.240868"
height="19.126961"
x="43.155922"
y="41.253414" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.4379px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:2.89671;stroke-dasharray:none"
x="85.102234"
y="196.65274"
id="text975"><tspan
sodipodi:role="line"
id="tspan973"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.4379px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:2.89672"
x="85.102234"
y="196.65274">birdnet_stream_db</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
x="61.804199"
y="53.257435"
id="text1105"><tspan
sodipodi:role="line"
id="tspan1103"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.5"
x="61.804199"
y="53.257435">taxon</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
x="48.997536"
y="66.91153"
id="text1133"><tspan
sodipodi:role="line"
id="tspan1131"
style="stroke-width:0.5"
x="48.997536"
y="66.91153"># taxon_id</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="48.997536"
y="73.967079"
id="tspan1135">scientific_name</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="48.997536"
y="81.022629"
id="tspan1137">common_name</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="48.997536"
y="88.078178"
id="tspan1139" /></text>
<g
id="g1129-8"
transform="matrix(0.99211666,0,0,1.3173149,104.43433,-21.334123)">
<rect
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-dasharray:none"
id="rect131-9"
width="65.246124"
height="55.045082"
x="43.106831"
y="41.155899" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.434779;stroke-dasharray:none"
id="rect811-7"
width="65.333549"
height="13.606859"
x="43.109581"
y="41.208733" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
x="161.55785"
y="46.174801"
id="text1105-3"><tspan
sodipodi:role="line"
id="tspan1103-6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.5"
x="161.55785"
y="46.174801">observation</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.46175px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.483816;stroke-dasharray:none"
x="148.6974"
y="61.234417"
id="text1133-1"
transform="scale(1.0338021,0.96730317)"><tspan
sodipodi:role="line"
id="tspan1131-2"
style="stroke-width:0.483817"
x="148.6974"
y="61.234417"># observation_id</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.483817"
x="148.6974"
y="68.061607"
id="tspan1135-9">taxon_id</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.483817"
x="148.6974"
y="74.888802"
id="tspan1310">locality_id</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.483817"
x="148.6974"
y="81.715988"
id="tspan1312">date</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.483817"
x="148.6974"
y="88.543182"
id="tspan1314">time</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.483817"
x="148.6974"
y="95.370377"
id="tspan1316">notes</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.483817"
x="148.6974"
y="102.19757"
id="tspan1139-1">confidence</tspan></text>
<text
xml:space="preserve"
transform="scale(0.26458333)"
id="text1141"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.3333px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre;shape-inside:url(#rect1143);display:inline;fill:none;stroke:#000000;stroke-width:1.88976;stroke-dasharray:none" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:none;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none"
x="158.23474"
y="72.990105"
id="text1306"><tspan
sodipodi:role="line"
id="tspan1304"
style="stroke-width:0.5"
x="158.23474"
y="72.990105" /></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.1 KiB

70
.ideas/fill_taxa.sh Executable file
View File

@ -0,0 +1,70 @@
#! /usr/bin/env bash
set -e
# Load config file
config_filepath="./config/analyzer.conf"
if [ -f "$config_filepath" ]; then
source "$config_filepath"
else
echo "Config file not found: $config_filepath"
exit 1
fi
# Check if database location is specified
if [ -z "$DATABASE" ]; then
echo "DATABASE location not specified"
echo "Defaults to ./var/db.sqlite"
DATABASE="./var/db.sqlite"
fi
# Check if species list is specified
if [ -z "$SPECIES_LIST" ]; then
echo "SPECIES_LIST location not specified"
exit 1
fi
function insert_taxa()
{
for taxon in "$(cat $SPECIES_LIST)"; do
taxon_scientific_name=$(echo $taxon | cut -d'_' -f1)
taxon_common_name=$(echo $taxon | cut -d'_' -f2)
if $(taxon_exists $taxon_scientific_name); then
echo "Taxon already exists: $taxon_scientific_name"
else
echo "Inserting taxon: $taxon_scientific_name"
statement="INSERT INTO taxon (scientific_name, common_name) VALUES ('$taxon_scientific_name', '$taxon_common_name')"
echo $statement
result=$(sqlite3 "$DATABASE" "$statement")
echo "$result"
fi
done
}
function taxon_exists()
{
taxon_scientific_name="$1"
statement="SELECT scientific_name FROM taxon WHERE scientific_name='$taxon_scientific_name'"
result=$(sqlite3 "$DATABASE" "$statement")
if [ -z "$result" ]; then
return 1
else
return 0
fi
}
function purge_taxa()
{
statement="DELETE FROM taxon"
result=$(sqlite3 "$DATABASE" "$statement")
echo "$result"
}
function main()
{
purge_taxa
insert_taxa
}
main

View File

@ -0,0 +1,41 @@
#! /usr/bin/env bash
# Load config file
config_filepath="./config/analyzer.conf"
if [ -f "$config_filepath" ]; then
source "$config_filepath"
else
echo "Config file not found: $config_filepath"
exit 1
fi
# Check if database location is specified
if [ -z "$DATABASE" ]; then
echo "DATABASE location not specified"
echo "Defaults to ./var/db.sqlite"
DATABASE="./var/db.sqlite"
fi
function insert_observation()
{
# Insert observation into database
template=$(cat ./daemon/database/observation_template.sql)
statement=$(echo "$template" | sed "s/:taxon_id/$1/g" | sed "s/:location_id/$2/g" | sed "s/:date/$3/g" | sed "s/:time/$4/g" | sed "s/:confidence/$5/g" | sed "s/:notes/$6/g")
result=$(sqlite3 "$DATABASE" $statement)
echo "$result"
}
function get_taxon_id()
{
# Get taxon id from database
statement="SELECT taxon_id FROM taxon WHERE scientific_name='$1'"
result=$(sqlite3 "$DATABASE" "$statement")
echo "$result"
}
function test()
{
taxon_scientific_name="Erithacus rubecula"
taxon_id=$(get_taxon_id "$taxon_scientific_name")
}

View File

@ -0,0 +1,3 @@
/** Observation database entry template */
INSERT INTO observation (taxon_id, locality_id, date, time, confidence) VALUES (:taxon_id, :locality_id, :date, :time, :confidence);

37
INSTALL.md Normal file
View File

@ -0,0 +1,37 @@
# Installation Guide for BirdNET-stream
## Requirements
- git
- ffmpeg
- python3
## Install process
### Install python requirements
```bash
sudo apt-get update
sudo apt-get install python3-dev python3-pip
sudo pip3 install --upgrade pip
```
### Install ffmpeg
```bash
sudo apt-get install ffmpeg
```
### Clone BirdNET-stream repository
```bash
git clone https://forge.chapril.org/UncleSamulus/BirdNET-stream.git
### Setup python virtualenv and packages
```bash
python3 -m venv .venv/birdnet-stream
source .venv/birdnet-stream
pip install -r requirements.txt
```

View File

@ -1,3 +1,14 @@
# BirdNET-stream
BirdNET powered soundscape analysis for bird song identification
<div>
<img src="./media/logo.svg" alt="BirdNET-stream logo image IA generated">
</div>
Realtime BirdNET powered soundscape analysis for bird song identification.
## Acknoledgements
- [BirdNET](https://birdnet.cornell.edu) on which this project relies
- [BirdNET-Pi](https://birdnetpi.com) the great inspiration of this project

1
analyzer Submodule

@ -0,0 +1 @@
Subproject commit 08f031585265e5bc22e86a60ecbb0310c937a29b

20
config/analyzer.conf Normal file
View File

@ -0,0 +1,20 @@
# Configuration file for BirdNET Analyzer
# Coordinates of the recorder
LATITUDE="47.87842"
LONGITUDE="0.21826"
LOCATION="Maison ORTION - Saint-Gervais-en-Belin"
# Species selection list
SPECIES_LIST="./config/species_list.txt"
# Minimal confidence threshold
CONFIDENCE=0.25
# Recording duration (in seconds)
RECORDING_DURATION=15
# Chunk folder location
CHUNK_FOLDER="./var/chunks"
# Audio recording device (pulseaudio)
AUDIO_DEVICE="default"
# Virtual env for BirdNET AI with required packages
PYTHON_VENV="./.venv/birdnet-stream"
# Database location
DATABASE="./var/db.sqlite"

189
config/species_list.txt Normal file
View File

@ -0,0 +1,189 @@
Acanthis cabaret_Lesser Redpoll
Accipiter nisus_Eurasian Sparrowhawk
Acrocephalus palustris_Marsh Warbler
Acrocephalus schoenobaenus_Sedge Warbler
Acrocephalus scirpaceus_Eurasian Reed Warbler
Actitis hypoleucos_Common Sandpiper
Aegithalos caudatus_Long-tailed Tit
Aix galericulata_Mandarin Duck
Alauda arvensis_Eurasian Skylark
Alcedo atthis_Common Kingfisher
Alectoris rufa_Red-legged Partridge
Alopochen aegyptiaca_Egyptian Goose
Anas acuta_Northern Pintail
Anas crecca_Green-winged Teal
Anas platyrhynchos_Mallard
Anser albifrons_Greater White-fronted Goose
Anser anser_Graylag Goose
Anthus petrosus_Rock Pipit
Anthus pratensis_Meadow Pipit
Anthus spinoletta_Water Pipit
Anthus trivialis_Tree Pipit
Apus apus_Common Swift
Aquila chrysaetos_Golden Eagle
Ardea alba_Great Egret
Ardea cinerea_Gray Heron
Ardea purpurea_Purple Heron
Arenaria interpres_Ruddy Turnstone
Aythya ferina_Common Pochard
Aythya fuligula_Tufted Duck
Aythya marila_Greater Scaup
Branta bernicla_Brant
Branta canadensis_Canada Goose
Bubulcus ibis_Cattle Egret
Bucephala clangula_Common Goldeneye
Buteo buteo_Common Buzzard
Calidris alpina_Dunlin
Calidris melanotos_Pectoral Sandpiper
Calidris pugnax_Ruff
Carduelis carduelis_European Goldfinch
Certhia brachydactyla_Short-toed Treecreeper
Certhia familiaris_Eurasian Treecreeper
Cettia cetti_Cetti's Warbler
Charadrius dubius_Little Ringed Plover
Charadrius hiaticula_Common Ringed Plover
Chlidonias hybrida_Whiskered Tern
Chloris chloris_European Greenfinch
Chroicocephalus ridibundus_Black-headed Gull
Ciconia ciconia_White Stork
Cinclus cinclus_White-throated Dipper
Circaetus gallicus_Short-toed Snake-Eagle
Circus aeruginosus_Eurasian Marsh-Harrier
Circus pygargus_Montagu's Harrier
Cisticola juncidis_Zitting Cisticola
Coccothraustes coccothraustes_Hawfinch
Columba livia_Rock Pigeon
Columba oenas_Stock Dove
Columba palumbus_Common Wood-Pigeon
Corvus corax_Common Raven
Corvus corone_Carrion Crow
Corvus frugilegus_Rook
Corvus monedula_Eurasian Jackdaw
Coturnix coturnix_Common Quail
Cuculus canorus_Common Cuckoo
Curruca communis_Greater Whitethroat
Curruca curruca_Lesser Whitethroat
Curruca undata_Dartford Warbler
Cyanistes caeruleus_Eurasian Blue Tit
Cygnus olor_Mute Swan
Delichon urbicum_Common House-Martin
Dendrocopos major_Great Spotted Woodpecker
Dendrocoptes medius_Middle Spotted Woodpecker
Dryobates minor_Lesser Spotted Woodpecker
Dryocopus martius_Black Woodpecker
Egretta garzetta_Little Egret
Emberiza calandra_Corn Bunting
Emberiza cirlus_Cirl Bunting
Emberiza citrinella_Yellowhammer
Emberiza schoeniclus_Reed Bunting
Erithacus rubecula_European Robin
Falco peregrinus_Peregrine Falcon
Falco subbuteo_Eurasian Hobby
Falco tinnunculus_Eurasian Kestrel
Ficedula hypoleuca_European Pied Flycatcher
Fringilla coelebs_Common Chaffinch
Fringilla montifringilla_Brambling
Fulica atra_Eurasian Coot
Gallinago gallinago_Common Snipe
Gallinula chloropus_Eurasian Moorhen
Garrulus glandarius_Eurasian Jay
Grus grus_Common Crane
Haematopus ostralegus_Eurasian Oystercatcher
Himantopus himantopus_Black-winged Stilt
Hippolais polyglotta_Melodious Warbler
Hirundo rustica_Barn Swallow
Ichthyaetus melanocephalus_Mediterranean Gull
Lanius collurio_Red-backed Shrike
Larus argentatus_Herring Gull
Larus canus_Common Gull
Larus fuscus_Lesser Black-backed Gull
Larus marinus_Great Black-backed Gull
Larus michahellis_Yellow-legged Gull
Limosa lapponica_Bar-tailed Godwit
Limosa limosa_Black-tailed Godwit
Linaria cannabina_Eurasian Linnet
Locustella naevia_Common Grasshopper-Warbler
Lophophanes cristatus_Crested Tit
Loxia curvirostra_Red Crossbill
Lullula arborea_Wood Lark
Luscinia megarhynchos_Common Nightingale
Luscinia svecica_Bluethroat
Mareca penelope_Eurasian Wigeon
Mareca strepera_Gadwall
Mergus merganser_Common Merganser
Milvus migrans_Black Kite
Milvus milvus_Red Kite
Morus bassanus_Northern Gannet
Motacilla alba_White Wagtail
Motacilla cinerea_Gray Wagtail
Motacilla flava_Western Yellow Wagtail
Muscicapa striata_Spotted Flycatcher
Numenius arquata_Eurasian Curlew
Nycticorax nycticorax_Black-crowned Night-Heron
Oenanthe oenanthe_Northern Wheatear
Oriolus oriolus_Eurasian Golden Oriole
Pandion haliaetus_Osprey
Panurus biarmicus_Bearded Reedling
Parus major_Great Tit
Passer domesticus_House Sparrow
Passer montanus_Eurasian Tree Sparrow
Perdix perdix_Gray Partridge
Periparus ater_Coal Tit
Pernis apivorus_European Honey-buzzard
Phalacrocorax carbo_Great Cormorant
Phasianus colchicus_Ring-necked Pheasant
Phoenicurus ochruros_Black Redstart
Phoenicurus phoenicurus_Common Redstart
Phylloscopus bonelli_Western Bonelli's Warbler
Phylloscopus collybita_Common Chiffchaff
Phylloscopus ibericus_Iberian Chiffchaff
Phylloscopus trochilus_Willow Warbler
Pica pica_Eurasian Magpie
Picus viridis_Eurasian Green Woodpecker
Pluvialis apricaria_European Golden-Plover
Pluvialis squatarola_Black-bellied Plover
Podiceps cristatus_Great Crested Grebe
Poecile montanus_Willow Tit
Poecile palustris_Marsh Tit
Prunella modularis_Dunnock
Psittacula krameri_Rose-ringed Parakeet
Pyrrhocorax pyrrhocorax_Red-billed Chough
Pyrrhula pyrrhula_Eurasian Bullfinch
Rallus aquaticus_Water Rail
Recurvirostra avosetta_Pied Avocet
Regulus ignicapilla_Common Firecrest
Regulus regulus_Goldcrest
Remiz pendulinus_Eurasian Penduline-Tit
Riparia riparia_Bank Swallow
Saxicola rubetra_Whinchat
Saxicola rubicola_European Stonechat
Serinus serinus_European Serin
Sitta europaea_Eurasian Nuthatch
Spatula clypeata_Northern Shoveler
Spatula querquedula_Garganey
Spinus spinus_Eurasian Siskin
Sterna hirundo_Common Tern
Sternula albifrons_Little Tern
Streptopelia decaocto_Eurasian Collared-Dove
Streptopelia turtur_European Turtle-Dove
Strix aluco_Tawny Owl
Sturnus vulgaris_European Starling
Sylvia atricapilla_Eurasian Blackcap
Sylvia borin_Garden Warbler
Tachybaptus ruficollis_Little Grebe
Tadorna tadorna_Common Shelduck
Thalasseus sandvicensis_Sandwich Tern
Tringa erythropus_Spotted Redshank
Tringa glareola_Wood Sandpiper
Tringa nebularia_Common Greenshank
Tringa ochropus_Green Sandpiper
Tringa totanus_Common Redshank
Troglodytes troglodytes_Eurasian Wren
Turdus iliacus_Redwing
Turdus merula_Eurasian Blackbird
Turdus philomelos_Song Thrush
Turdus pilaris_Fieldfare
Turdus viscivorus_Mistle Thrush
Tyto alba_Barn Owl
Uria aalge_Common Murre
Vanellus vanellus_Northern Lapwing

90
daemon/analyze-stream.sh Executable file
View File

@ -0,0 +1,90 @@
#! /usr/bin/env bash
set -e
config_filepath="./config/analyzer.conf"
if [ -f "$config_filepath" ]; then
source "$config_filepath"
else
echo "Config file not found: $config_filepath"
exit 1
fi
PYTHON_EXECUTABLE="${PYTHON_VENV}/bin/python3"
check_prerequisites() {
if [[ -z ${LATITUDE} ]]; then
echo "LATITUDE is not set"
exit 1
fi
if [[ -z ${LONGITUDE} ]]; then
echo "LONGITUDE is not set"
exit 1
fi
if [[ -z ${CHUNK_FOLDER} ]]; then
echo "CHUNK_FOLDER is not set"
exit 1
else
if [[ ! -d "${CHUNK_FOLDER}" ]]; then
echo "CHUNK_FOLDER does not exist: ${CHUNK_FOLDER}"
exit 1
else
if [[ ! -d "${CHUNK_FOLDER}/in" ]]; then
echo "Input dir does not exist: ${CHUNK_FOLDER}/in"
exit 1
else
if [[ ! -d "${CHUNK_FOLDER}/out" ]]; then
echo "Output dir does not exist: ${CHUNK_FOLDER}/out"
echo "Creating output dir"
mkdir -p "${CHUNK_FOLDER}/out"
fi
fi
fi
fi
fi
if [[ -z ${SPECIES_LIST} ]];
then
echo "SPECIES_LIST is not set"
exit 1
fi
if [[ -f $PYTHON_EXECUTABLE ]];
then
if $verbose; then
echo "Python executable found: $PYTHON_EXECUTABLE"
fi
else
echo "Python executable not found: $PYTHON_EXECUTABLE"
exit 1
fi
}
# Get array of audio chunks to be processed
get_chunk_list() {
find "$CHUNK_FOLDER/in" -type f -name '*.wav' -exec basename {} \; ! -size 0 | sort
}
# Perform audio chunk analysis on one chunk
analyze_chunk() {
chunk_name=$1
chunk_path="$CHUNK_FOLDER/in/$chunk_name"
output_dir="$CHUNK_FOLDER/out/$chunk_name.d"
mkdir -p "$output_dir"
date=$(echo $chunk_name | cut -d'_' -f2)
week=$(./daemon/weekof.sh $date)
$PYTHON_EXECUTABLE ./analyzer/analyze.py --i $chunk_path --o "$output_dir/model.out.csv" --lat $LATITUDE --lon $LONGITUDE --week $week --min_conf $CONFIDENCE --threads 4 --rtype csv
}
# Perform audio chunk analysis on all recorded chunks
analyze_chunks() {
for chunk_name in $(get_chunk_list); do
analyze_chunk $chunk_name
chunk_path="$CHUNK_FOLDER/in/$chunk_name"
mv $chunk_path "$CHUNK_FOLDER/out/$chunk_name"
done
}
# Get list of current chunk in working directory
chunks=$(get_chunk_list)
# Analyze all chunks in working directory
analyze_chunks $chunks

View File

@ -0,0 +1,83 @@
#! /usr/bin/env python3
import sqlite3
import os
verbose = False
"""Load config"""
def load_conf():
with open("./config/analyzer.conf", "r") as f:
conf = f.readlines()
res = dict(map(str.strip, sub.split('=', 1)) for sub in conf if '=' in sub)
return res
# Singleton database instance
database = None
def get_database():
global database
if database is None:
database = sqlite3.connect(CONFIG["DATABASE"])
return database
"""Create the database if it doesn't exist"""
def create_database():
# Create the database
database =
database = get_database()
cursor = database.cursor()
with open("./daemon/database/structure.sql", "r") as f:
cursor.executescript(f.read())
database.commit()
"""Insert an observation into the database"""
def insert_observation(observation):
database = get_database()
cursor = database.cursor()
cursor.execute(f"INSERT INTO observation (taxon_id, locality_id, date, time, confidence) VALUES ({observation['taxon_id']}, {observation['locality_id']}, {observation['date']}, {observation['time']}, {observation['confidence']});")
database.commit()
"""Insert a taxon in database"""
def insert_taxon(taxon):
database = get_database()
cursor = database.cursor()
cursor.execute(f"INSERT INTO taxon (scientific_name, common_name) VALUES ('{taxon['scientific_name']}', '{taxon['common_name']}');")
database.commit()
"""Insert a location into database"""
def insert_locality(locality):
database = get_database()
cursor = database.cursor()
cursor.execute(f"INSERT INTO locality (name, latitude, longitude) VALUES ('{locality['name']}', {locality['latitude']}, {locality['longitude']});")
database.commit()
"""Insert all species from list into database"""
def insert_all_species(species):
database = get_database()
cursor = database.cursor()
for sp in species:
# Check if the species already exists in the database
cursor.execute(f"SELECT * FROM taxon WHERE scientific_name = '{sp[0]}';")
# If it doesn't exist, insert it
if cursor.fetchone() is None:
cursor.execute(f"INSERT INTO taxon (scientific_name, common_name) VALUES ('{sp[0]}', '{sp[1]}');")
database.commit()
CONFIG = load_conf()
def main():
# Create the database if it doesn't exist
if not os.path.exists(CONFIG["DATABASE"]):
create_database()
else:
print("Database already exists")
# Open species list file
with open(CONFIG["SPECIES_LIST"], "r") as f:
species = f.readlines()
species = [sp.split("_") for sp in species]
if __name__ == "__main__":
main()
database.close()

View File

@ -0,0 +1,29 @@
/** Database structure for BirdNET-stream SQLite*/
/** Taxon table */
CREATE TABLE IF NOT EXISTS taxon (
taxon_id INTEGER PRIMARY KEY,
scientific_name TEXT NOT NULL,
common_name TEXT NOT NULL
);
/** Locality table */
CREATE TABLE IF NOT EXISTS locality (
locality_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
latitude REAL NOT NULL,
longitude REAL NOT NULL
);
/** Observation table */
CREATE TABLE IF NOT EXISTS observation (
observation_id INTEGER PRIMARY KEY,
taxon_id INTEGER NOT NULL,
locality_id INTEGER NOT NULL,
date TEXT NOT NULL,
time TEXT NOT NULL,
notes TEXT,
confidence REAL NOT NULL,
FOREIGN KEY(taxon_id) REFERENCES taxon(taxon_id),
FOREIGN KEY(locality_id) REFERENCES locality(locality_id)
);

0
daemon/dist/birdnet-stream.service vendored Normal file
View File

35
daemon/miner.sh Normal file
View File

@ -0,0 +1,35 @@
# !/bin/bash
# Extract data generated with BirdNET on record to get relevant informations and record data in sqlite
# Load config file
config_filepath="./config/analyzer.conf"
if [ -f "$config_filepath" ]; then
source "$config_filepath"
else
echo "Config file not found: $config_filepath"
exit 1
fi
# Verify needed prerequisites
if [[ -z ${CHUNK_FOLDER} ]]; then
echo "CHUNK_FOLDER is not set"
exit 1
else
if [[ ! -d "${CHUNK_FOLDER}" ]]; then
echo "CHUNK_FOLDER does not exist: ${CHUNK_FOLDER}"
exit 1
else
if [[ ! -d "${CHUNK_FOLDER}/out" ]]; then
echo "Output dir does not exist: ${CHUNK_FOLDER}/out"
echo "Cannot mine data"
exit 1
fi
fi
fi
fi
function list_all_model_outputs()
{
}

28
daemon/record-chunks.sh Executable file
View File

@ -0,0 +1,28 @@
#! /usr/bin/env bash
record_chunk()
{
DEVICE=$1
DURATION=$2
ffmpeg -f pulse -i ${DEVICE} -t ${DURATION} -vn -acodec pcm_s16le -ac 1 -ar 48000 file:${CHUNK_FOLDER}/in/birdnet_$(date "+%Y%m%d_%H%M%S").wav
}
config_filepath="./config/analyzer.conf"
if [ -f "$config_filepath" ]; then
source "$config_filepath"
else
echo "Config file not found: $config_filepath"
exit 1
fi
[ -z $RECORDING_DURATION ] && RECORDING_DURATION=15
if [[ -z $AUDIO_DEVICE ]]; then
echo "AUDIO_DEVICE is not set"
exit 1
fi
while true; do
record_chunk $AUDIO_DEVICE $RECORDING_DURATION
done

9
daemon/weekof.sh Executable file
View File

@ -0,0 +1,9 @@
#! /usr/bin/env bash
function weekof()
{
local date=$1
date -d "$date" +%W
}
weekof $1

231
media/logo.svg Normal file
View File

@ -0,0 +1,231 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="19 122.5 1882 1674.9" enable-background="new 19 122.5 1882 1674.9" xml:space="preserve">
<g>
<path stroke="#000000" stroke-width="9.375000e-002" d="M463.4,171.4c10.6-2.5,21.8,6.7,21.2,17.6c0.2,10.8-11,19.8-21.5,17.1 c-10.3-1.9-16.9-14.1-12.7-23.8C452.5,176.8,457.5,172.5,463.4,171.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M502.5,207.5c6.4-3.3,14.9,0.7,16.7,7.6 c1.9,6.1-2.1,13.3-8.3,14.8c-6.4,2-13.8-2.4-15-9C494.6,215.6,497.5,209.7,502.5,207.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M546.4,214.5c12-3.2,25.4,5.4,27.6,17.6c2.8,11.7-5.4,24.4-17.1,26.9 c-8.1,2-17.2-0.9-22.6-7.3c-5.9-6.6-7.3-16.8-3.3-24.7C533.8,220.7,539.7,216,546.4,214.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M615.3,250.4c8.9-1.8,18.5,2.3,23.4,9.9c5.7,8.3,4.8,20.2-1.9,27.6 c-5.8,6.9-15.9,9.6-24.4,6.7c-9.1-2.9-15.7-12-15.7-21.5C596.5,262.3,604.7,252.2,615.3,250.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M556.4,273.5c9.6-2.4,20.1,4.9,21.3,14.7c1.7,9.3-5.4,18.8-14.7,20.1 c-9.2,1.8-18.9-5.1-20.3-14.3C540.8,284.9,547.3,275.3,556.4,273.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M396.4,292.6c9.1-2.6,18.7,5.1,18.9,14.4c0.8,8.1-6,16.1-14.3,16.3 c-8,0.5-15.3-6.4-15.8-14.4C384.5,301.7,389.3,294.3,396.4,292.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M687.4,293.4c15.9-3.8,33.4,7.1,37,23c4.5,15.6-5.5,33.4-21.1,37.9 c-15,5.1-32.8-3.3-38.5-18c-5.7-13.1-0.9-29.5,10.8-37.7C679.1,296.1,683.1,294.3,687.4,293.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M627.3,306.1c10.5-2.8,21.9,6,21.7,16.9c0.6,10.8-10.3,20-20.9,17.8 c-9.5-1.5-16.4-11.5-14.3-20.9C615.1,313.3,620.7,307.6,627.3,306.1z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M767.4,332.6c9.1-1.3,18.7,0.7,26.5,5.5c12.2,7.4,19.9,21.7,19,36 c-0.4,17.4-13.6,33.3-30.5,37.1c-11.1,2.8-23.2,0.4-32.6-6.1c-8.7-6.1-14.8-15.7-16.5-26.2c-2-11,1.1-22.8,8.1-31.5 C747.7,339.4,757.2,333.9,767.4,332.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M698.4,367.5c11-2.7,22.9,5.6,24.3,16.8c1.8,10.3-5.5,20.9-15.8,22.9 c-10.3,2.5-21.7-4.6-24-15C680,381.5,687.5,369.5,698.4,367.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M643.4,371.5c6.9-2.1,14.8,3.3,15.2,10.5 c0.9,7.3-6.1,14.1-13.4,13c-6.3-0.6-11.3-6.7-10.6-13C635,377.1,638.7,372.7,643.4,371.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M856.4,381.7c13.9-2,28.5,1.7,39.9,10c11.2,8.1,19.2,20.5,21.7,34.1 c2.9,14.5-0.5,30.1-9.1,42.2c-7.2,10.2-17.9,17.8-29.8,21.2c-13.8,4-29,2.3-41.6-4.6c-12.8-7-22.7-19.3-26.6-33.3 c-4.5-15.6-1.6-33.1,7.8-46.4C827.4,392.3,841.4,383.7,856.4,381.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M547.3,386.1c8.2-2.5,17.3,3.6,18.8,11.9 c1.9,7.9-3.4,16.8-11.5,18.3c-7.9,1.9-16.3-4-17.9-11.9C534.7,396.9,539.5,388.1,547.3,386.1z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M723.3,419.2c7-3,15.8,2.3,16.3,9.9 c1,7.1-5.5,13.9-12.6,13.3c-6.7-0.2-12.2-6.7-11.3-13.4C716.2,424.6,719.2,420.7,723.3,419.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M769.4,426.5c14.4-4.1,30.7,5.1,34.8,19.5c4.9,14.4-3.9,31.4-18.4,35.9 c-13.4,4.9-29.7-2.1-35.5-15.1c-5.8-11.8-2.1-27.1,8.3-35C761.8,429.2,765.5,427.4,769.4,426.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M957.4,454.5c13-4.5,28.3,4.3,31.2,17.7c3.2,12-4.4,25.5-16.2,29.1 c-7.8,2.6-16.9,0.9-23.3-4.4c-7.3-5.9-10.6-16.1-8.1-25.2C943,463.7,949.5,456.9,957.4,454.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M576.4,472.5c8.9-3,19,4.2,19.5,13.5c1.1,7.9-5,16.1-13,16.8 c-7.3,1.1-14.6-4.2-16.4-11.3C564,484,568.7,474.9,576.4,472.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M640.4,496.4c8-2.7,17.1,2.9,19,11c2.2,7.6-2.3,16.6-10,18.8 c-7.6,2.6-16.4-2.3-18.7-9.8C627.6,508.5,632.2,498.7,640.4,496.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M836.4,497.4c6.8-3.3,15,3.1,14.3,10.4 c-0.1,7.2-8.9,12.4-15.1,8.5C828.3,512.5,828.7,500.5,836.4,497.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M712.3,499.1c9.1-2.7,19.4,2.8,22.8,11.6c2.8,6.9,1.6,15.4-3.5,20.9 c-5,5.9-13.9,7.9-21,4.9c-7.7-3.1-12.7-11.3-12.2-19.5C698.6,508.9,704.4,501.2,712.3,499.1z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M778.4,500.5c17-4.5,36.2,4.6,43.6,20.5c6,12.1,5,27.3-2.7,38.4 c-9.9,15.4-31.6,21.5-48.1,13.4c-15-6.6-24.4-23.6-22-39.8C751,517.5,763.2,503.9,778.4,500.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M894.3,501.3c13.7-2.4,28.3,0.7,39.9,8.5c12.4,8.2,21.1,21.7,23.6,36.3 c2.7,14.8-1.2,30.5-10.2,42.5c-7.9,10.7-19.9,18.2-33,20.8c-14.5,3.1-30.2-0.2-42.4-8.7c-11-7.5-18.9-19.1-22.1-31.9 c-3.3-12.9-1.6-27.1,4.7-38.9C862.6,514.9,877.7,504,894.3,501.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M674.4,516.3c5.6-2.8,12.9,1.1,14.1,7.1 c1.7,5.7-2.5,12.4-8.6,13c-5.2,0.7-10.4-3.2-11.3-8.4C667.6,523.4,670,518.3,674.4,516.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M990.4,517.6c11.9-3.7,25.7,3.4,29.7,15.1c2.8,7.4,1.7,16-2.9,22.5 c-4.7,6.8-13,10.9-21.3,10.5c-8.3-0.3-16.3-5.1-20.3-12.4c-3.5-6.1-4.1-13.8-1.7-20.4C976.6,525.6,982.9,519.7,990.4,517.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M600.4,535.6c8-3,17.4,2.4,19.4,10.5c2.7,8.4-3.2,18.5-12.1,19.6 c-7.8,1.4-15.6-4.5-17.1-12.2C589,546.2,593.2,537.9,600.4,535.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M716.5,550.6c7.7-2.1,15,6.6,12,13.9c-2,7-12,9.3-16.8,3.8 C706,563,708.7,552.1,716.5,550.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M677.4,552.5c8.1-2.4,17.1,3.5,18.7,11.6 c2.3,8.5-4.1,18.3-13.1,18.9c-7.9,1-15.5-5.5-16.5-13.3C665.2,562.3,670,554.3,677.4,552.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M996.4,575.7c22.1-4.1,46,3.1,62.1,18.8c14,13.2,22.1,32.3,22.1,51.5 c0.2,19.1-7.8,38-21.4,51.3c-10.9,10.9-25.5,18-40.8,20c-20.4,2.8-41.8-3.8-57.1-17.5c-12.4-11-20.8-26.4-23.2-42.8 c-2.8-17.5,1.4-35.9,11.3-50.6C960,590.3,977.4,578.9,996.4,575.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M726.4,578.4c9.4-3.1,20,2.8,23.3,11.9c3.4,8.4,0.3,19.1-7.6,23.9 c-6.4,4.2-15.3,3.7-21.3-0.9c-7-5.2-9.8-15.1-6.7-23.2C716.1,584.5,720.8,580,726.4,578.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M769.3,589.2c7.9-1.4,14.3,8,10.7,15 c-2.6,6.6-12.3,8-16.7,2.5C757.8,601,761.3,590,769.3,589.2z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M684.4,594.5c7-2.6,14.7,4.1,13.5,11.4 c-0.4,7.5-10.1,11.9-16,7.2C675.2,608.6,676.7,597,684.4,594.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M812.4,594.6c17.2-4,36.1,5.7,43.1,21.8c4.8,10.5,4.5,23.1-0.8,33.3 c-4.8,9.3-13.5,16.6-23.6,19.5c-10.6,3.1-22.4,1.4-31.7-4.7c-13.3-8.3-20.3-25.4-16.7-40.7C785.8,609.5,797.9,597.4,812.4,594.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M749.5,636.7c6.3-2.5,13.7,2.7,13.8,9.4 c0.5,5.4-3.8,10.7-9.3,11c-6.1,0.7-11.6-5-11.1-11C743,642,745.6,638,749.5,636.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M568.4,642.6c9.4-2.2,19.4,5.7,19.4,15.3c0.6,8.7-7.1,16.8-15.8,16.8 c-9,0.5-17.2-7.8-16.6-16.8C555.5,650.7,561.2,643.9,568.4,642.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M902.4,656.5c6.5-1.8,13.9-0.3,19.2,4c5,3.9,8.1,10.2,8.2,16.6 c0.3,8.4-5,16.7-12.7,20.1c-4.7,2.2-10.2,2.4-15.2,1.1c-8.8-2.5-15.4-11-15.5-20.2C885.9,668.2,893,658.8,902.4,656.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M855.4,677.6c7.7-2.4,16.3,3.1,18,10.8c2.3,7.9-3.3,17-11.5,18.2 c-8.2,1.6-16.4-5.4-16.8-13.7C844.4,686.3,848.9,679.4,855.4,677.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M804.3,679.2c5.7-2,12.8,1.2,14.5,7.1 c2,5.8-2.2,12.3-7.9,13.8c-5.8,1.8-12.8-1.6-14.3-7.6C795,687,798.8,680.8,804.3,679.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M656.4,694.4c9.4-3.3,20.2,2.4,23.6,11.6c3,7.2,1.3,16.2-4.4,21.6 c-5.5,5.6-14.6,7-21.5,3.3c-7.2-3.5-11.6-11.8-10.8-19.8C643.8,703.6,649.1,696.6,656.4,694.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1074.4,707.8c17.5-2.8,36.1,3.6,48.2,16.6c13.6,14,18.6,35.5,12.7,54 c-4.8,15.9-17.2,29.3-32.8,35.2c-15.7,6.2-34.3,4.5-48.6-4.4c-13.6-8.2-23.2-22.5-25.6-38.2c-2.9-17,3-35.2,15.2-47.4 C1051.8,715.1,1062.8,709.5,1074.4,707.8z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M915.4,710.7c17.3-3,35.8,7.6,41.8,24.1c4.7,12,2.9,26.3-4.8,36.6 c-8.8,12.3-25.2,18.4-39.9,14.8c-10.5-2.4-19.8-9.4-24.9-18.8c-5.9-10.6-6.4-24-1.2-34.9C891.7,721,902.9,712.5,915.4,710.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M742.4,717.5c9.4-2.6,19.6,3.6,22.6,12.7c3,8.3-0.1,18.4-7.6,23.2 c-6.3,4.2-15.1,4-21.2-0.5c-6.9-4.8-10-14.2-7.5-22.2C730.5,724.2,735.9,718.9,742.4,717.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M850.4,725.6c7.7-2.5,16.5,2.9,18.2,10.7 c2.2,7.7-3,16.8-11,18.1c-7.5,1.7-15.3-3.7-16.9-11.1C838.7,736.1,843.1,727.7,850.4,725.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M788.4,729.6c7.7-2.6,16.6,5,14.1,13 c-2,8.8-15,11.5-20.4,4.2C777.1,740.9,781.1,731.1,788.4,729.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M989.3,729.4c7.2-1.7,15.2,0.6,20.3,6c5.2,5.2,7.3,13.1,5.6,20.2 c-1.6,6.7-6.5,12.4-12.8,15c-6.7,2.8-14.8,1.9-20.7-2.3c-7.3-4.9-10.8-14.6-8.6-23.1C975,737.4,981.5,731,989.3,729.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M674.5,748.5c5.2-3.1,12.5,1.5,12,7.5 c0,5.9-7.2,9.9-12.2,6.7C668.8,759.9,668.9,751.1,674.5,748.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M816.3,753.2c9.8-1.9,20.5,1.9,26.9,9.6c8.9,10.2,8.7,26.9-0.5,36.8 c-8.6,10.2-24.7,12.6-35.9,5.4c-9.7-5.8-15.2-17.6-13.2-28.7C795.4,764.9,804.9,755.2,816.3,753.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M582.3,764.3c7.1-1.6,14.7,4.3,14.6,11.7c0.5,7-6,13.2-12.9,12.6 c-7.1-0.2-12.9-7.6-11.3-14.6C573.5,769.2,577.5,765.1,582.3,764.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M724.3,775.3c12.1-2.5,25,6.6,26.8,18.8c2.4,11.9-6.3,24.5-18.2,26.6 c-9.7,2.1-20.2-3-24.8-11.7c-3.3-6.1-3.7-13.6-1-20C710,781.9,716.7,776.5,724.3,775.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M984.4,785.6c17.6-3,36.2,8.2,41.9,25.1c6.4,16.8-1,37.2-16.6,46.1 c-10.1,6.1-23.1,7.1-34,2.6c-7.4-3-13.8-8.2-18.1-15c-7-10.7-8-24.9-2.7-36.5C960.1,796.1,971.6,787.4,984.4,785.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M768.4,800.4c6.7-2,14.5,3.4,14.2,10.6 c0.1,8.1-9.6,13.4-16.6,10c-5.3-2.3-8-9.1-5.3-14.3C762.1,803.5,765.1,801.2,768.4,800.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M508.4,802.7c10.5-2.2,21.5,6.6,21.5,17.3c0.7,9.6-7.4,18.6-16.9,19.1 c-9.5,1-18.8-6.7-19.7-16.2C492,813.5,499.1,804.1,508.4,802.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1162.4,803.6c17.7-2.9,36,10,39.3,27.6c4,17-6.9,35.8-23.6,40.8 c-16,5.6-35.1-2.5-42.4-17.7c-6.9-13.2-4-30.6,6.8-40.9C1147.8,808.1,1154.9,804.6,1162.4,803.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M888.4,807.6c9.9-2.2,20.6-0.5,29.3,4.7c11.9,6.8,19.9,19.9,20.5,33.6 c1,16.1-8.6,32.2-23.2,39c-10.2,5-22.6,5.5-33.1,1.3c-10.9-4.3-19.8-13.4-23.6-24.4c-3.6-9.8-3.2-21,1.1-30.6 C864.5,819.3,875.6,810.2,888.4,807.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M799.4,829.7c9.6-3.2,20.5,3,23.5,12.5c2.5,7.1,0.7,15.7-4.8,20.9 c-5,5-12.9,6.7-19.5,4.1c-8.4-3.1-13.9-12.4-12.6-21.2C786.8,838.6,792.2,831.8,799.4,829.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1066.4,836.5c17.7-3.4,36.9,2.8,49.3,15.9c12.7,12.8,18.2,32.3,14.3,49.9 c-3.4,16.3-14.8,30.8-29.9,37.9c-15.2,7.5-33.8,7.3-48.8-0.4c-14.8-7.4-25.9-21.8-29.1-38.1c-3.4-15.8,0.8-32.9,11-45.4 C1041.4,845.9,1053.4,838.7,1066.4,836.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M583.4,847.5c6.8-2.6,15,2.3,16,9.5c1.6,7.4-5,14.9-12.4,14.4 c-6.8-0.1-12.6-6.5-11.9-13.3C575.5,853.4,578.8,849,583.4,847.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M683.4,865.7c9.7-2.3,20.4,3.9,23.3,13.5c2.4,7.1,0.4,15.4-5,20.6 c-6,6.2-16.3,7.7-23.8,3.4c-6.8-3.6-11.1-11.4-10.5-19.1C667.8,875.3,674.8,867.3,683.4,865.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M982.4,881.6c7.1-1.4,14.7,1.1,19.6,6.3c5.8,6,7.6,15.5,4.3,23.2 c-3.6,9.1-13.8,14.8-23.3,13.1c-10.3-1.4-18.5-11-18.4-21.3C964.4,892.8,972.4,883.3,982.4,881.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M837.3,882.3c5.4-2.3,11.9,2.9,10.9,8.7 c-0.5,6.2-8.9,9.4-13.4,5.2C830.1,892.4,831.6,884,837.3,882.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1188.4,889.6c18.3-2.1,37.3,5.8,48.7,20.3c10.9,13.3,14.9,32,10.3,48.6 c-4,15.1-14.7,28.3-28.8,35.1c-14.8,7.4-32.9,7.6-47.8,0.5c-15.8-7.2-27.6-22.4-30.7-39.4c-3.5-17.4,2.2-36.3,14.7-48.9 C1163.7,896.7,1175.8,890.9,1188.4,889.6z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1636.5,896.4c5.8-3.4,13.9,1.9,13.1,8.6 c-0.1,6.5-8.3,10.8-13.7,7.1C1629.9,908.9,1630.3,899.2,1636.5,896.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1674.3,896.6c11.1-2.4,23.2,4.6,26.6,15.4c2.6,7.4,1.1,16-3.8,22.1 c-4.3,5.5-11.2,8.8-18.1,8.8c-8.7,0.2-17.3-5-21.1-12.8c-3.7-7.2-3.3-16.3,1.1-23.1C1662.4,901.6,1668.1,897.8,1674.3,896.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M765.4,899.5c7.8-3.3,17.5,3.1,17.5,11.6c0.6,7.8-6.9,14.7-14.6,13.5 c-6.6-0.7-11.9-7-11.3-13.6C757.1,905.9,760.7,901.2,765.4,899.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M916.4,905.8c16.1-3.7,33.6,7.3,37.4,23.4c4.3,15.5-5.1,33.2-20.4,38.1 c-15.3,5.9-34-2.5-40.1-17.7c-6-13.4-1.2-30.3,10.9-38.5C907.8,908.5,912,906.7,916.4,905.8z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1733.4,906.4c4.9-2.2,10.9,2.2,10.4,7.5 c-0.1,5.9-7.8,9.4-12.3,5.5C1726.9,916.2,1728.1,908.2,1733.4,906.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1577.3,907.3c7.3-2.4,15.7,3.2,16.3,10.8 c1.1,7.6-6,14.9-13.6,14.1c-7-0.4-12.7-7.2-11.7-14.1C1568.8,913.1,1572.5,908.7,1577.3,907.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1766.4,907.3c3.7-1.7,8.3,1.6,8,5.7 c0.1,4.6-6.2,7.4-9.6,4.3C1761.3,914.7,1762.3,908.6,1766.4,907.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M868.5,908.7c5.6-2.1,11.9,3.4,10.5,9.3 c-0.8,6.1-9.2,8.9-13.5,4.5C861,918.5,862.7,910.3,868.5,908.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M819.4,911.5c5.6-2.1,12.4,1.8,13.5,7.7 c1.4,5.8-3.1,12-9,12.5c-5.4,0.8-10.9-3.5-11.5-8.9C811.7,917.9,814.8,913,819.4,911.5z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1710.4,914.2c3-1.9,7.5,0.3,7.8,3.9c0.8,4-4.1,7.5-7.7,5.4 C1707,921.8,1706.7,916,1710.4,914.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1618.4,917.7c8.2-2.3,17.5,0.4,23.2,6.7c5.7,5.9,7.8,14.9,5.6,22.7 c-2.4,8.4-9.7,15.2-18.4,16.8c-8.5,1.7-17.8-1.8-23-8.7c-4.9-6.2-6.4-14.8-3.8-22.3C1604.5,925.5,1610.8,919.6,1618.4,917.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1808.4,917.4c5.7-2.9,13.1,2.1,12.4,8.5 c-0.1,6.8-9,10.8-14.1,6.4C1801.6,928.6,1802.6,919.8,1808.4,917.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1783.4,918.4c6.8-3,15.1,3.2,14.2,10.6 c-0.2,7.7-10.1,12.5-16.3,7.9C1774.3,932.5,1775.7,920.9,1783.4,918.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1752.4,921.5c7.1-2.1,14.8,4.1,14.4,11.5 c0.1,7.3-7.7,13.1-14.7,11c-6.3-1.5-10.2-8.7-8-14.8C1745.3,925.5,1748.6,922.4,1752.4,921.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1832.5,924.7c7.3-2.1,15.2,4.8,13.9,12.3 c-0.6,7-8.4,11.9-14.9,9.4c-6.5-2-9.7-10.3-6.2-16.1C1826.8,927.5,1829.4,925.4,1832.5,924.7z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1724.4,928.4c6.2-3.3,14.3,2.6,12.9,9.5 c-0.7,6.8-9.8,10.1-14.8,5.5C1717.6,939.6,1718.6,930.8,1724.4,928.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1544.4,929.6c15.5-2.5,31.8,6.2,38.5,20.4c6.2,12.3,4.5,28-4.1,38.8 c-9.9,13.1-28.9,18-43.9,11.2c-14.6-6.1-24.1-22.3-22-38.1C1514.6,945.7,1528.2,931.7,1544.4,929.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M847.4,937.6c12.5-3.7,27.1,2.2,33.4,13.7c5.9,9.9,5,23.3-2.1,32.5 c-7.1,9.6-20.5,14-31.9,10.4c-8.2-2.4-15.2-8.6-18.5-16.4c-3.3-7.4-3.3-16,0-23.4C831.7,946.2,838.9,939.9,847.4,937.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M794.3,938.2c7.7-2.6,16.7,3.6,16.7,11.8 c0.7,7.2-5.8,13.9-13,13.6c-6.8,0.1-13-5.9-12.9-12.8C784.9,945.2,788.8,939.7,794.3,938.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M999.4,939.6c16.9-4,35.6,3.1,45.8,17.1c10.6,13.9,11.8,34.2,2.9,49.3 c-8.8,15.8-27.7,25-45.6,22.2c-17.4-2.4-32.7-15.8-37-32.8c-4.4-15.4,0.5-32.8,11.9-43.9C983.5,945.6,991.2,941.4,999.4,939.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M749.4,940.4c6.9-2.9,15.5,1.7,17.1,9c2.1,7.1-3.2,15.1-10.5,16 c-7,1.3-14.4-4.3-14.9-11.5C740.3,948.3,744,942.4,749.4,940.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1805.4,940.5c7.4-3.1,16.6,1.5,18.7,9.2 c2.4,7.2-2.2,15.6-9.5,17.7c-7.1,2.4-15.5-2.1-17.6-9.2C1794.5,951.2,1798.5,942.9,1805.4,940.5z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1707.5,942.6c3.4-1.4,7.5,1.7,7.1,5.4 c-0.1,4-5.3,6.4-8.4,3.9C1702.8,949.6,1703.7,943.8,1707.5,942.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1775.4,945.5c7.4-2.8,15.6,4.8,13.5,12.3 c-1.4,7.5-11.7,10.7-17.1,5.4C1765.7,958.4,1767.9,947.5,1775.4,945.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1685.4,948.3c5.7-2.5,12.7,2.4,12.3,8.6 c0.2,6.8-8.5,11.4-14,7.4C1677.6,960.7,1678.7,950.5,1685.4,948.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1655.4,950.4c6.1-3.2,14,2.8,12.7,9.6 c-0.7,6.7-9.7,10.2-14.7,5.6C1648.3,961.7,1649.5,952.8,1655.4,950.4z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1754.4,951.4c4.5-1.2,9,3.8,7.1,8.1 c-1.3,4.2-7.3,5.4-10.2,2.1C1748,958.5,1749.9,952.2,1754.4,951.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1729.5,952.5c5.8-3.1,13.4,2,12.9,8.5 c0,6.7-8.3,11.1-13.8,7.3C1722.6,965,1723.1,955.2,1729.5,952.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1480.4,954.7c7-1.6,14.8,1,19.3,6.5c4.8,5.5,6,13.8,3,20.5 c-3.3,8-12.3,13-20.8,11.7c-9.1-1.1-16.6-9.3-16.9-18.4C1464.4,965.6,1471.3,956.6,1480.4,954.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1707.3,962.2c5.3-3,12.5,1.8,11.8,7.8 c0,6-7.7,9.8-12.6,6.4C1701.3,973.3,1701.8,964.7,1707.3,962.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1110.4,963.5c6.6-1.3,13.7,0.9,18.4,5.7c6.1,6.1,7.6,16.3,3.3,23.8 c-4.2,8-14.1,12.3-22.9,9.9c-8.9-2.1-15.5-10.8-15.2-19.9C1094,973.8,1101.2,965.1,1110.4,963.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1639.4,970.5c5.8-1.9,12.3,3.4,11.5,9.5 c-0.2,6.8-9.2,10.8-14.4,6.4C1630.6,982.4,1632.5,972.2,1639.4,970.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1675.4,970.7c10.1-2.8,21.4,5,22.4,15.4c1.5,10-6.7,20-16.7,20.5 c-9.2,0.9-18.3-6.3-19.4-15.5C1660.1,982,1666.4,972.6,1675.4,970.7z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1750.4,970.2c3.2-1.1,6.8,2.3,5.5,5.5 c-0.8,3.2-5.3,4.2-7.4,1.8C1746.2,975.3,1747.3,971,1750.4,970.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1604.4,972.3c7.5-3.2,17,1.8,18.6,9.9c2,7.4-3.5,15.7-11,16.8 c-7.2,1.5-14.9-3.8-16.2-11C1594.4,981.5,1598.2,974.6,1604.4,972.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1768.5,972.5c4.9-2.2,11,2,10.5,7.4c0,5.7-7.3,9.3-11.8,5.9 C1762.2,982.8,1763,974.5,1768.5,972.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1789.4,972.3c5.1-2.9,12,1.9,11,7.6 c-0.4,5.5-7.5,8.7-11.9,5.4C1783.9,982.4,1784.5,974.7,1789.4,972.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1731.4,978.4c3.9-2.1,9.1,1.2,8.8,5.6 c0.2,4.9-6.3,7.9-10,4.7C1726.7,986.2,1727.4,980,1731.4,978.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1274.4,980.5c10.1-3.6,22.4,1.7,26.6,11.5c3.7,7.8,2,17.8-4,24 c-5.6,6-14.9,8.3-22.6,5.6c-8.7-2.8-14.9-11.5-14.7-20.6C1259.6,992,1265.8,983.3,1274.4,980.5z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M1712.4,986.2c3.7-1.7,8.4,1.7,8,5.7c0,4.6-6.1,7.3-9.5,4.3 C1707.3,993.7,1708.2,987.6,1712.4,986.2z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1750.4,986.5c6.8-3,15.3,2.1,15.8,9.5 c1,6.9-5.3,13.5-12.2,12.9c-6.7-0.2-12.2-7.1-10.8-13.7C1743.9,991.3,1746.8,988,1750.4,986.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M910.4,987.6c17.4-2.8,35.5,9.8,39,27.1c4.3,16.9-6.2,35.7-22.7,41.1 c-14.2,5.2-31.3-0.1-40.1-12.4c-7.8-10.4-9.1-25.2-3-36.7C888.7,996.4,899,989,910.4,987.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1450.4,988.5c9-2.1,18.7,5.2,19.2,14.5c1,8.9-6.6,17.4-15.6,17.5 c-8.6,0.5-16.6-6.9-16.7-15.5C1436.8,997.2,1442.8,989.8,1450.4,988.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1636.3,996.2c12.7-2.7,26.1,6.9,27.7,19.8c2.1,12.2-6.9,24.8-19.1,26.8 c-9.7,2-20.3-3-25-11.7c-3.8-6.8-4-15.6-0.3-22.5C1622.8,1002.2,1629.2,997.5,1636.3,996.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1505.4,999.6c9.2-2,18.9,6,18.5,15.4c0.4,8.5-7.5,16.2-16,15.8 c-8.4,0.1-15.8-7.5-15.5-15.8C1492.4,1007.6,1498.2,1000.8,1505.4,999.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1726.4,1000.5c5.4-2.1,12,1.8,12.7,7.6 c1.2,6.1-4.9,12.2-11,11c-5-0.7-8.9-5.9-8-11C1720.6,1004.7,1723.1,1001.6,1726.4,1000.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1578.4,1002.6c6.4-2.3,14-0.7,18.8,4.1c5.4,5.1,7,13.6,4,20.4 c-2.9,6.6-9.9,11.2-17.2,10.8c-8.5,0-16.3-6.9-17.5-15.3C1565,1014.3,1570.3,1005.3,1578.4,1002.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1702.4,1004.4c5.7-2.6,12.6,3.5,10.9,9.5 c-1.1,5.9-9.2,8.4-13.5,4.2C1695.3,1014.3,1696.9,1006.2,1702.4,1004.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1338.3,1007.2c5.3-1.1,10.9,0,15.3,3.1c6.2,4.2,9.5,12.1,8.1,19.4 c-0.9,5.4-4.2,10.4-8.8,13.3c-6.4,4.2-15.3,4.1-21.6-0.3c-6.8-4.5-10.2-13.4-8-21.2C1325.1,1014.4,1331.1,1008.6,1338.3,1007.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1213.4,1010.6c5.4-1.6,11.4-1,16.3,1.6c6.9,3.5,11.4,11,11.5,18.8 c0.1,6.6-2.9,13.1-8.1,17.2c-6.3,5.2-15.7,6.2-23,2.7c-7.5-3.5-12.5-11.6-12.3-19.9C1197.9,1021.8,1204.5,1013,1213.4,1010.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1416.5,1010.6c8.2-2.4,16.2,6.9,12.8,14.7 c-2.7,7.9-14.5,9.5-19.2,2.6C1405.3,1021.9,1409,1012.1,1416.5,1010.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1157.4,1015.4c7.1-2.2,15.1,3.3,15.7,10.7 c1,7.3-5.6,14.4-13,13.8c-7.3-0.1-13.2-7.5-11.7-14.6C1149.1,1020.6,1152.8,1016.6,1157.4,1015.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1678.5,1015.6c6.5-2.9,14.1,4.1,11.9,10.8 c-1.5,6.4-10.4,8.9-14.9,4.2C1670.6,1026.4,1672.4,1017.6,1678.5,1015.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M658.4,1016.4c7.5-2.4,15.4,5.5,13,13 c-1.6,7.6-12.3,10.5-17.6,4.9C647.8,1029,650.7,1018.1,658.4,1016.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1079.3,1022.3c16.8-3.6,35.2,5.5,42.5,21c7.6,14.8,4.2,34.3-8.1,45.5 c-10.1,9.8-25.8,13.3-39.2,8.8c-15.8-5-27.2-21-26.7-37.6C1047.8,1042,1061.7,1025.4,1079.3,1022.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1379.4,1024.5c6.1-2.3,13.5,2.2,14.3,8.7 c1.4,6.7-4.9,13.6-11.7,12.7c-7-0.2-12.1-8.1-9.6-14.5C1373.5,1028.2,1376.2,1025.6,1379.4,1024.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1463.4,1025.6c14.1-2.4,28.7,8.3,30.7,22.4c2.8,14.2-7.9,29-22.1,31.1 c-14.4,2.9-29.6-8-31.5-22.5C1437.8,1042.2,1448.9,1027.3,1463.4,1025.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1532.4,1029.6c15.5-4.3,33.1,3.1,41,17c6.8,11.1,6.8,25.9,0.3,37.1 c-6.9,12.4-21.5,20-35.7,18.4c-13.3-1.2-25.5-10.2-30.5-22.6c-5.5-12.9-2.7-28.8,6.9-39.1 C1519.2,1035.2,1525.5,1031.3,1532.4,1029.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M576.4,1031.5c8.5-3.2,18.8,2.7,20.5,11.6c2.2,8.5-4.2,17.9-12.8,19.1 c-8,1.5-16.6-4.2-18.1-12.2C564,1042.3,568.9,1033.8,576.4,1031.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1284.4,1037.2c17.3-2.4,35.5,4.2,47.3,17.1c11.9,12.6,17.2,31,13.8,48 c-3.2,16.8-14.6,31.7-30.1,39c-14.8,7.3-32.9,7.4-47.7,0.1c-15.4-7.3-27-22.1-30.3-38.8c-3.4-16.4,1.3-34.3,12.4-46.9 C1258.5,1045.6,1271.1,1038.9,1284.4,1037.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1603.4,1042.5c9-3.4,19.9,1.9,23,10.9c3.6,9-1.5,20.2-10.7,23.3 c-9.1,3.7-20.5-1.5-23.6-10.9C1588.6,1056.7,1594.1,1045.4,1603.4,1042.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1412.3,1046.2c7-2.7,15.5,2.5,16.4,9.9 c1.2,6.7-4,13.5-10.7,14.2c-6.8,1.1-13.7-4.5-14.1-11.4C1403.4,1053.5,1407.1,1047.9,1412.3,1046.2z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M792.5,1051.6c5.8-2.1,12.3,4.1,10.3,10 c-1.4,5.9-9.8,8.1-13.8,3.5C784.7,1061.1,786.8,1053.1,792.5,1051.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M752.5,1052.5c6.1-1.7,12.1,5.4,9.3,11.1 c-2.1,5.7-10.8,6.7-14.1,1.6C744.2,1060.9,746.9,1053.5,752.5,1052.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1005.4,1052.7c10.8-2.2,22.3,5.3,24.8,15.9c2.4,8.7-1.5,18.6-9.1,23.5 c-7.5,5.1-18.1,4.7-25.2-1c-7.3-5.4-10.3-15.8-7.2-24.3C991.3,1059.5,997.9,1053.9,1005.4,1052.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1372.4,1058.7c10.9-3,23.1,4.1,26,14.9c3.5,10.8-3.2,23.4-14,26.7 c-11.3,4-24.8-3.2-27.7-14.9C1353.2,1074.1,1360.9,1061.2,1372.4,1058.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M836.4,1060.3c5.7-2.3,12.2,3.6,10.6,9.5 c-1,5.9-8.9,8.5-13.3,4.5C828.8,1070.5,830.5,1061.9,836.4,1060.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1170.4,1060.7c18.2-3,37.5,6.3,46.6,22.2c9.3,15.4,8.2,36.2-2.6,50.5 c-10.4,14.7-30,21.9-47.5,17.7c-17.2-3.8-31.4-18.2-34.7-35.5c-3.6-16.3,2.7-34.3,15.6-44.8 C1154.3,1065.5,1162.2,1062,1170.4,1060.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M888.5,1061.6c5.4-2.7,12.4,2.3,11.4,8.3 c-0.2,6.1-8.1,9.6-12.8,5.9C881.9,1072.6,882.8,1063.8,888.5,1061.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M938.3,1065.3c18.2-2.8,37.4,7.1,45.9,23.4c8.4,15.4,6.6,35.5-4.5,49 c-10.6,13.7-29.6,20.2-46.3,15.7c-16.2-3.9-29.5-17.5-32.9-33.8c-3.8-16,2.3-33.7,14.9-44.2C921.9,1069.9,930,1066.4,938.3,1065.3z "/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M811.3,1077.3c6.8-1.7,14.1,3.7,14.2,10.7 c0.6,7.4-7.2,13.8-14.3,11.7c-6.3-1.3-10.4-8.6-8.3-14.6C804.1,1081.2,807.4,1078.1,811.3,1077.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M864.5,1080.7c7.8-2.5,16.7,4.1,16.5,12.3c0.4,8-7.9,14.9-15.7,12.8 c-6.9-1.3-11.7-8.8-9.9-15.6C856.3,1085.7,859.9,1081.8,864.5,1080.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M776.3,1082.1c5.5-2.7,12.5,2.6,11.3,8.7 c-0.5,6-8.2,9.2-12.9,5.6C769.6,1093,770.6,1084.3,776.3,1082.1z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1421.3,1082.3c9.6-3.1,20.9,2.5,24.4,11.9c3,7.4,1.2,16.4-4.6,21.9 c-5.5,5.6-14.5,7.4-21.7,4.4c-7.4-2.9-12.7-10.5-12.7-18.5C1406.5,1093.2,1412.8,1084.6,1421.3,1082.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M638.4,1083.5c9.8-3,21.1,3,24.4,12.7c2.6,7.1,0.7,15.7-4.7,21 c-5.8,6-15.6,7.8-23.1,4c-7.5-3.5-12.2-11.9-11.3-20.1C624.4,1092.8,630.5,1085.5,638.4,1083.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M458.3,1085.2c6.7-2.7,15,1.9,16.2,9 c1.9,7.5-4.9,15.4-12.5,14.7c-7.6,0.1-13.5-8.2-11.3-15.4C451.6,1089.8,454.6,1086.6,458.3,1085.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1588.4,1085.7c8.5-2.5,18.1,3.7,19.4,12.4c1.7,8.1-4.2,16.8-12.3,18.3 c-7.9,1.8-16.6-3.6-18.4-11.6C1574.8,1096.7,1580.3,1087.6,1588.4,1085.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1476.4,1087.5c12.7-3.3,27,4.2,31.5,16.5c3.1,7.9,2.3,17.3-2.4,24.5 c-4.4,7-12.2,11.7-20.5,12.4c-10.5,1.1-21.2-4.6-26.2-13.9c-5-8.8-4.4-20.4,1.5-28.7C1464.1,1093,1469.9,1089,1476.4,1087.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M562.3,1097.3c7.4-1.5,14.9,5.2,14.2,12.8 c-0.2,7.5-8.3,13.4-15.5,11.2c-7.1-1.7-11.2-10.3-8-16.9C554.8,1100.6,558.3,1097.9,562.3,1097.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1045.4,1107.8c20.3-3.1,41.5,1.2,59,11.8c13.7,8.2,25.2,20.2,32.7,34.4 c8.8,16.3,12.2,35.5,9.8,53.8c-2.5,18.7-11.1,36.5-24.2,50c-12.2,12.8-28.4,21.8-45.7,25.4c-16.9,3.7-35,2.2-51.1-4.1 c-18-7-33.6-20-43.6-36.4c-9.2-14.8-13.7-32.3-13.1-49.7c0.6-19.7,8-39,20.6-54C1003.7,1122.1,1023.9,1110.8,1045.4,1107.8z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1385.3,1110.3c9.7-1.7,19.5,6.9,19.1,16.8c0.2,9.2-8.3,17.2-17.4,16.6 c-9.4-0.1-17.5-9.3-16.1-18.6C1371.7,1117.6,1377.9,1111.1,1385.3,1110.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M794.5,1111.5c5.7-2.5,12.5,3.1,11,9.1 c-0.9,6.2-9.3,9-13.7,4.5C787.4,1121.4,788.9,1113.4,794.5,1111.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1542.4,1112.5c17.5-4.3,36.9,6.4,42.7,23.4c6,15.6-0.4,34.7-14.5,43.6 c-11,7.3-26,8-37.6,1.6c-12.9-6.7-20.9-21.6-19.3-36.1C1514.9,1129.5,1527.1,1115.7,1542.4,1112.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M828.4,1113.6c12.3-3.7,26.2,4.9,28.6,17.5c3,12.4-6.3,26.1-19,27.6 c-12.3,2.3-25.2-7.3-26.5-19.8C809.7,1127.8,817.5,1116.3,828.4,1113.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M875.5,1122.5c5.2-3.2,12.6,1.4,12.2,7.4 c0.1,6-7.3,10.1-12.4,6.8C869.9,1133.9,870,1125.2,875.5,1122.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1423.3,1137.4c17.8-3.8,37.1,7.9,42.1,25.3c5.6,16.7-2.9,36.4-18.7,43.9 c-15,7.9-35.1,3.5-45.4-10c-9.8-11.8-10.8-29.9-2.4-42.8C1404.3,1145.4,1413.3,1139.2,1423.3,1137.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1349.4,1138.5c6.1-2.7,14,0.6,16.3,6.9 c3,6.8-1.6,15.4-8.9,16.8c-7.1,1.8-14.8-3.9-15.1-11.2C1341.2,1145.7,1344.6,1140.4,1349.4,1138.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M719.3,1139.3c7.3-2.4,15.8,3.1,16.5,10.8 c1.3,7.8-5.9,15.5-13.7,14.7c-7.3-0.3-13.2-7.5-12-14.7C710.7,1145.1,714.5,1140.7,719.3,1139.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1484.4,1151.4c8-2.9,17.7,1.8,20.3,9.8c3.2,8-1.5,17.9-9.7,20.7 c-8.2,3.2-18.4-1.8-20.8-10.3C1471.3,1163.6,1476.3,1154,1484.4,1151.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1236.4,1156.5c7.2-1.7,15.1-0.3,21.2,4c6.5,4.3,10.7,11.8,11.4,19.5 c1,10.2-4.6,20.6-13.5,25.5c-9.5,5.4-22.3,4-30.4-3.4c-7.3-6.3-10.6-16.9-8.1-26.2C1219.1,1166.4,1226.9,1158.6,1236.4,1156.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M889.3,1159.3c7.9-2.6,16.8,4.3,16.5,12.5c0.2,7.2-6.6,13.6-13.8,12.9 c-7.3-0.2-13.3-7.4-12.1-14.6C880.6,1165.1,884.5,1160.7,889.3,1159.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1303.4,1159.4c7.2-2.8,15.5,3.9,14.5,11.5 c-0.4,8.2-11.1,13.1-17.5,7.9C1293.1,1174,1295.1,1161.7,1303.4,1159.4z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M854.4,1162.4c5.8-2.8,12.9,3.1,11.2,9.3 c-1,5.7-8.6,8.5-13.1,4.7C847.6,1172.9,848.8,1164.5,854.4,1162.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1178.4,1169.6c6.9-1.5,14.4,0.6,19.5,5.6c6.1,5.7,8.4,15.2,5.4,23.1 c-3,8.7-12.1,14.7-21.3,14.2c-10.8-0.2-20.5-9.6-20.8-20.5C1160.4,1181.6,1168.2,1171.5,1178.4,1169.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1367.4,1173.6c9.9-2.2,20.2,6.3,19.9,16.4c0.4,9.6-8.8,17.9-18.3,16.8 c-9.5-0.6-17-10.3-15-19.7C1355.1,1180.4,1360.7,1174.8,1367.4,1173.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M929.3,1182.3c7.7-2.8,16.8,3.5,16.9,11.7 c0.6,7.3-5.9,14.1-13.2,13.7c-6.8,0-12.8-6-12.7-12.7C920.1,1189.3,924,1184,929.3,1182.3z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1509.5,1183.5c5.2-2.8,12.4-0.1,14.5,5.4 c2.4,5.3-0.5,12.1-6,14.1c-5.1,2.1-11.4-0.5-13.6-5.5C1502,1192.4,1504.4,1185.8,1509.5,1183.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1302.5,1191.7c18.7-3.6,38.8,6.7,47,23.8c8.2,15.8,5.3,36.3-6.7,49.3 c-12.2,13.9-33.6,18.5-50.4,10.9c-17.2-7.2-28.4-26.1-26.3-44.7C1267.7,1211.7,1283.4,1194.7,1302.5,1191.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1541.4,1195.5c8.5-3,18.8,2.7,20.7,11.6c2.7,9.5-5.3,20-15.1,19.9 c-8.5,0.6-16.3-6.6-16.7-15C1529.7,1204.8,1534.5,1197.7,1541.4,1195.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M895.4,1198.3c5.2-2.9,12.3,1.7,11.8,7.6 c0.1,6.5-8.6,10.5-13.4,6.1C889.3,1208.6,890.2,1200.7,895.4,1198.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1473.3,1205.2c16.2-2.9,33.5,2.8,44.9,14.6c13.4,13.4,18.2,34.6,11.8,52.4 c-5.8,17.1-21.3,30.5-39.2,33.5c-17.9,3.4-37.2-3.8-48.6-17.9c-11.6-14-14.8-34.4-7.8-51.2 C1440.8,1220.2,1456.1,1207.9,1473.3,1205.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1388.4,1214.5c9.9-1.6,20.4,2.6,26.7,10.4c8.3,10.1,8.3,25.9-0.2,35.9 c-8.3,10.5-24.2,13.6-35.8,7c-10.7-5.6-16.9-18.5-14.4-30.4C1366.7,1225.8,1376.7,1216.2,1388.4,1214.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M949.5,1215.5c5.8-2,12.2,4.2,10.2,10.1 c-1.4,5.9-9.7,8.1-13.8,3.5C941.5,1225.1,943.7,1216.9,949.5,1215.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1193.4,1225.5c16.9-3.4,35,0.9,48.7,11.4c12.9,9.7,21.6,24.8,23.6,40.9 c2.6,18.6-4.3,38.1-17.6,51.2c-12,12-29.1,18.5-46,17.6c-18-0.8-35.3-10-46-24.5c-11.5-15.1-15.2-35.7-9.7-53.8 C1152.4,1246.7,1171.3,1229.4,1193.4,1225.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M795.3,1235.1c11.3-3.5,24.3,5.2,25.4,17c1.6,10.5-6.5,21.1-17,22.4 c-10.2,1.8-20.8-5.5-22.8-15.6C778.4,1248.8,785.3,1237.6,795.3,1235.1z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M477.4,1242.6c9.5-2.1,19.8,4.9,21.4,14.5c2.4,10.4-6.2,21.3-16.8,21.7 c-9.2,0.8-18.2-6.5-19.2-15.7C461.2,1253.7,468.1,1244.1,477.4,1242.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M622.3,1249.4c8.6-2.5,18.4,2.3,21.6,10.6c2.8,6.4,1.3,14.4-3.5,19.4 c-4.7,5.1-12.4,7.1-18.9,4.9c-7.1-2.1-12.4-9-12.7-16.5C608.3,1259.6,614.2,1251.4,622.3,1249.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M943.4,1254.6c19.3-3,39.2,11,43.1,30.1c4.5,18-5.9,38.1-23.1,44.9 c-14.9,6.4-33.4,2.3-44.1-9.9c-11.7-12.5-13.4-32.9-4-47.2C921.5,1262.7,932,1256,943.4,1254.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1407.4,1279.6c11-3.7,23.8,4,25.7,15.4c2.4,10.7-5.4,22.1-16.2,23.8 c-10.8,2.3-22.4-5.9-23.7-16.9C1391.6,1292.3,1398,1282.2,1407.4,1279.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1046.4,1297.5c6-1.3,12.5,3.4,13,9.5 c1,6.5-4.9,12.8-11.5,12.3c-6.2-0.1-11.3-6.2-10.4-12.3C1038,1302.3,1041.8,1298.3,1046.4,1297.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1102.4,1298.5c16.9-2.9,34.5,9.1,38.1,25.9c4.3,16.4-5.9,34.8-22.1,39.9 c-14.7,5.4-32.4-1.1-40.2-14.5c-8.4-13.3-5.7-32.2,6-42.6C1089.2,1302.6,1095.6,1299.5,1102.4,1298.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1316.4,1299.8c17-2.8,34.8-0.7,50.5,6.3c16.7,7.3,31.1,19.9,40.5,35.5 c10.6,17.3,14.9,38.3,12.1,58.4c-2.7,19.4-12,37.9-26,51.6c-11.7,11.5-26.6,19.6-42.7,23.2c-18.6,4.3-38.6,2.4-56-5.5 c-14.5-6.4-27.2-16.8-36.4-29.7c-12.1-16.8-18-38-16.3-58.6c1.2-17.2,7.7-33.9,18.2-47.5 C1273.9,1315.6,1294.4,1303.3,1316.4,1299.8z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M877.4,1303.6c8.8-3,19.1,3.3,20.6,12.5c2,8.9-5,18.3-14,19.2 c-8.6,1.3-17.4-5.6-18-14.3C864.9,1313.4,870.1,1305.6,877.4,1303.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1463.3,1315.3c9.6-2.2,20.1,3.8,23.1,13.1c2.6,7.2,0.7,15.8-4.9,21.1 c-5.9,5.9-15.5,7.5-22.9,3.8c-7.6-3.5-12.4-12-11.4-20.4C1448,1324.4,1454.9,1316.9,1463.3,1315.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1003.3,1328.2c17.3-2.8,35.5,2.3,48.9,13.6c12,10,19.9,24.7,21.5,40.2 c2.2,18.2-4.7,37.1-17.7,50c-11.5,11.5-27.8,18.1-44,17.8c-16.8-0.2-33.3-7.7-44.5-20.2c-14.3-15.6-19.5-39-13-59.2 C961,1348.6,980.8,1331.5,1003.3,1328.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M827.4,1333.5c14.6-3.9,31.2,3.5,38.1,16.9c5,9.2,5.4,20.7,1,30.2 c-4.7,10.5-15.1,18.2-26.5,19.6c-15.8,2.4-32.3-8-36.8-23.3c-4.5-13.2,0.4-28.8,11.5-37.3C818.4,1336.8,822.8,1334.6,827.4,1333.5z "/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M906.3,1342.3c12.5-3,26.3,4,31.6,15.7c5.2,10.7,2.5,24.6-6.3,32.6 c-8.7,8.4-22.9,10.1-33.3,4c-9-5-14.8-15.3-14.3-25.7C884.2,1356.4,894,1344.8,906.3,1342.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1176.4,1361.5c18.2-4.2,38.3,4.1,48.3,19.9c10.1,15,9.9,36-0.4,50.9 c-9.9,15.1-29.3,23.1-47,19.4c-17.2-3.2-31.7-16.9-35.8-33.9c-3.9-15.1,0.5-31.9,11.3-43.1 C1159,1368.1,1167.4,1363.4,1176.4,1361.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1443.4,1367.4c7.2-2.9,15.6,4,14.1,11.7 c-0.8,7.8-11.3,11.9-17.2,6.7C1433.8,1381,1435.7,1369.7,1443.4,1367.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M695.4,1373.5c15.9-3.3,32.9,8.5,35.4,24.5c3.3,15.3-7.3,31.7-22.5,35.2 c-14.7,4.2-31.5-4.8-36.4-19.3c-5-13.2,0.7-29.2,12.8-36.4C687.9,1375.6,691.6,1374.2,695.4,1373.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1100.4,1375.8c6.1-1.6,12.9,0,17.9,3.9c6.8,5.3,9.5,15.1,6.5,23.2 c-3.2,9.1-13.3,15.1-22.8,13.3c-9.3-1.4-17-9.8-17.3-19.2C1083.9,1387.3,1091,1377.9,1100.4,1375.8z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M750.3,1382.2c5.9-2.5,13.4,1.5,14.5,7.9 c1.6,6.2-3.5,12.9-9.9,13.1c-5.4,0.5-10.8-3.8-11.4-9.2C742.7,1389.1,745.7,1383.9,750.3,1382.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M782.3,1407.4c14.9-3.8,31.5,6.2,35,21.2c4.1,14-4.2,30-17.8,34.9 c-12.4,5.1-27.8,0.2-35.1-11c-7.7-11-6.3-27.2,3.2-36.8C771.6,1411.6,776.8,1408.6,782.3,1407.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M864.4,1408.5c12.3-4.1,26.6,4.1,29.4,16.7c3.2,11.5-4.1,24.5-15.5,28 c-9.1,3.1-19.9-0.2-25.7-7.9c-5.4-6.8-6.5-16.6-2.7-24.4C852.7,1414.9,858.1,1410.4,864.4,1408.5z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M374.4,1411.7c14.4-3.6,30.1,7.4,31.4,22.2c2.2,14.2-9.5,28.3-23.8,29 c-13.4,1.4-26.6-9.4-27.8-22.8C352.5,1427.2,361.8,1414.2,374.4,1411.7z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M533.3,1412.3c6.4-2.2,13.7,3,13.9,9.7 c0.6,6.2-5.1,12-11.3,11.6c-5.2-0.1-9.9-4.4-10.4-9.6C524.9,1418.9,528.4,1413.7,533.3,1412.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M464.4,1415.7c18.4-3.8,38.5,6.2,46.8,23.1c8.6,16.4,5.1,38.2-8.5,50.9 c-13.1,13.3-35.1,16.1-51.3,7c-16-8.5-25.3-27.7-22-45.6C432.2,1433.5,446.8,1418.6,464.4,1415.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M927.5,1416.7c6.8-1.2,14.1,1,19,5.9c6.3,6,8.5,16,5.1,24.1 c-3.6,9.1-13.8,15.1-23.5,13.5c-10.3-1.3-18.7-10.7-18.8-21C908.6,1428.4,916.9,1418.2,927.5,1416.7z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M128.4,1421.4c6.4-2,13.7,0.1,18.3,4.9c5.3,5.3,6.6,14,3.3,20.6 c-3.4,7.3-12,11.6-19.9,10c-8.4-1.5-15-9.4-14.8-17.9C115.1,1431.1,120.8,1423.6,128.4,1421.4z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M574.4,1421.6c6.4-1.9,13.6-0.9,19.2,2.8c6,3.8,10.1,10.5,10.7,17.6 c0.8,7.8-2.7,15.7-8.8,20.5c-6.4,5.1-15.6,6.5-23.2,3.3c-8.7-3.4-14.8-12.4-14.7-21.8C557.4,1433.9,564.7,1424.3,574.4,1421.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M641.4,1423.5c7.7-2.6,16.5,3.4,17.1,11.4c1,7.6-5.7,15.1-13.4,14.8 c-7.9,0.2-14.7-7.8-13.1-15.6C632.8,1429.2,636.6,1424.9,641.4,1423.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M736.5,1426.6c5.5-2.2,12.5,1,14.2,6.8 c2.1,5.7-1.8,12.6-7.7,13.9c-5.4,1.5-11.6-2-13-7.4C728.1,1434.6,731.3,1428.4,736.5,1426.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1108.4,1428.5c10.7-3.9,23.5,2.9,26.4,13.8c3.4,10.5-3.4,22.8-14,25.7 c-6.7,2-14.3,0.4-19.5-4.3c-5.5-4.7-8.1-12.4-6.7-19.5C1095.9,1437.1,1101.4,1430.8,1108.4,1428.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M262.4,1432.4c7-3.2,15.9,1.4,17.5,8.8 c1.9,6.6-2.5,14.1-9.1,15.7c-6.6,2-14.2-2.3-16-9C253,1441.8,256.4,1434.7,262.4,1432.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M675.3,1441.2c6-2.6,13.6,1.4,14.7,7.8 c1.5,5.9-3.1,12.3-9.2,13c-6,1-12.1-4-12.3-10.1C668.2,1447.4,671.2,1442.9,675.3,1441.2z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M321.3,1452.2c5.5-2.7,12.4,2.8,11.2,8.8 c-0.6,5.8-8.2,8.9-12.8,5.4C314.5,1463.1,315.5,1454.2,321.3,1452.2z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M531.4,1453.3c5.6-2.4,12.8,1,14.4,6.9 c2.1,6.1-2.4,13.2-8.9,14c-6.1,1.1-12.2-4-12.4-10.2C524.2,1459.4,527.2,1455,531.4,1453.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M709.4,1453.6c12.7-3.8,27.2,5.4,29.1,18.5c2.6,12.5-6.9,25.7-19.5,27.3 c-12.6,2.3-25.6-7.6-26.8-20.3C690.6,1467.8,698.5,1456.3,709.4,1453.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1050.4,1454.6c16.7-4.9,35.8,5.7,40.7,22.3c5.7,16.5-3.9,36.2-20.3,41.8 c-15.1,6-33.7-1-41.2-15.3c-7.5-13.2-4.6-31.1,6.8-41.2C1040.3,1458.6,1045.2,1455.9,1050.4,1454.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1228.5,1455.8c15.6-3.5,32.8,4.3,40.3,18.4c6.8,12,6.2,27.7-1.6,39 c-9.2,14.3-28.8,20.5-44.5,14.1c-14.6-5.4-24.8-20.7-24-36.3C1199.1,1474.3,1212,1458.9,1228.5,1455.8z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M975.4,1457.6c9.6-2.2,20.1,1.1,26.7,8.3c8.2,8.5,10,22.2,4.4,32.5 c-5.6,11.1-19.1,17.3-31.1,14.4c-12.7-2.6-22.5-14.8-22.2-27.8C953,1472.1,962.8,1460.1,975.4,1457.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M625.4,1461.6c8.1-1.5,16.8-0.1,23.9,4.1c10.6,6,17.5,18.1,17.2,30.3 c0.2,16.3-12.8,31.3-28.8,33.7c-16.2,3.1-33.5-7.3-38.5-22.9c-5.3-14.4,0.8-31.7,13.6-40C616.6,1464.3,620.9,1462.5,625.4,1461.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M896.4,1461.6c9.2-2.2,19.4,3.6,22.3,12.6c2.5,7,0.4,15.3-5.1,20.3 c-5.6,5.3-14.4,6.7-21.3,3.3c-6.7-3.1-11.3-10.4-11-17.8C881.2,1471.3,887.9,1463.3,896.4,1461.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M831.3,1465.3c7.7-2.5,16.5,3.6,17,11.7 c0.9,7.5-5.7,14.8-13.3,14.6c-6.9,0.2-13.2-5.7-13.4-12.6C821,1472.9,825.4,1466.9,831.3,1465.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M1147.3,1468.2c8.8-1.6,18.2,1.7,24,8.4c5.8,6.5,8,16,5.6,24.4 c-2.5,9-10.3,16.4-19.5,18.3c-9.2,2.1-19.2-1.3-25.3-8.4c-5.1-5.9-7.4-14.2-5.9-21.8C1128.1,1478.7,1136.9,1469.9,1147.3,1468.2z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M414.4,1474.4c6.3-1.9,12.7,5.1,10.3,11.2 c-1.7,6.1-10.5,8-14.6,3.2C405.5,1484.4,408.1,1475.6,414.4,1474.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M255.4,1476.5c5.6-2.1,12,3.5,10.5,9.3 c-0.9,6-9,8.7-13.4,4.5C247.9,1486.6,249.6,1478.1,255.4,1476.5z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M291.4,1478.4c5.5-2.7,12.4,2.5,11.4,8.5 c-0.5,6-8.4,9.3-13,5.5C284.8,1488.9,285.7,1480.4,291.4,1478.4z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M561.5,1479.8c7.7-2.7,16.7,3.3,17.3,11.4 c1.1,8.1-6.6,15.7-14.7,14.7c-7.5-0.6-13.3-8.3-11.8-15.6C553.1,1485.4,556.8,1481.2,561.5,1479.8z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M1297.4,1488.5c7.9-2.2,15.7,6.3,13,14 c-2.1,8-13.8,10.4-18.9,3.9C1286,1500.6,1289.6,1489.9,1297.4,1488.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M332.5,1489.6c7.2-3,16.1,1.9,17.4,9.6 c2,8.1-5.5,16.4-13.7,15.5c-7.2-0.3-13-7.5-11.9-14.5C324.7,1495.4,328.1,1491.3,332.5,1489.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M525.4,1502.6c11-1.9,22.7,5.3,25.9,16c2.7,8.2,0.3,17.8-5.9,23.8 c-6.9,7-18.4,8.8-27.1,4.2c-8.6-4.3-13.9-14.1-12.6-23.6C506.8,1512.8,515.2,1504,525.4,1502.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M408.3,1503.2c12-2.5,25,4.9,29,16.4c3.4,8.9,1.4,19.6-5.1,26.6 c-6.4,7.1-16.9,10.2-26.1,7.6c-11.3-2.9-19.7-14.1-19-25.8C387.2,1516.1,396.6,1505.2,408.3,1503.2z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M256.4,1506.5c7.9-2.6,16.8,4.1,16.6,12.5 c0.3,8-8,14.7-15.8,12.7c-7.7-1.4-12.5-10.6-9.2-17.7C249.5,1510.4,252.7,1507.5,256.4,1506.5z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M474.5,1513.6c6.3-1.5,13.2,3.8,13,10.4 c0.4,6.8-6.6,12.5-13.2,10.8c-6.3-1.2-10.2-8.5-7.8-14.4C467.8,1517,470.9,1514.3,474.5,1513.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M356.5,1516.6c7.2-2.9,15.9,2.8,16.3,10.5c0.8,6.8-5,13.3-11.8,13.3 c-6.5,0.4-12.6-5.1-12.7-11.6C347.9,1523.6,351.4,1518.3,356.5,1516.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M308.4,1524.3c5.8-2.6,12.7,3.5,10.9,9.6 c-1.2,6-9.7,8.2-13.8,3.7C301.4,1533.7,303.1,1526.1,308.4,1524.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M133.4,1533.6c11.3-2.6,22.9,7.8,21.6,19.3c-0.5,10.5-11.3,18.8-21.6,16.5 c-10.6-1.7-17.8-13.9-13.8-24C121.6,1539.4,127.1,1534.7,133.4,1533.6z"/>
<path fill="#010101" stroke="#010101" stroke-width="9.375000e-002" d="M452.4,1541.3c6-1.7,12.2,4.5,10.4,10.4 c-1.2,6.5-10.4,9-14.7,4.1C443.4,1551.4,446,1542.5,452.4,1541.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M327.4,1544.4c13.3-4,28.6,4.7,31.9,18.2c4,13.2-4.6,28.3-17.8,31.8 c-13.2,4.2-28.7-4.3-32.2-17.8C305.1,1563.3,313.8,1547.8,327.4,1544.4z"/>
<path fill="#020202" stroke="#020202" stroke-width="9.375000e-002" d="M388.5,1559.6c6.3-1.8,12.6,5,10.3,11.2 c-1.7,6.2-10.5,8.1-14.7,3.2C379.5,1569.4,382.2,1560.7,388.5,1559.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M220.4,1596.3c6.9-2.6,15.1,2.4,16.1,9.7c1.2,6.6-3.9,13.4-10.5,14.1 c-6.7,1.1-13.6-4.4-13.8-11.2C211.5,1603.5,215.1,1598,220.4,1596.3z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M88.3,1645.2c10.7-2.5,22,6.8,21.7,17.8c0.4,10.1-8.9,19.1-19,18.4 c-9.1-0.2-17.2-8.2-17.5-17.4C72.9,1655.2,79.6,1646.7,88.3,1645.2z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M271.4,1679.6c12.3-3.7,26.2,5,28.5,17.5c2.8,11.5-5,24.2-16.5,27 c-8.3,2.3-17.8-0.5-23.4-7.1c-5.6-6.2-7.3-15.5-4.3-23.3C258.3,1686.8,264.3,1681.4,271.4,1679.6z"/>
<path stroke="#000000" stroke-width="9.375000e-002" d="M139.4,1703.6c8.2-2.3,17.4,0.6,23,7c5.4,6,7.3,14.9,4.7,22.6 c-2.9,8.9-11.7,15.7-21.2,15.7c-8.8,0.5-17.4-4.7-21.3-12.6c-3.4-6.6-3.3-14.9,0.3-21.4C127.9,1709.4,133.3,1705.1,139.4,1703.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 47 KiB

24
requirements.txt Normal file
View File

@ -0,0 +1,24 @@
appdirs==1.4.4
audioread==2.1.9
certifi==2022.6.15
cffi==1.15.1
charset-normalizer==2.1.0
decorator==5.1.1
idna==3.3
joblib==1.1.0
librosa==0.9.2
llvmlite==0.39.0
numba==0.56.0
numpy==1.22.4
packaging==21.3
pooch==1.6.0
pycparser==2.21
pyparsing==3.0.9
requests==2.28.1
resampy==0.3.1
scikit-learn==1.1.2
scipy==1.9.0
SoundFile==0.10.3.post1
tflite-runtime==2.9.1
threadpoolctl==3.1.0
urllib3==1.26.11

24
utils/purge.sh Executable file
View File

@ -0,0 +1,24 @@
#! /usr/bin/env bash
# Load config file
config_filepath="./config/analyzer.conf"
if [ -f "$config_filepath" ]; then
source "$config_filepath"
else
echo "Config file not found: $config_filepath"
exit 1
fi
# Remove all files from the temporary record directory
function clean_record_dir()
{
rm -rf "$CHUNK_FOLDER/in/*.wav"
}
function remove_empty_records()
{
find $CHUNK_FOLDER/in -maxdepth 1 -name '*wav' -type f -size 0 -delete
}
remove_empty_records