Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jouer un fichier .wav tkinter

Sujet résolu
    12 novembre 2017 à 11:05:08

    Bonjour, alors j'ai décidé de faire une sorte de synthèse vocale sur tkinter, doc j'aimerai bien que j'ai le son qui soit joué.

    J'ai donc utilisé winsound mais quand il essaye de lire le fichier .wav (qui fonctionne je peux le lancer sans problème), il me fait un bip d'erreur :

    url = "https://translate.google.com/translate_tts"
    headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}    
    
    text = contents
    params = {
        'ie': 'UTF-8',
        'q': text,
        'tl': langue[var.get()],
        'client': 'gtx'
    }
    
    r = requests.get(url, params=params, headers=headers)
    with open("clip.wav", 'wb') as f:
        f.write(r.content)
    
    winsound.PlaySound("clip.wav", winsound.SND_ASYNC)

    Bien évidemment ce code est dans une fonction que j'appelle avec un bouton tkinter

    même en spécifiant le chemin d'accès complet, ça ne fonctionne pas..

    Merci pour votre aide ^^

    -
    Edité par CodingFR 12 novembre 2017 à 11:05:58

    • Partager sur Facebook
    • Partager sur Twitter

    Développeur python amateur et fan de jeux-vidéos !

    Anonyme
      12 novembre 2017 à 14:37:12

      Il faut ajouter le drapeau (flag) indiquant à winsound que la source provient d'un fichier :

      flags = winsound.SND_ASYNC | winsound.SND_FILENAME
      winsound.PlaySound(filename, flags)
      • Partager sur Facebook
      • Partager sur Twitter
        12 novembre 2017 à 15:27:33

        ca ne marche quand même pas , ca me fait un bip d'erreur
        • Partager sur Facebook
        • Partager sur Twitter

        Développeur python amateur et fan de jeux-vidéos !

        Anonyme
          12 novembre 2017 à 16:49:34

          Effectivement, translate.google.com/translate_tts retourne un fichier mp3, pas un Wave.

          -
          Edité par Anonyme 12 novembre 2017 à 16:50:30

          • Partager sur Facebook
          • Partager sur Twitter
            12 novembre 2017 à 17:44:18

            D'accord, j'ai réussi via pygame sauf que j'ai maintenant un autre problème..

            with open("clip.mp3", 'wb') as f:
                f.write(r.content)

            le with open va me créer un fichier vu qu'il n'existe pas et mettre dedans ce qu'il a récup de google translate sauf que quand je ré-appuie une deuxième fois sur le bouton, ça me met :

            File "test.py", line 70, in traduire with open("clip.mp3", 'wb') as f:

            PermissionError: [Errno 13] Permission denied: 'clip.mp3'

            je ne comprends pas pourquoi il ne veut pas écraser l'ancien fichier pour en récréer un nouveau

            -
            Edité par CodingFR 12 novembre 2017 à 17:44:52

            • Partager sur Facebook
            • Partager sur Twitter

            Développeur python amateur et fan de jeux-vidéos !

            Anonyme
              12 novembre 2017 à 18:40:33

              Je suppose que c'est dû au fait que ton premier fichier est toujours en lecture, c'est à dire que tu ne l'as pas refermé comme il faut, mais sans le code difficile d'être catégorique (et pourtant j'adore être catégorique même quand j'ai tord xD )

              -
              Edité par Anonyme 12 novembre 2017 à 18:41:09

              • Partager sur Facebook
              • Partager sur Twitter
                12 novembre 2017 à 18:52:21

                ^^ voici le code : 

                    url = "https://translate.google.com/translate_tts"
                    headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}
                    text = contents
                    params = {
                        'ie': 'UTF-8',
                        'q': text,
                        'tl': langue[var.get()],
                        'client': 'gtx'
                    }
                
                    mixer.init()
                    r = requests.get(url, params=params, headers=headers)
                    with open("clip.mp3", 'wb') as f:
                        f.write(r.content)
                    mixer.music.load("clip.mp3")
                    mixer.music.play()

                Cordialement mais normalement le with open referme automatiquement le fichier ?

                -
                Edité par CodingFR 12 novembre 2017 à 18:52:47

                • Partager sur Facebook
                • Partager sur Twitter

                Développeur python amateur et fan de jeux-vidéos !

                Anonyme
                  12 novembre 2017 à 19:19:49

                  Oui effectivement le with referme automatiquement le fichier, mais là je pense que c'est Pygame qui exploite le fichier et t'empêche de l'écraser. Je pense que tu peux zapper l'étape où tu enregistres le son dans un fichier et passer directement le contenu de la page à Pygame.

                  response = requests.get(url, ...)
                  mixer.music.load(response.content)

                  À tester, je ne saurais être catégorique (décidément :( ).

                  -
                  Edité par Anonyme 12 novembre 2017 à 19:20:03

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 novembre 2017 à 19:43:13

                    ca me marque une erreur :'( :

                    pygame.error: File path '��D�' contains null characters



                    • Partager sur Facebook
                    • Partager sur Twitter

                    Développeur python amateur et fan de jeux-vidéos !

                    Anonyme
                      12 novembre 2017 à 20:24:40

                      from io import BytesIO
                      
                      ...
                      
                      mixer.music.load(BytesIO(response.content))

                      Il est dit dans la doc que music.load peut prendre un file object en argument, BytesIO est un file object, je pense que cette fois ça passera ^^

                      edit correction, c'est bien BytesIO et pas ByteIO, oups.

                      -
                      Edité par Anonyme 12 novembre 2017 à 21:23:02

                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 novembre 2017 à 21:19:06

                        ca marche niquel juste une petite précision ;) :

                        pour python 3, on importe io et on utilise io.BytesIO() ^^

                        Mais merci beaucoup !

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Développeur python amateur et fan de jeux-vidéos !

                        Jouer un fichier .wav tkinter

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown