alexylem / jarvis

Jarvis.sh is a simple configurable multi-lang assistant.
http://openjarvis.com
MIT License
805 stars 197 forks source link

Contrôler Spotify avec Jarvis - play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy #80

Open francoismartin opened 8 years ago

francoismartin commented 8 years ago

Bonjour,

Premièrement super boulot et merci de le partager.

J'aimerai intégrer spotify pour pouvoir lancer ma musique directement avec la voix. Imaginer une intégration avec mopidy comme a fait Jasper ou alors intégrer une librairie python pour spotify.

Jasper pour communiquer avec mopidy (qui est une surcouche de MPD), utilise un script python qui contrôle le MPD de ce point de vue, il n'y a rien besoin d'autre que d'installer mopidy sur le raspberry.

Comment je pourrais faire ça de la façon la plus rapide et facile possible ?

Ce que je souhaites avoir :

  1. Lancer une musique défini ou un artiste : ex joue coldplay
  2. commande classique joue / pause / stop / suivant / précèdent
  3. augmenter et baisser le volume.

J'ai vu que vous avez commencé a tester l'idée en intégrant des modules avec un flux audio RTL. Comment le lancez-vous et l'arrêtez-vous ?

Merci


EDIT :

J'ai réussi à installer mopidy très facilement ainsi que le configurer depuis la doc de jasper. J'arrive à lancer la musique et l'entendre depuis un client mpd mac.

Maintenant plus qu'à réussir à le commander via des commandes vocales. Je suppose que je ne peux pas reprendre le code de jarvis qui est un script python ou alors je dois fortement le modifier pour que je puisse interagir depuis jarvis.

Sinon, une autre astuce peut être plus facile est d'intégrer (ou se le créer à partir du code python jasper) un mpd client CLI, qui via des commandes ex :

Donc de reprendre le code de jasper et de le découper en ligne de commande, je vais me renseigner pour voir comment faire ça, si vous avez des idée je suis preneur. Si je ne dis pas de bêtise normalement, on pourrait executer de cette façon python mpd.py -play ..., non ?

alexylem commented 8 years ago

Bonjour à toi! As-tu lu la doc sur comment créer ses commandes? Après ca sera bien plus clair pour toi sur comment intégrer, voici un aperçu: Menu > Commands

*LECTURE DE (*)==python mpd.py -play "(1)" && say "Voilà"
*LECTURE DE LA PLAYLIST (*)==python mpd.py -playlist "(1)" && say "C'est parti"
*METS EN PAUSE*==<ta commande CLI ici>

Important (et raison de la fermeture du ticket): Pour rappel, la philosophie de Jarvis est de se focaliser sur l'interface vocale (et bientôt visuelle #56 ) et de rester minimaliste donc ne pas inclure par défaut de commandes ni d'intégration autre que les moteurs de reconnaissance et synthèse vocale. A vous de créer vos propres commandes. Si vous n'êtes pas à l'aise avec ce concept, vous pouvez toujours upvoter le ticket #52 pour l'implémentation d'un store (gratuit) de commandes que les utilisateurs de Jarvis partagerons avec la communauté.

francoismartin commented 8 years ago

Bonjour Alexandre,

Oui bien sûr j'ai bien lu tout ton wiki, je me base justement sur ça dans ma réflexion de comment je peux faire pour intéragir avec spotify et jarvis.

Je comprends ta philosophie, j'ai ouvert une issue dans le seul but d'avoir une aide de la part de la communauté pour m'aider a aller dans le bon chemin et ensuite le partager avec qui compte le voudra.

Merci

Car je suis un débutant en script et python du coup je ne savais pas comment je devais faire.

alexylem commented 8 years ago

Ok :-)

francoismartin commented 8 years ago

Bonjour,

J'ai plutôt bien avancé sur l'adaptation du code de Jasper pour que les commandes play/pause/next/... soient exécuté en cli car le code de base de Jasper et un Handle qui attend de recevoir la commande vocale pour executé ce que l'on souhaite, qui est différent dans jarvis car tout est dans jarvis_command

Voici le code que j'ai fait : mon MPD controller revisité (gist)

Les commandes enregistrées dans jarvis :

*LANCE*MUSIQUE==python script/mpdcontroller.py --play
*LANCE*PLAYLIST (*)==python script/mpdcontroller.py --playlist "(1)" && say "C'est parti"
*PAUSE*==python script/mpdcontroller.py --pause
*STOP*==python script/mpdcontroller.py --stop

Pour tester j'ai dit LANCE LA MUSIQUEla musique se lance et voici ce qu'il se passe :

jarvis: Bonjour
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
jarvis: Oui ?
Benjamin: perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "fr_FR.UTF-8",
    LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "fr_FR.UTF-8",
    LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "fr_FR.UTF-8",
    LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
?perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "fr_FR.UTF-8",
    LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "fr_FR.UTF-8",
    LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
lance la musique
DEBUG:root:Preparing to start music module
INFO:mpd:Calling MPD connect('localhost', 6600, timeout=None)
DEBUG:mpd:Calling MPD listplaylists()
DEBUG:mpd:Calling MPD clear()
DEBUG:mpd:Calling MPD load('electro swag',)
DEBUG:mpd:Calling MPD load('D\xc3\xa9couvertes de la semaine (by spotifydiscover)',)
DEBUG:mpd:Calling MPD load('Metalcore (by spotify_france)',)
DEBUG:mpd:Calling MPD load('Caf\xc3\xa9 | Croissant (by spotify_france)',)
DEBUG:mpd:Calling MPD playlist()
Please give me a moment, I'm loading your Spotify playlists.
DEBUG:root:Starting music mode
INFO:mpd:Calling MPD connect('localhost', 6600, timeout=None)
DEBUG:mpd:Calling MPD play()
INFO:mpd:Calling MPD connect('localhost', 6600, timeout=None)
DEBUG:mpd:Calling MPD status()
{'playlistlength': '131', 'playlist': '5', 'repeat': '0', 'consume': '0', 'random': '0', 'state': 'play', 'xfade': '0', 'volume': '100', 'single': '0', 'time': '0:0', 'elapsed': '0.000', 'bitrate': '0'}
DEBUG:mpd:Calling MPD status()
DEBUG:mpd:Calling MPD playlistinfo(0,)
Playing The Paris Swing Box by Parov Stelar
DEBUG:root:Exiting music mode
Benjamin: play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker
##perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "fr_FR.UTF-8",
    LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
?play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker

J'ai bien la première musique qui se lance mais après jarvis s'arrête et il est impossible de le relancer car Audio device hw:0 cannot be acquired...

pi@raspberrypi:~/jarvis $ ./jarvis.sh 
Checking for updates...[Up-to-date]
jarvis: Bonjour
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jackdmp 1.9.10
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2014 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
JACK server starting in realtime mode with priority 10
self-connect-mode is "Don't restrict self connect requests"
Failed to connect to session bus for device reservation Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Audio device hw:0 cannot be acquired...
Cannot initialize driver
JackServer::Open failed with -1
Failed to open server
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

[jack.c:252] error: Failed to open jack client: 0x11
[jack.c:58] warning: FIXME: One needs to wait or write some silence here to prevent the last bits of audio to vanish out of the ringbuffer.
tts_engines/google/main.sh: line 38:  1856 Segmentation fault      mpg123 -q $audio_file
jarvis: Waiting to hear 'jarvis'
Benjamin: play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker

Des idées de comment je peux résoudre ça ?

Merci


EDIT

Est-ce que l'une des solutions seraient de connecter jarvis au MPD de façon permanente, sans réinitialiser la connexion à chaque requête python script/script/mpdcontroller.py ... ?

Ou alors a chaque fois que jarvis a besoin de parler ou d'écouter la commande (après la reconaissance snowboy) que celui-ci coupe automatiquement (ou met en pause) la musique via par exemple python script/script/mpdcontroller.py --pause

alexylem commented 8 years ago

Salut @francoismartin j'ai l'impression que comme la musique sort sur les enceintes, Jarvis n'arrive pas à y accéder pour jouer les sons/synthèses vocales:

Benjamin: play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker

Je pense que ton idée de couper la musique pourrait marcher, il faudrait que tu utilises le hook d'entrée en mode commandes pour mettre Spotify en pause. Plus d'info ici: https://github.com/alexylem/jarvis/wiki/hooks

PS: Si tu veux avoir moins de log dans le display de Jarvis, tu peux faire:

*LANCE*MUSIQUE==python script/mpdcontroller.py --play >/dev/null
Smanar commented 8 years ago

Dsl, du hors sujet, mais c'est aussi un probleme pour moi. Ca ne choque personne ne ne pouvoir lancer 2 lecteurs en meme temps sur un raspberry ? Si mpg123 est en train de lire une musique impossible de pouvoir utiliser la sortie son. Pour moi c'est completement illogique, c'est a cause de portaudio ? Il faut utiliser une autre librairie audio ?

Me faites pas croire que sur Unix il est impossible de faire tourner 2 lecteurs en meme temps ?

francoismartin commented 8 years ago

@alexylem L'idée est là, je vais essayer ta méthode.

Mais le problème est que jarvis plante dès que j'ai lancé la commande play *LANCE*MUSIQUE==python script/mpdcontroller.py --play il n'attend pas de nouvelle commande.

Et autre question, si je veux dire des chose depuis mon script python je suis obligé de faire python ../jarvis.sh -s "MA PHRASE" si jarvis est déjà lancé ça risque de ne pas de le faire planter ?

Merci

@Smanar

Je penses qu'on doit avoir une solution pour régler se problème. Oui ça m'étonnerai fortement qu'on ne puisse pas streamer 2 son différent vers la même sortie. Je crois que c'est possible de créer des cartes virtuels sur alsa qui devrait résoudre notre problème.


EDIT

@alexylem J'ai installé le hook et il fonctionne mais le problème vient de la fin du timeout (d'attendre une nouvelle commande en mode conversation) je penses que le problème vient du fait que Jarvis veut lancer le son pour dire qu'il est sorti du mode conversation et c'est ça qui fait tout planter.

Donc a part réussir a streamer deux sons en même temps ou de créer une sorte de priorité ... je ne vois pas comment je pourrais régler ce problème.

pi@raspberrypi:~/jarvis $ sudo fuser -fv /dev/snd/* /dev/dsp*
Specified filename /dev/dsp* does not exist.
                     USER        PID ACCESS COMMAND
/dev/snd/controlC2:  pi          784 F.... lxpanel
/dev/snd/pcmC1D0p:   root        526 F.... mopidy
alexylem commented 8 years ago

@francoismartin Je ne comprends pas très bien ton problème du timeout. Comment peux-tu avoir un timeout alors qu'au dessus tu dis qu'il n'attends pas de nouvelle commande? Ca serait bien que tu refasse un essai et que tu nous colles le résultats de la console:

francoismartin commented 8 years ago

@alexylem Merci d'essayer de m'aider.

> Je ne comprends pas très bien ton problème du timeout. Comment peux-tu avoir un timeout alors qu'au dessus tu dis qu'il n'attends pas de nouvelle commande? J'ai essayé plusieurs fois et une fois il était en mode conversation et attendait une autre commande, c'est arrivé qu'une fois sur 10 (environ).

> Es-tu sûr que python script/mpdcontroller.py --play te rend la main? si tu le lance depuis la console tu peux lancer d'autres commandes aprèes? Oui python script/mpdcontroller.py --play me rend bien la main, j'ai testé toute mes commandes par la console avant de l'implanter dans Jarvis.

Sans le mode debug ça donne :

pi@raspberrypi:~/jarvis $ ./jarvis.sh 
Checking for updates...[Up-to-date]
jarvis: Bonjour
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
jarvis: Oui ?
Benjamin: lance la musique

# AVANT J'AI UNE ERREURE DANS MON SCRIPT (Mais la musique se lance quand même)

jarvis: la commande retourne une erreure.
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jackdmp 1.9.10
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2014 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
JACK server starting in realtime mode with priority 10
self-connect-mode is "Don't restrict self connect requests"
Failed to connect to session bus for device reservation Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Audio device hw:0 cannot be acquired...
Cannot initialize driver
JackServer::Open failed with -1
Failed to open server
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

[jack.c:252] error: Failed to open jack client: 0x11
[jack.c:58] warning: FIXME: One needs to wait or write some silence here to prevent the last bits of audio to vanish out of the ringbuffer.
tts_engines/google/main.sh: line 38:  2569 Segmentation fault      mpg123 -q $audio_file
Benjamin: play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker
.play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker

Et quand j'essaie de relancer jarvis derrière (avec toujours la musique mpd qui est joué) voici le résultat :

pi@raspberrypi:~/jarvis $ ./jarvis.sh 
Checking for updates...[Up-to-date]
jarvis: Bonjour
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jackdmp 1.9.10
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2014 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
JACK server starting in realtime mode with priority 10
self-connect-mode is "Don't restrict self connect requests"
Failed to connect to session bus for device reservation Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Audio device hw:0 cannot be acquired...
Cannot initialize driver
JackServer::Open failed with -1
Failed to open server
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

[jack.c:252] error: Failed to open jack client: 0x11
[jack.c:58] warning: FIXME: One needs to wait or write some silence here to prevent the last bits of audio to vanish out of the ringbuffer.
tts_engines/google/main.sh: line 38:  2282 Segmentation fault      mpg123 -q $audio_file
jarvis: Waiting to hear 'jarvis'
Benjamin: play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker

A savoir également que quand je test les commandes en mode keyboard mode tout ce passe très bien. Je penses vraiment que le problème survient quand jarvis veut jouer le son pour dire que la commande a était exécuté (ou donné la phrase retourné par google) et qu'il ne peut pas car il y a déjà une musique lancé depuis le MPD, d'où le Benjamin: play FAIL formats: can't open output file 'default': snd_pcm_open error: Device or resource busy.

Je viens de faire un test, avant de relancer jarvis pour une troisième fois, j'execute la commande python script/mpdcontroller.py --pause (donc la musique s'arrête) et quand je relance jarvis tout remarche parfaitement car plus rien n'est joué sur les enceintes.

Arrives-tu a comprendre mon problème ou je n'arrive pas a m'expliquer ? Merci

alexylem commented 8 years ago

Ok le problème est très clair: lorsque Jarvis tente de "parler" ici dans ton cas pour prononcer:

jarvis: la commande retourne une erreure.

Le tts que tu as choisi (google) génère un fichier mp3 puis tente de le lire avec mpg123 ce qui génère une segmentation fault:

tts_engines/google/main.sh: line 38:  2282 Segmentation fault      mpg123 -q $audio_file

Peux-tu essayer avec un autre tts comme svox_pico par exemple?

francoismartin commented 8 years ago

Même problème avec svox

pi@raspberrypi:~/jarvis $ ./jarvis.sh 
Checking for updates...[Up-to-date]
jarvis: Bonjour
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
No handlers could be found for logger "root"
Please give me a moment, I'm loading your Spotify playlists.
Pausing music
jarvis: Oui ?
Benjamin: 
lance la musique
No handlers could be found for logger "root"
Please give me a moment, I'm loading your Spotify playlists.
Traceback (most recent call last):
  File "script/mpdcontroller.py", line 395, in <module>
    start(args)
  File "script/mpdcontroller.py", line 298, in start
    delegateArgs(mpdwrapper, args)
  File "script/mpdcontroller.py", line 316, in delegateArgs
    print("Playing %s" % mpdwrapper.current_song())
  File "script/mpdcontroller.py", line 47, in wrap
    return func(self, *default_args, **default_kwargs)
  File "script/mpdcontroller.py", line 126, in current_song
    item = self.client.playlistinfo(int(self.client.status()["song"]))[0]
KeyError: 'song'
jarvis: la commande retourne une erreure.
play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker

Peux être je dois configurer alsa pour qu'il puisse streamer deux sons en même temps de source différente ?

alexylem commented 8 years ago

Entends-tu les bips de Jarvis par contre?

Tu pourrais tenter de corriger le script python pour qu'il exit 0 au lieu d'un code erreur. Au moins Jarvis n'aura pas à prononcer "la commande retourne une erreure." Ou juste rajouter ; true à la fin de la commande:

*LANCE*MUSIQUE==python script/mpdcontroller.py --play; true
francoismartin commented 8 years ago

J'ai rajouté le ; true

Je n'entend pas le bip de jarvis à la fin de ma commande.

lance la musique
Benjamin: play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker
alexylem commented 8 years ago

Hmm alors maintenant c'est le bit qui doit planter. Pour confirmer, peux-tu, dans un terminal (sans spotify):

  1. Lancer la musique spotify
  2. Faire un play jarvis/sounds/applause.wav
francoismartin commented 8 years ago

Oui c'est bien ça @alexylem

play FAIL formats: can't open output file 'default': snd_pcm_open error: Device or resource busy

alexylem commented 8 years ago

Bon ben aussi surprenant que ca puisse paraître, il ne semble pas possible de jouer 2 sons en même temps. Ce que je peux faire est d'ignorer les erreurs sur les bips de jarvis... Peux-tu tenter de ton côté et commenter la ligne 664 de jarvis.sh

francoismartin commented 8 years ago

ça fonctionne en commentant cette ligne ;)

alexylem commented 8 years ago

Ca fonctionne jusqu'à ce que tu redises Jarvis 😄 Il va falloir trouver une solution plus long terme.

  1. As-tu utilisé les hooks pour mettre en pause la musique quand tu passes en mode conversation? Ca serait bien dans les hooks de faire un echo "hook: pausing music..." et echo "hook: resuming music..."
  2. Peux-tu faire un essai en lançant la musique depuis Jarvis, puis demander l'heure, puis demander de stopper la musique? (et nous coller le résultat)
  3. N'oublies pas de cacher toutes les logs que sort mdpcontroller.py pour qu'on y voit plus clair:
*LANCE*MUSIQUE==python script/mpdcontroller.py --play >/dev/null 2>&1; true

On essaye de trouver ensemble la meilleure approche avant que je fasse des modifications dans le code.

francoismartin commented 8 years ago

Oui j'ai bien mis en place le hook est ça fonctionne (la musique s'arrête toute seule pas besoin de faire la commande)

pi@raspberrypi:~ $ jarvis/jarvis.sh 
Checking for updates...[Up-to-date]
jarvis: Bonjour
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
Pausing music
jarvis: Oui ?
Benjamin: quelle heure est-il
jarvis: il est 21:30
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
Pausing music
jarvis: Oui ?
Benjamin: quel jour
jarvis: nous sommes le Friday 05 Aug 2016
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
Pausing music
jarvis: Oui ?
Benjamin: version
jarvis: Je suis en version 0.1
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
Pausing music
jarvis: Oui ?
Benjamin: lance la musique
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
Pausing music
jarvis: Oui ?
Benjamin: comment tu t'appelles
jarvis: Je m'appelle jarvis
jarvis: Waiting to hear 'jarvis'
Benjamin: jarvis
Pausing music
jarvis: Oui ?
Benjamin: au revoir
jarvis: Au revoir Benjamin

Le seul problème est quand la musique est lancé snowboy a énormément du mal d''entendre le hotword. A part réduire au minimum le son, impossible pour lui de le comprendre.

alexylem commented 8 years ago

Chez moi ca marche avec la musique, mais qui sort de la télé et si je parle très près du micro. Forcément si les enceintes de ton raspberry pi sont tout près du micro, c'est normal que ca ne marche pas bien 😄 Je n'ai plus qu'à ignorer l'erreur sur le bip d'entrée en mode conversation.

Smanar commented 8 years ago

Dsl, de retaper l'incruste avec un hors sujet mais je repond au 6 ou 7 eme post @francoismartin Quand tu disais "Je crois que c'est possible de créer des cartes virtuels sur alsa qui devrait résoudre notre problème."

Je pense que tu etais en plein dans la solution, c'est exactement ce qu'on vient de me dire, et j'ai meme 2 propositions a tester. Si ca interesse je peux balancer le lien. Bon comme d'hab j'ai pas encore eu le temps de tester mais ca m'a l'air faisable.

francoismartin commented 8 years ago

Hey @Smanar,

Oui je suis intéressé :) J'ai également découvert ce lien mais, je ne sais pas trop comment il a résolut son problème

Smanar commented 8 years ago

cf http://stackoverflow.com/questions/14398573/alsa-api-how-to-play-two-wave-files-simultaneously Mais je pourrais pas tester avant ce WE. Il propose 2 solutions. Essayer d'ouvrir le "software device" au lieu du "hardware device" lors de l'initialisation de l'appli Utiliser Dmix avec la creation de carte virtuelle.

alexylem commented 8 years ago

Tenez-moi au courant si ce problème peut être résolu en créant des cartes virtuelles, merci 👍

francoismartin commented 8 years ago

Je fais un test dès que je peux et je vous tiens au jus ;)

francoismartin commented 8 years ago

@Smanar As-tu fais un test par hasard ?

francoismartin commented 8 years ago

Perso je viens d'essayer

pcm.dmixed {
    type dmix
    ipc_key 1024
    ipc_key_add_uid 0
    slave.pcm "hw:1,0"
}
pcm.dsnooped {
    type dsnoop
    ipc_key 1025
    slave.pcm "hw:0,0"
}

pcm.duplex {
    type asym
    playback.pcm "dmixed"
    capture.pcm "dsnooped"
}

# Instruct ALSA to use pcm.duplex as the default device
pcm.!default {
    type plug
    slave.pcm "duplex"
}

ça marche pour le micro et quand je lance la musique se lance et je l'entend sur mon enceinte par contre, je n'entend plus le Bonjour et le Oui ? de jarvis.

pi@raspberry:~/jarvis $ ./jarvis.sh 
Checking for updates...[Up-to-date]
Jarvis: Bonjour
Jarvis: Waiting to hear 'Jarvis'
Benjamin: Jarvis
Jarvis: Oui ?

Benjamin: joue la musique
DEBUG:root:Preparing to start music module
DEBUG:root:Starting music mode
DEBUG:mpd:Calling MPD play()
Jarvis: Waiting to hear 'Jarvis'
Benjamin: ALSA lib pcm_dmix .c:1022:(snd_pcm_dmix_open) unable to open slave
play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker

je suis un peu dessus j'y croyais :D Je peux quand même lancer la musique et redire jarvis sans que ça plante le programme mais je n'arrive pas a lancer 2 sons en même temps.

Je viens de tester de lancer 2 sons différent avec aplay en même temps via 2 console et ça fonctionne donc, reste a comprendre pourquoi ça passe pas avec jarvis. Jarvis utilise bien alsa non ? :D

Par contre @alexylem comment faire pour éviter que mon ~/.asoundrc ne soit pas modifier à chaque reboot car j'ai l'impression que même si j'ai mon problème avec le reboot expliqué au #93 j'ai l'impression que c'est quand même écrasé par jarvis, non ?

alexylem commented 8 years ago

Jarvis regénère le ~/.asoundrc à chaque fois que vous modifiez votre configuration speaker ou microphone (et à l'installation bien entendu). Oui on dirait bien que tu as le même problème qu'ici #93.

Sinon pour répondre à ton autre question, chaque TTS a sa propre méthode:

Tu utilises quel TTS déjà? Si tu utilises svox_pico tu pourrais essayer de remplacer play par aplay ici pour ca si ca marche mieux: https://github.com/alexylem/jarvis/blob/master/jarvis-functions.sh#L11

francoismartin commented 8 years ago

@alexylem Désolé pour ma réponse tardive, j'utilise le TTS gogle.

Pourtant le lien de @Smanar fonctionne plutôt bien car j'arrive à lancer 2 musique avec aplay et 2 musique mpg123 en même temps

aplay applause.wav & mpg123 flume.mp3 & aplay timeout.wav & mpg123 weeknd.mp3

Mais avec Jarvis, j'ai le problème du

ALSA lib pcm_dmix .c:1022:(snd_pcm_dmix_open) unable to open slave

Je n'arrive pas a comprendre, histoire de user ? Pourtant pi est bien dans le groupe audio ... Tu as une idée comment personnalisé PLAY (méthode jarvis-functions) pour cibler un PCM en particulier et pas pcm.default ? sur aplay on peut faire aplay -Dplug:dmixed. Peux être que ça peut résoudre le problème.

Après @alexylem le bug du son juste au dessus c'est pour lancer le son qu'il a bien entendu ta demande ou fini. que tu me demandes de commenter ici : https://github.com/alexylem/jarvis/issues/80#issuecomment-237953864


L'erreur complète

Jarvis: ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
HELP: Verify your speaker in Settings > Audio > Speaker
DEBUG: program exit handler
DEBUG: program_exit hook
(listening...)
DEBUG: models=jarvis,snowboy
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused

ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused

ALSA lib pcm_dmix.c:961:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm_dsnoop.c:557:(snd_pcm_dsnoop_open) The dsnoop plugin supports only capture stream
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
francoismartin commented 8 years ago

bon ce qui est bizarre est quand je lance une musique avec mpg123 et quand même temps je lance jarvis. Il n'y a pas de problème, j'ai les deux sons en même temps, par contre dès que je lance mopidy, impossible... Je me demande si mopidy par hasard n'a pas une config où il point directement sur la carte hardware et non sur la carte virtuel !default de alsa.

J'ai configurer comme indiqué dans jasper, l'utilisation d'alsasink, et dans la doc d'alsasink il stipule qu'on peut designer un device mais je ne sais pas comment faire ça dans mopidy

mais bon il utilise bien par défault pcm.defaultet vu que je l'ai techniquement configuré pour venir de plusieurs sources, pourquoi ça ne fonctionne pas ... problème d'user ? J'avoue être légèrement perdue.

francoismartin commented 8 years ago

Bon j'ai au moins résolu mon problème de device busy, c'est tout con j'ai copié coller le ~/.asoundrc dans /root/.asoundrc car mopidy est lancé depuis le root donc il n'avais pas accès au plugin dmix, d'ou le problème ...

alexylem commented 8 years ago

Super ca progresse, merci de nous tenir informés!

francoismartin commented 7 years ago

Quelqu'un a répondu au message de mon amis sur stackoverflow

A tester si ça résout le problème, si oui c'était vraiment bidon mais dur a trouver.

alexylem commented 7 years ago

Le problème existe toujours?

Cartman99fr commented 7 years ago

Même question ? y-a-t"il encore un problème ? si non, quelle est la solution ? est-elle implementée dans le plugin ? (ici ? https://gist.github.com/francoismartin/289bcc6585ed7af3b0c3e5f19c668620)

pipolaq commented 7 years ago

Bonsoir, je suis actuellement en train de travailler sur l'implémentation de spotify dans jarvis, et je serai intéressé par votre solution pour faire marcher tout ce joli monde! Comment avez vous fait? Merci d'avance!

wikijm commented 7 years ago

Pas de réponse depuis le 20 octobre 2016, je clôture l'issue. Ne pas hésiter à rouvrir si avancée.

pacanou commented 7 years ago

Bonjour,

Je viens d'installer le plugin "Jarvis Music Player" et j'ai le message : play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy ERROR: play command failed

avec mon jabbra 510. Au final, y'a t-il une solution. Merci

------------ Config ------------
jv_branch            master
jv_version           17.04.22
jv_arch              armv7l
jv_os_name           raspbian
jv_os_version        8
language             fr_FR
play_hw              hw:1,0
rec_hw               hw:1,0
speaker              GN Netcom
microphone           GN Netcom
recorder             snowboy
trigger_stt          snowboy
command_stt          bing
tts_engine           svox_pico
--------------------------------
Commands from plugin jarvis-jeedom:
*
Commands from plugin jarvis-google-map-traffic:
*TRAFIC ENTRE (*) ET (* *TRAFIC*
Commands from plugin jarvis-systemd-startup:

Commands from plugin jarvis-music-player:
*JOUE*MUSIQUE*          *STOP*MUSIQUE*          *MUSIQUE*SUIVANTE*
*MUSIQUE*PRECEDENTE*    *MISE A JOUR*MUSIQUE*
eva: Waiting to hear 'eva'
pascal: (listening...)
DEBUG: models=eva
INFO:snowboy:Ticks: [2, 20, 5, -1]
INFO:snowboy:Keyword 1 detected at time: 2017-04-24 19:08:25
INFO:snowboy:Ticks status: 2 1 0 1
DEBUG: modelid=0
eva
DEBUG: entering_cmd hook
DEBUG: start_speaking hook
eva: Oui
DEBUG: stop_speaking hook
pascal: (listening...)
DEBUG: start_listening hook
utils/timeout.sh 10 python  recorders/snowboy/main.py 0 /dev/shm/jarvis-record.wav
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
________|||||||||||||___INFO:recorder:Ticks status: 8 13 3
DEBUG: speech duration was 20 (10 = 1 sec)
DEBUG: stop_listening hook
DEBUG: token missing or expired
DEBUG: json=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6Imh0dHBzOi8vc3BlZWNoLnBsYXRmb3JtLmJpbmcuY29tIiwic3Vic2NyaXB0aW9uLWlkIjoiNzc1NDIxMmJkOGZjNGU4M2I0MTM1NGI3NjFkMTE3ZjMiLCJwcm9kdWN0LWlkIjoiQmluZy5TcGVlY2guUHJldmlldyIsImNvZ25pdGl2ZS1zZXJ2aWNlcy1lbmRwb2ludCI6Imh0dHBzOi8vYXBpLmNvZ25pdGl2ZS5taWNyb3NvZnQuY29tL2ludGVybmFsL3YxLjAvIiwiYXp1cmUtcmVzb3VyY2UtaWQiOiIiLCJpc3MiOiJ1cm46bXMuY29nbml0aXZlc2VydmljZXMiLCJhdWQiOiJ1cm46bXMuc3BlZWNoIiwiZXhwIjoxNDkzMDU0MzE0fQ.jzpVJIzCR7Kvi1qbsM1J2167cQlUPaYI_E5xKWqiTz4
DEBUG: token will expire in 590 seconds
DEBUG: curl https://speech.platform.bing.com/recognize/query?version=3.0&requestid=c26c1efe-a489-4890-a477-4fc1b99541f3&appid=D4D52672-91D7-4C74-8AD8-42B1D98141A5&format=json&locale=fr-FR&device.os=linux&scenarios=ulm&instanceid=E043E4FE-51EF-4B74-8133-B728C4FEA8AA&result.profanitymarkup=0
DEBUG: json={"version":"3.0","header":{"status":"success","scenario":"ulm","name":"joue de la musique","lexical":"joue de la musique","properties":{"requestid":"7abc93ce-b363-4454-8fbd-d7bb0f42b3ab","HIGHCONF":"1"}},"results":[{"scenario":"ulm","name":"joue de la musique","lexical":"joue de la musique","confidence":"0.9431748","properties":{"HIGHCONF":"1"}}]}
joue de la musique
$> jv_pg_play_music
DEBUG: start_speaking hook
eva: tout de suite
DEBUG: stop_speaking hook
pascal: play FAIL formats: can't open output file `default': snd_pcm_open error: Device or resource busy
ERROR: play command failed
alexylem commented 7 years ago

Pour toute question ou problème lié à un plugin Jarvis, merci de créer un ticket sur le repository correspondant. Ainsi son auteur en sera informé et pourra vous aider.

Ok, alors c'est où?

Après ton message d'erreur dit que le device est busy, ca faudrait le coup de tester en mode clavier et muet pour confirmer:

./jarvis.sh -km
You: joue de la musique
olivierpayet974 commented 7 years ago

J'ai le même problème. En mode KM, il n'y a pas de concurrence d'accès et du coup je n'ai plus le plantage de Jarvis. :/

Oliv4945 commented 7 years ago

Je confirme le soucis, initialement c'est pour ça que j'ai fait une branche pour utiliser PulseAudio: je voulais pouvoir mettre la radio ET l'arrêter avec Jarvis :-) Voir ici. Il faut installer pulse audio et tester cette branche... merci de faire des retours, ça permettra de faire avancer Jarvis pour tout le monde.

olivierpayet974 commented 7 years ago

Bonjour,

Si j'ai bien compris il faudrait partir sur nu déport de lecture des musiques sur un autre pi/pc. Si ca peut aider, Je viens de tester de jouer 2 mp3 sur ma pi depuis 2 commande shell distinct avec omxplayer et j'ai bien les deux morceau en simultané. Je ne peux pas tester plus pour ce matin.

En tout cas merci pour le retour rapide.

Oliv4945 commented 7 years ago

@olivierpayet974 pas nécessairement, PulseAudio permet aussi de mixer des flux sur un même PC. Du coup pas besoin de déporter là lecture, c'est juste un effet de bord pratique pour certaines personnes ;-)

Je vais regarder omxplayer, ça peut simplifier les choses. Par contre j'ai l'impression qu'il n'est pas packagé pour autre chose que rPi ou autre architecture ARM :/

wikijm commented 6 years ago

Bonsoir @olivierpayet974 et @Oliv4945,

Des avancées sur cette issue ?

Oliv4945 commented 6 years ago

Je n'ai pas encore rebranché mon rPi pour tester :/

wikijm commented 6 years ago

Bonjour @Oliv4945 Merci pour ton retour. Pas de problème, au moins le point n'est pas mort 😄