IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Audio Discussion :

Reconnaissance musicale pour PC


Sujet :

Audio

  1. #21
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    Je ne connais pas de nom et la seule que je connaisse n'est disponible que sous Linux. Mais je pense qu'il y a des bibliothèque qui ne font que les notifications et uniquement les notifications
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #22
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    c'est vrai de Qt semble intéressant, surtout après avoir lu ca:
    http://alp.developpez.com/tutoriels/qt/qsystemtrayicon/

    Mais QtCreator a des problèmes avec <windows.h> et Code::Blocks+Qt c'est pas la grande joie,

    je vais alors chercher autre part.

  3. #23
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Y a un soucis,
    dans tous les exemples que j'ai exploré (sauf Qt où je ne me suis pas réellement plongé) pour créer un programme en background avec une icone dans le system tray duquel on peut utiliser un menu, il y a toujours un loop infini (un while() qui capture les messages) alors que j'ai besoin d'utiliser un loop infini pour capturer et analyser la musique, et actualiser le titre du premier item du menu en 'ARTISTE - TITRE' et le deuxième de 'Capturing' vers 'Analyzing' selon l'état, et j'arrive pas à combiner les deux loop.
    C'est sois le process de capture/analyse qui fonctionne pas, sois le menu de l'icone qui ne fonctionne pas.
    Que faire?

  4. #24
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    Fusionner les deux boucles pour n'en avoir qu'une ? Ou utiliser un QThread.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #25
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    ouai j'ai essayé mais vu que mon process de capture/analyse contient des Sleep(), quand je fusionne les boucles, le menu ne fonctionne pas

  6. #26
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    Il faut très certainement adapté le code que vous aviez fait.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #27
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Salut,
    En fin de compte je me suis tourné vers Qt5, j'suis donc passé de Code::Blocks à Qt Creator.

    J'ai suivis ce tuto.

    J'ai donc dans mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
        Window w;
        w.show();
        app.exec();
     
    LA BOUCLE DE CAPTURING/ANALYZING
     
        return 0;
    }
    ce qui fait que tant que je quitte pas l'application, la boucle ne s’exécute pas et si j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
        Window w;
        w.show();
     
    LA BOUCLE DE CAPTURING/ANALYZING
     
        app.exec();
        return 0;
    }
    Donc, l'exec après la boucle, la boucle s’exécute mais la fenetre ne répond pas, ni le menu de l'icone du system tray.

    Avez-vous une idée de que faire?

  8. #28
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    Le exec permet de lancer la boucle événementielle de Qt. Sans elles, aucune fenêtre ne pourra répondre.
    Je vous conseille d'utiliser un thread, pour votre programme de reconnaissance.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #29
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Salut,
    Je me suis lancé vers le QThread, qui semble être prometteur, mais j'ai un problème décrit dans ce sujet.

  10. #30
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    ok, ce problème de QThread est résolut

  11. #31
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Salut,
    J'ai posté mon code à la fin de ce message.
    J'ai deux soucis pour l'instant:
    - l'un c'est de quitter le programme plus proprement que exit(1) dans la fonction void Window::changeTexte3() du fichier window.cpp
    - l'autre c'est de, même si j'ai lu de la doc sur les signaux, de emmètre un signal avec un string à partir de ma boucle de reconnaissance musicale vers l'icone de mon programme pour afficher une infobulle du titre de la musique reconnue.
    Je suis un peu perdu de savoir où mettre le connect(), où definir les fonction signal et comment bien emmètre le signal. En principe le signal devrait être émit dans la fonction run(), à la fin de la boucle de capturing/analysing (à l'endoit ou j'ai écris : C'EST ICI QUE JE VEUX EMMETRE UN SIGNAL) du fichier RecognitionThread.cpp

    la fonction qui devra être appelé pour afficher le message sera : sticon->showMessage("",message.c_str());
    Je sais qu'après avoir codé le signal, je devrais faire un qmake

    mon code :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdlib.h>
    #include <windows.h>
    #include <tchar.h>
    #include <fstream>
    #include <string>
    #include <QSystemTrayIcon>
    #include <QWidget>
    #include <QMenu>
    #include <QLabel>
    #include <QApplication>
    #include <QThread>
    #include "window.hpp"
    #include "RecognitionThread.hpp"
     
    using namespace std;
     
    #undef main
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
        Window w;
        RecognitionThread* T = new RecognitionThread();
        w.hide();
        return app.exec();
    }
    window.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #ifndef WINDOW_HPP
    #define WINDOW_HPP
    #include <QSystemTrayIcon>
    #include <QWidget>
    #include <QMenu>
    #include <QLabel>
    #include <QApplication>
    #include <QObject>
     
    class Window : public QWidget
    {
        Q_OBJECT
        public:
            Window();
            ~Window();
            QSystemTrayIcon* sticon;
     
        private slots:
            void changeTexte1();
            void changeTexte2();
            void changeTexte3();
    };
     
    #endif
    window.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include "window.hpp"
    #include <QSystemTrayIcon>
    #include <QWidget>
    #include <QMenu>
    #include <QLabel>
    #include <QApplication>
     
    Window::Window()
    {
        resize(0,0);
     
        // Builds icon
        sticon = new QSystemTrayIcon(this);
        QIcon icon("music.ico");
        sticon->setIcon(icon);
     
        // Builds menu and menu items
        QMenu* stmenu = new QMenu(NULL);
        QAction* actTexte1 = new QAction("unknown",NULL);
        QAction* actTexte2 = new QAction("Capturing...",NULL);
        QAction* actTexte3 = new QAction("Quit",NULL);
        stmenu->addAction(actTexte1);
        stmenu->addAction(actTexte2);
        stmenu->addAction(actTexte3);
     
        sticon->setContextMenu(stmenu);
     
        sticon->show();
        //sticon->showMessage("unknown","unknown");
     
        connect(actTexte1, SIGNAL(triggered()), this, SLOT(changeTexte1()));
        connect(actTexte2, SIGNAL(triggered()), this, SLOT(changeTexte2()));
        connect(actTexte3, SIGNAL(triggered()), this, SLOT(changeTexte3()));
    }
     
    Window::~Window()
    {
     
    }
     
    void Window::changeTexte1()
    {
     
    }
     
    void Window::changeTexte2()
    {
     
    }
     
    void Window::changeTexte3()
    {
        exit(1);
    }
    RecognitionThread.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #ifndef THREAD_HPP
    #define THREAD_HPP
    #include <stdlib.h>
    #include <windows.h>
    #include <tchar.h>
    #include <fstream>
    #include <string>
    #include <QThread>
    #include <QObject>
     
    using namespace std;
     
    class RecognitionThread : public QThread
    {
        Q_OBJECT
     
        public:
              RecognitionThread(QObject* parent = NULL);
              ~RecognitionThread();
              void run();
    };
     
    #endif
    RecognitionThread.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include "RecognitionThread.hpp"
    #include "window.hpp"
    #include <stdlib.h>
    #include <windows.h>
    #include <tchar.h>
    #include <fstream>
    #include <string>
    #include <QThread>
     
    using namespace std;
     
    extern QSystemTrayIcon* sticon;
     
    RecognitionThread::RecognitionThread(QObject* parent):QThread(parent)
    {
            start();
    }
    RecognitionThread::~RecognitionThread()
    {
         exit();
         wait();
    }
     
    void RecognitionThread::run()
    {
       // Following lines needed for CreateProcess(), startupinfo receive the output of the process run
        PROCESS_INFORMATION procinfo = {0};
        STARTUPINFO startupinfo = {0};
        ZeroMemory( &startupinfo, sizeof(startupinfo) );
        startupinfo.cb = sizeof(startupinfo);
        startupinfo.dwFlags |=STARTF_USESTDHANDLES ;
        startupinfo.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
        startupinfo.hStdError=GetStdHandle(STD_ERROR_HANDLE);
        SECURITY_ATTRIBUTES sa;
        ZeroMemory( &sa, sizeof(sa) );
        sa.nLength=sizeof(sa);
        sa.bInheritHandle=TRUE;
     
        // Declaration of read and written files
        ofstream messageFile;
        ifstream infoFile;
     
        string message;
        string info;
     
        // Position of words found in info (string), string::npos if not found
        size_t found_song_id,found_artist_b1,found_artist_b2,found_artist_e,found_title_b1,found_title_b2,found_title_e;
     
        string artist,title;
     
    // Here, the loop begins
    start :
        CODE DE RECONNAISSANCE MUSICALE, QUI DURE ENVIRON 80 SECONDES
    // Open info.txt and copy content in info (string)
        infoFile.open("info.txt");
        while(infoFile){
            getline(infoFile, info);
        }
        infoFile.close();
     
        // Looks for "song_id"
        found_song_id = info.find("song_id");
     
        message = "";
        if(found_song_id!=string::npos){//if "song_id" exists, the song has been recognized
            artist = "";
            title = "";
     
            // Gets the artist name
            found_artist_b1 = info.find("\"artist\":");
            found_artist_b2 = found_artist_b1 + 11;
            found_artist_e = info.find("\"",found_artist_b2);
            artist = info.substr(found_artist_b2,found_artist_e-found_artist_b2);
     
            // Gets the title
            found_title_b1 = info.find("\"title\":");
            found_title_b2 = found_title_b1 + 10;
            found_title_e = info.find("\"",found_title_b2);
            title = info.substr(found_title_b2,found_title_e-found_title_b2);
     
            // Puts "ARTIST - TITLE" in message (string)
            message += artist;
            message += " - ";
            message += title;
        }
        else{//if the song has not been recognized, puts "unknown" in message (string)
            message += "unknown";
        }
     
        WinExec("del message.txt", SW_HIDE); // Sends a command to delete message.txt
        Sleep(500);
        messageFile.open ("message.txt");
        messageFile << message; // Writes message (string) in message.txt
        messageFile.close();
        // Shows message in a tooltip near the system tray
       C'EST ICI QUE JE VEUX EMMETRE UN SIGNAL CONTENANT 'message' (un string)
    goto start; // End of the loop
    }

    Je vous remercie d'avance pour votre contribution.

  12. #32
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    c'est ok, j'ai trouvé comment faire. Je poursuis

  13. #33
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Salut,

    Yeah, mon programme fonctionne super bien ... si je l'execute à partir de mon IDE Qt Creator.

    J'ai essayé de l'executer dans son propre dossier, j'ai été stupéfié du nombre de dll à inclure. Sous Qt4 il y en avait seulement 3. La j'ai dû en inclure 10, et après ca je me retrouve avec cette erreur :




    Please, help me ^^

  14. #34
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    J'utilise DependencyWalker pour trouver les DLL nécessaires.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  15. #35
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    super DependencyWalker !! Tu m'as été d'une grande aide.

    --------------
    2EME ETAPE DE MON PROGRAMME TERMINEE
    --------------
    Pour le tester :
    Télécharger et installer : VirtualAudioCaptureGrabber
    Télécharger et dézipper : Mon projet
    executez MyMusicRecognition.exe pendant la lecture d'une musique "connue" et "de bonne qualité", au bout d'environ 80 secondes, vous devriez voir une infobulle près de la system tray. Si ce n'est pas le cas, c'est que la musique n'a pas été reconnue

    si quelque chose ne va pas, ou si vous avez des remarques pour améliorer mon programme, s'il vous plait dite le moi.



    Pour la La troisième étape sera de créer une ligne du menu 'Share on Facebook' qui générera le statut 'listening TITRE by ARTISTE'
    L'étape finale sera d'empacter tout ca (avec l'installeur de VirtualAudioCaptureGrabber.exe) et d'en faire un programme s'executant au démarage du systeme.

  16. #36
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    j'ai un problème d'icones. Voir la discussion.

    EDIT: problème d'icone résolu
    je me tourne vers le bouton facebook

  17. #37
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    ouah, j'ai trop de mal à créer la génération de statut sur facebook.
    Tout ce que je trouve c'est du code php et à ce que j'ai compris, il faut posséder un site web... enfin, je suis totalement perdu et google ne m'aide pas beaucoup la dessus

  18. #38
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Salut,
    Quelqu'un connais un installeur de qualité autre que InstallJammer OU si vous connaissez InstallJammer, comment on crée un checkbutton pour demander si on accepte ou pas de crée un shortcut dans :
    C:\Users\<%Username%>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

    Je vous remercie d'avance pour votre contribution.

  19. #39
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    MY MUSIC RECOGNITION v1.0

    J'ai décidé de passer l'étape 3 (poster sur son propre wall facebook) et la développer pour la version 1.1

  20. #40
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119

Discussions similaires

  1. Reconnaissance manuscrite pour site web
    Par lrinaldi dans le forum Imagerie
    Réponses: 1
    Dernier message: 20/02/2013, 11h43
  2. Logiciel de reconnaissance vocale pour remplir champs de formulaire
    Par midiweb dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 25/11/2011, 15h15
  3. Réponses: 0
    Dernier message: 06/12/2010, 19h56
  4. Réponses: 13
    Dernier message: 13/08/2010, 11h58
  5. reconnaissance vocale pour le jeu
    Par Asmod_D dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 18/09/2007, 01h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo