Wiki source for ReconnaissanceVocaleEnregistrement


Show raw source

ReconnaissanceVocale > enregistrement

Pour enregistrer sa voix, rien de tel que :
~- [[http://fr.wikipedia.org/wiki/Audacity audacity]] : en mode graphique, le plus sympathique
~- arecord ou sox : mode console, le plus efficace et se scriptant bien
~- sinon [[http://fr.wikipedia.org/wiki/Praat praat]] (pas forcément packagé pour sa distribution) est le plus élaboré, voir ReconnaissanceVocalePraat
~- je parle aussi de aplay, qaRecord, amixer, aumix-text, [[http://en.wikipedia.org/wiki/CMU_Sphinx cmusphinx4]] (à la base c'est pour de la ReconnaissanceVocale :D), bref un peu tout ce que j'ai essayé
~- alsamixer, alsamixer-gui peuvent être utiles aussi

===Utilisation de microphone pour enregistrer sa voix===
Dommage, le microphone associé à la webcam sur [[http://wiki.eagle-usb.org/wakka.php?wiki=InstallLaptopHpDv6162 mon portable]] ne semble pas reconnu :/ (ah bin si en fait ça a l'air de fonctionner avec qaRecord... il n'apparaissait pas avec lspci ni lspcidrake, comme quoi avoir plusieurs outils dont un avec une représentation graphique permet de voir le niveau sonore).
Je n'ai pas de micro (ou de casque+micro), donc pas de possibilité de le brancher sur la prise jack à l'avant du clavier (de toute façon la prise pour des écouteurs ne marche déjà pas, donc j'ai des doutes).

Heureusement, il me reste une ""logitech QuickCam Pro 4000"" qui a un micro intégré et qui est reconnu, au branchement il apparaît dans ##/var/log/messages## :
%%usbcore: registered new driver snd-usb-audio%%
et il est listé par les différents outils, cf. ci-dessous

Bon finalement, trop difficile de sélectionner le micro de la webcam en utilisant la conf' ALSA (sans doute pas super bien supportée par les différents logiciels...), donc comme le micro intégré au portable a l'air de fonctionner correctement, c'est ce que j'utilise. Il me faudrait des écouteurs audios qui fonctionnent (pour éviter l'effet larsen par exemple).

Voir § Réussite de l'enregistrement ci-dessous, utiliser gnome-volume-manager pour activer le micro (muet par défaut au profit de Line-1 va savoir pourquoi...), cela marche tout de suite mieux. Grâce à cela, arecord, audacity, ""AudioTool"", ... fonctionnent .
Un petit script pour vérifier que cela fonctionne (sinon activer le micro... ou diagnostiquer quel programme le bloque)
%%#!/bin/bash
echo "parler pendant 2s"
arecord -d 2 -f cd -t wav test_son1.wav
aplay test_son1.wav
echo "vous avez entendu quelquechose ou pas ?"%%

===Script de diagnostic du microphone et des haut-parleurs===
**Mise à jour** : il y a un outil ##speaker-test## qui existe, l'installer au besoin : cela joue en permanence en son, ce qui permet de vérifier les branchements déjà, puis au besoin les différents modules (des fichiers .wav sont directement intégrés, ce qui est plus simple que de se baser sur l'installation de supertux).
Vous pouvez aussi utiliser [[http://viewvc.tuxfamily.org/svn_cooker_cookerspot/trunk/diagnostics/diag_sound.sh?view=markup ce script de diagnostic]] pour afficher plus d'informations. Si nécessaire, en tant que root par (su -) vous pouvez arrêter/relancer le système de gestion du son
~- ##service nasd stop## # vous n'avez pas forcément ce serveur de son d'installé
~- ##service alsa restart## # au besoin killer les process bloquant l'arrêt
~- ##service nasd start##
Vous pouvez avoir les erreurs suivantes :
~-//""Arrêt du pilote de son ALSA (version 1.0.12) : non. (Le son est utilisé par le(s) processus 15616)) [ÉCHEC ]""// => kill 151616 (il peut s'agir de l'applet de gestion du son, il vous est proposé de le redémarrer automatiquement, refaite un service alsa restart avant de valider sa relance)
~-//""Arrêt du pilote de son ALSA (version 1.0.12) : FATAL: Module snd_mixer_oss is in use.""// => d'où le besoin d'arrêter le système de son en réseau (qui utilise oss)
autres tests possibles et quelques explications :
~-le plus pénible est qu'il est difficile d'avoir un statut __clair__ pour diagnostiquer automatiquement si cela fonctionne (ou pas), d'où l'utilisation de arecord et aplay qui réclame une intervention humaine
~-cat /proc/asound/cards ; lsof /dev/snd/* ; ls -l /dev|grep dsp # dsp dsp0 dsp1 adsp dspW (selon le type de cartes disponibles, télé par exemple bt878, modem, ...)
~- /dev/dsp uses 8 bit unsigned encoding while /dev/dspW uses 16 bit signed little endian (Intel) encoding and /dev/audio uses logarithmic mu-Law encoding.
~- https://linuxfr.org/forums/15/22153.html utilisation de ##alsamixer ; alsactl store## et option "Restaurer les réglages au démarrage" de kmix

**edit** : l'utilisation de la webcam est possible en OSS (avec ALSA faudra que je trouve comment :/) et le son est d'un niveau bien plus élevé (pas besoin de retraitement derrière) que le microphone intégré. Il suffit d'utiliser /dev/dsp1 au lieu de /dev/dsp, avec adintool, définir ##export AUDIODEV=/dev/dsp1## avant de lancer la commande build-bin/adintool -48 -lv 25000 -nosegment -in mic -out file -filename essai6_julius_phone
~- regarder cat /proc/asound/cards

===Outils pour l'enregistrement===
Bon, ce qui est bizarre c'est que autant gnome-alsamixer voit bien qu'il y a un périphérique usb permettant d'enregistrer, gnome-sound-recorder n'a pas l'air de savoir le sélectionner :/ donc j'ai regardé avec d'autres outils :
~- **arecord** devrait permettre d'enregistrer à partir du microphone
~~- ##arecord -l## # pour lister les cartes sons et les périphériques audio numériques
%%**** List of CAPTURE Hardware Devices ****
card 0: Intel [HDA Intel], device 0: HDA Generic [HDA Generic]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: U0x46d0x8b2 [USB Device 0x46d:0x8b2], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0%%
~~- ##arecord -L## # pour lister les noms de périphériques
%%default:CARD=Intel
HDA Intel, HDA Generic
Default Audio Device
front:CARD=Intel,DEV=0
HDA Intel, HDA Generic
Front speakers
surround40:CARD=Intel,DEV=0
HDA Intel, HDA Generic
4.0 Surround output to Front and Rear speakers
surround41:CARD=Intel,DEV=0
HDA Intel, HDA Generic
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Intel,DEV=0
HDA Intel, HDA Generic
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Intel,DEV=0
HDA Intel, HDA Generic
5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Intel,DEV=0
HDA Intel, HDA Generic
7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Intel,DEV=0
HDA Intel
IEC958 (S/PDIF) Digital Audio Output
null
Discard all samples (playback) or generate zero samples (capture)
%%
~- pour enregistrer :
~~- pour 10 secondes en qualité CD et format wav : ##arecord -d 10 -f cd -t wav foobar.wav## (mais pourquoi le man parle-t-il de définir un .asoundrc ?! revoir l'intérêt de définir un device par utilisateur).
~- **amixer** pour regarder les niveaux sonores
%%$ amixer -c 1 # pour la carte 1 (correspondant à l'usb en l'occurence)
Simple mixer control 'Mic',0
Capabilities: cvolume cswitch cswitch-joined
Capture channels: Mono
Limits: Capture 0 - 3
Mono: Capture 2 [67%] [50.00dB] [on]%%
~- cmusphinx4 inclut [[http://cmusphinx.sourceforge.net/sphinx4/javadoc/edu/cmu/sphinx/tools/audio/doc-files/HowToRunAudioTool.html AudioTool]] : ##""java -jar bin/AudioTool.jar -dumpMixers""## (une VerificationInstallJava n'est pas de trop entre la version java5 demandée et la conf' pas forcément correcte des variables d'environnement) :
%%Mixer[0]: "Intel [plughw:0,0]"
Description: Direct Audio Device: HDA Intel, HDA Generic, HDA Generic
SourceLineInfo (e.g., speakers):
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, big-endian
TargetLineInfo (e.g., microphones):
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, big-endian
Mixer[1]: "Java Sound Audio Engine"
Description: Software mixer and synthesizer
SourceLineInfo (e.g., speakers):
PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
TargetLineInfo (e.g., microphones):
none
Mixer[2]: "Port Intel [hw:0]"
Description: HDA Intel, Generic 14f1 ID 5045
SourceLineInfo (e.g., speakers):
Line source port
Mic source port
TargetLineInfo (e.g., microphones):
Master target port%%

===outils testés===
Comparer à http://www.01audio-video.com/freeware_editeur_audio.htm
~- bon en fait qaRecord affiche correctement des niveaux d'enregistrements du microphone, mais à l'écoute, cela semble passer en accéléré :/
~~-je n'ai pas dû trouver le bon taux d'échantillonnage (44100 ?) ou le format d'échantillonnage (16 bits ou 32 bits ?)
~- la qualité de arecord semble bien meilleure
~~-mais l'option d'enregistrer pour une durée définie à l'avance est un peu moyenne, il faudrait quelque chose de plus interactif
~~- a priori, il suffit de lancer ##arecord## et le killer pour arrêter l'enregistrement
~- je n'avais pas réussi à configurer audacity du premier coup
~~- lui aussi a une option pour faire apparaître le niveau du micro et quand on lance l'enregistrement, la courbe s'affiche directement
~~-ce qui est bizarre c'est qu'on dirait qu'il échantillonne au format 32 bits et à 96000 kHz (ce qui me semble un peu élevé), cela dépend peut-être de la qualité du micro ?
~~- l'option pour le micro est ALSA: HDA Intel : HDA Generic (hw:0,0) et c'est avec 2 canaux (stéréo) - en fait c'est la même pour la lecture - sinon j'avais une erreur au déclenchement de l'enregistrement
~- gnusound
~~- problème de paramétrage de ALSA, à vérifier
~- sweep
~~-""GThread-ERROR **: GThread system may only be initialized once.""
~-mhwaveedit ne se lance pas, ne rend pas la main, pas de message d'erreur, le strace se termine par connect(13, {sa_family=AF_INET, sin_port=htons(16001), sin_addr=inet_addr("127.0.0.1")}, 16

===Réussite de l'enregistrement===
La configuration du micro doit être correcte dans le contrôleur de volume : sélectionner Mic et non Line-in (qui doit être muet). ""<a href="documents/images/screenshot_controleur_volume.png"><img class="right" style="width:384px;height:236px" alt="Contrôleur de volume" title="Contrôleur de volume Mic sélectionné " src="documents/images/screenshot_controleur_volume.png" /></a>""
la commande ##amixer## montre :
##Simple mixer control 'Line',0
Capabilities: cvolume cswitch cswitch-joined cswitch-exclusive
Capture exclusive group: 0
Capture channels: Front Left - Front Right
Limits: Capture 0 - 23
Front Left: Capture 18 [78%] [27.00dB] **[off]**
Front Right: Capture 18 [78%] [27.00dB] **[off]**
Simple mixer control 'Mic',0
Capabilities: cvolume cswitch cswitch-joined cswitch-exclusive
Capture exclusive group: 0
Capture channels: Front Left - Front Right
Limits: Capture 0 - 23
Front Left: Capture 18 [78%] [27.00dB] **[on]**
Front Right: Capture 18 [78%] [27.00dB] **[on]**##
et cela donne comme résultat : ""<a href="documents/images/Capture-AudioTool.png"><img class="left" style="width:350px; height:300px" alt="AudioTool" title="Enregistrement AudioTool" src="documents/images/Capture-AudioTool.png" /></a>""

Il est possible de configurer le périphérique utilisé avec l'option -Dmicrophone[selectMixer]=0 (pour la carte 0, qui correspond à l'option par défaut) et lancer la commande ##""java -Dmicrophone[selectMixer]=0 -jar bin/AudioTool.jar ""## (remplacer le 0 par 1 ou 2 ou plus selon la carte que vous souhaitez sélectionner).

Pour tester la reconnaissance sur une phrase simple, voir les exemples fournis http://cmusphinx.sourceforge.net/sphinx4/index.html#demos
exécuter ##""java -jar bin/HelloWorld.jar"" ## et parler, en disant par exemple "hello rita".

La démo live http://cmusphinx.sourceforge.net/sphinx4/tests/live/README.html peut prendre beaucoup de mémoire (java quoi :/) la lancer par ##cd sphinx4/tests/live ; ant live## après l'avoir compilé par ##ant## (possibilité de modifier le build.xml pour allouer plus de mémoire si nécessaire : j'ai mis maxmemory="500m")




===Points à revoir ultérieurement===
~- Je n'ai pas trouvé pourquoi sur le portable j'ai parfois aumix-text -q qui donne
%%vol 91, 91
igain 96, 96%%
et d'autres fois
%%vol 79, 79
line 100, 100, P
mic 100, 100, R%%
va comprendre Charles
~- je n'ai pas trouvé comment faire fonctionner gnome-sound-recorder (du tout, avec la webcam ou pas), pourtant audacity et les autres sont tombés en marche :/ **edit** ah bah si finalement, c'est ballot, faut enregistrer dans un fichier avant de pouvoir lancer la lecture de ce qui a été enregistré (j'ai aussi modifié une clé dans gconf pour lancer sox)
~- le micro de la webcam ""Logitech QuickCam Pro 4000"" n'a pas l'air de vouloir être sélectionné (snd_usb_audio)
~- dans audacity il est possible de booster le son enregistré, comment voir les possibilités du microphone ? (le réglage de volume n'a pas l'air d'influer beaucoup). Voir si avec arecord il est possible d'avoir un indicateur de hauteur du volume d'enregistrement un peu comme avec audacity.
~- pourquoi ekiga ne reconnaît-il pas le microphone interne du portable ?
~- la ""Logitech QuickCam Pro 4000"" a tout de même une très bonne capacité de voir quasiment dans le noir (avec la Sonix intégrée au portable, ça apparaît beaucoup plus sombre).
~- à quoi peut bien servir ce service nasd qui utilise l'oss ?
~- utiliser sox : rec -c 2 essai_sox.aiff trim 0 10 # enregistrement de 10 secondes sur le canal 2
Je ne suis pas le seul à galérer un peu avec le son, quelques remarques pertinentes sur les configurations globales / par application sur :
~- http://www.murrayc.com/blog/permalink/2008/03/19/getting-my-microphone-to-work/ [en] Sound Preferences control panel, volume preferences from the panel applet, preferences window in the Volume Control (via the Edit menu), Application-Specific Sound Preferences (ekiga)

===Autres outils à regarder===
c'est plutôt connexe à la ReconnaissanceVocale, simplement parce que je suis tombé dessus en cherchant...
extace visual sound display/analysis program, with various fourier transforms of the audio data in real-time, 3D textured flying landscape, 16-128 channel graphic EQ, scope, and a 3D pointed flying landscape
synaesthesia representing sounds visually usual oscilliscope style program by combining an FFT and stereo positioning information to give a two dimensional display
fsv a file system visualizer in cyberspace. It lays out files and directories in three dimensions,
Ocrad is an OCR (Optical Character Recognition) program
dasher an information-efficient text-entry interface, driven by natural continuous pointing gestures, competitive text-entry system wherever a full-size keyboard cannot be used
XMerlin is a simple character recognition engine for X11-based Web pads and such devices where a regular keyboard is not an option
csound jcsound soundspace tritonus (java applications)
~-https://linuxfr.org/forums/41/22769.html utilisation de sox pour modifier le pitch directement du microphone


----
CategoryLangFr CategoryHobby
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki