[PYTHON] J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2

introduction

Je voulais créer du contenu avec VOICEROID, mais je n'entends pas la voix sur un ordinateur qui n'a pas le logiciel VOICEROID! !! ** **

Ensuite, j'ai pensé: "Trouvons l'API et faisons quelque chose!", Mais j'ai cherché l'API, mais je ne l'ai pas trouvée du tout, j'ai donc passé le texte saisi via VOICEROID, sauvegardé le fichier audio et fait quelque chose pour l'appeler. C'était.

** Article de référence ** Essayez de déplacer VOICEROID2 (Akari Kosei) du programme Comment inspecter l'interface utilisateur avec l'outil Inspecter? [Développement d'applications Windows 8 / Windows 8.1 Store]

** Utilisé etc. ** python3 {tkinter, wave, pywinauto}

Structure en béton

Utilisez le tkinter de python3 pour afficher les zones de saisie, les boutons d'envoi et les images de caractères. Lorsque vous appuyez sur le bouton d'envoi, le texte est envoyé au logiciel VOICEROID, alors enregistrez-le en tant que voix. (Utilisation de pywinauto)

Voyons le fonctionnement de VOICEROID2

Si vous regardez le programme en référence à ce qui est écrit dans Article de référence, vous pouvez voir que l'obtention de la poignée de la fenêtre est la clé de cette fois. .. Pour voir comment cela fonctionne, nous utilisons un outil appelé Inspect.exe qui vous permet de voir comment fonctionne l'interface utilisateur.

1. Regardez le flux de sauvegarde de la voix

"-" Indique la couche inférieure

bureau
- "VOICEROID2"fenêtre
-- ""Douane
--- ""bouton
---- "Stockage de la voix"texte

2, regardez le flux de sauvegarde de la voix

"-" Indique la couche inférieure

bureau
- "VOICEROID2"fenêtre
-- "enregistrer sous"dialogue
--- "sauvegarder(S)"bouton

3, regardez le flux de sauvegarde de la voix

"-" Indique la couche inférieure

bureau
- "VOICEROID2"fenêtre
-- "enregistrer sous"dialogue
--- "enregistrer sous"dialogue
----| "Oui(Y)"bouton
----| "Non(N)"bouton

4, regardez le flux de sauvegarde de la voix

"-" Indique la couche inférieure

bureau
- "VOICEROID2"fenêtre
-- "Stockage de la voix"fenêtre
--- "information"dialogue
---- "OK"bouton

Sortez le correspondant et écrivez-le dans le code

** Kokko ** est le plus ennuyeux, et plusieurs noms similaires apparaissent, donc la hiérarchie devient étrange. Ça me fait mal à la tête, alors joue une chanson ou bois un café.

Avant le code de programme (supplément)

from voice2 import talkVOICEROID2 utilise Article de référence tel quel. Démarrez VOICEROID2 à l'avance, puis exécutez voiceroidtalk.py. Il y a une fenêtre de confirmation lors du passage de l'enregistrement vocal VOICEROID2 à «Enregistrer sous», mais cette fois, il est réglé sur «Omettre de la prochaine fois»

Écran principal

voiceroidtalk.py


import wave
import winsound as ws
import tkinter
import sys
import tkinter.messagebox as tkm
import time
from voice2 import talkVOICEROID2
from voiceroid2_1 import talkVOICEROID2_1
from voiceroid2_2 import talkVOICEROID2_2
from voiceroid2_3 import talkVOICEROID2_3
from voiceroid2_4 import talkVOICEROID2_4
import time

root=tkinter.Tk()
root.geometry("1920x1080")
root.title(u"aoi talk")
kotonoha=tkinter.PhotoImage(file="C:/Users/takumi/Desktop/voice/01.png ")
canvas=tkinter.Canvas(bg="white",width=475,height=750)
canvas.place(x=1300,y=250)
canvas.create_image(0,0, image=kotonoha, anchor=tkinter.NW)

def addlist(text):
    mysay="you: "+ text
    print(mysay)
    listbox.insert(tkinter.END,mysay)
    chat = "Aoi: " + talk(text)

    #if 0<=int(text):
    #    aoivoice=int(text)

    Entry1.delete(0, tkinter.END)
    chatCut(chat)
    #addRep(aoi)

def chatCut(chat):    
    aoi=chat
    addRep(aoi)

def addRep(aoi):
    listbox.insert(tkinter.END, aoi)
    #Traitement de la voix
    voiceroid=aoi[5:]
    voiceroid=voiceroid+"Tsu"
    word=len(voiceroid)
    destime=round(word/7+0.1,1)
    #destime=round(word/7+1.1,1)
    #Si vous ne pouvez pas parler sur le bureau, ajoutez le commentaire suivant
    #talkVOICEROID2(voiceroid)
    #time.sleep(destime)
    #-----------zzz
    #Changer le traitement de la temporisation selon les spécifications
    talkVOICEROID2_1(voiceroid)
    time.sleep(0.3)
    talkVOICEROID2_2(voiceroid)
    time.sleep(0.2)
    talkVOICEROID2_3(voiceroid)
    time.sleep(0.2)
    talkVOICEROID2_4(voiceroid)

def talk(say):
    if say == 'end':
        return ('à plus')
    else:
        return (say)

static=tkinter.Label(text=u"Parlez à Aoi-chan!")
static.pack()

Entry1=tkinter.Entry(width=50)
Entry1.insert(tkinter.END,u"Bonjour")
Entry1.pack()

button=tkinter.Button(text=u"Envoyer", width=50,command=lambda: addlist(Entry1.get()))
button.pack()

listbox=tkinter.Listbox(width=55,height=15)
listbox.pack()

root.mainloop()

Partie de traitement

Si vous avez le pouvoir de l'assembler plus facilement ...

voiceroid2_1.py


# -*- coding: utf-8 -*-
import pywinauto

def search_child_byclassname_1(class_name, uiaElementInfo, target_all = False):
    target = []
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():

        #Confirmation de correspondance de nom de classe
        if childElement.class_name == class_name:
            if target_all == False:
                return childElement
            else:
                target.append(childElement)
    if target_all == False:
        #Faux sinon
        return False
    else:
        return target

def search_child_byname_1(name, uiaElementInfo):
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():

        #Confirmation de correspondance de nom
        if childElement.name == name:
            return childElement
    #Faux sinon
    return False

def talkVOICEROID2_1(speakPhrase):
    #Éléments de bureau
    parentUIAElement = pywinauto.uia_element_info.UIAElementInfo()

    #Rechercher voiceroid
    voiceroid2 = search_child_byname_1("VOICEROID2",parentUIAElement)
    # *Si est attaché
    if voiceroid2 == False:
        voiceroid2 = search_child_byname_1("VOICEROID2*",parentUIAElement)

    #Changer d'ici
    #Obtenir ElementInfo de l'élément de texte
    TextEditViewEle = search_child_byclassname_1("TextEditView",voiceroid2)
    textBoxEle = search_child_byclassname_1("TextBox",TextEditViewEle)

    #Prenez le contrôle
    textBoxEditControl = pywinauto.controls.uia_controls.EditWrapper(textBoxEle)

    #Enregistrement de texte
    textBoxEditControl.set_edit_text(speakPhrase)

    #Obtenir le bouton
    buttonsEle = search_child_byclassname_1("Button",TextEditViewEle,target_all = True)
    #Trouvez le bouton de lecture
    playButtonEle = ""
    for buttonEle in buttonsEle:
        #Rechercher des blocs de texte
        textBlockEle = search_child_byclassname_1("TextBlock",buttonEle)
        if textBlockEle.name == "Stockage de la voix":
            playButtonEle = buttonEle
            break

    #Obtenir le contrôle du bouton
    playButtonControl = pywinauto.controls.uia_controls.ButtonWrapper(playButtonEle)

    #Appuyez sur le bouton de lecture
    playButtonControl.click()


voiceroid2_2.py


#Deuxième fois
# -*- coding: utf-8 -*-
import pywinauto

def search_child_byclassname_2(class_name, uiaElementInfo, target_all = False):
    target = []
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():
        #Confirmation de correspondance de nom de classe
        if childElement.class_name == class_name:
            if target_all == False:
                return childElement
            else:
                target.append(childElement)
    if target_all == False:
        #Faux sinon
        return False
    else:
        return target

def search_child_byname_2(name, uiaElementInfo):
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():
        #Confirmation de correspondance de nom
        if childElement.name == name:
            return childElement
    #Faux sinon
    return False

def talkVOICEROID2_2(speakPhrase):
    #Éléments de bureau
    parentUIAElement = pywinauto.uia_element_info.UIAElementInfo()
    #Rechercher voiceroid
    voiceroid2 = search_child_byname_2("VOICEROID2",parentUIAElement)
    # *Si est attaché
    if voiceroid2 == False:
        voiceroid2 = search_child_byname_2("VOICEROID2*",parentUIAElement)

    #Changer d'ici
    #Enregistrer sous Obtenir les informations d'élément
    saveEle = search_child_byclassname_2("#32770",voiceroid2)

    playsaveEle = search_child_byclassname_2("Button",saveEle,target_all = False)

    #Obtenir le contrôle du bouton
    playButtonControl = pywinauto.controls.uia_controls.ButtonWrapper(playsaveEle)

    #Appuyez sur le bouton de lecture
    playButtonControl.click()

voiceroid2_3.py


#Troisième fois
# -*- coding: utf-8 -*-
import pywinauto

def search_child_byclassname_3(class_name, uiaElementInfo, target_all = False):
    target = []
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():
        #Confirmation de correspondance de nom de classe
        if childElement.class_name == class_name:
            if target_all == False:
                return childElement
            else:
                target.append(childElement)
    if target_all == False:
        #Faux sinon
        return False
    else:
        return target

def search_child_byname_3(name, uiaElementInfo):
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():
        #Confirmation de correspondance de nom
        if childElement.name == name:
            return childElement
    #Faux sinon
    return False

def talkVOICEROID2_3(speakPhrase):
    #Éléments de bureau
    parentUIAElement = pywinauto.uia_element_info.UIAElementInfo()
    #Rechercher voiceroid
    voiceroid2 = search_child_byname_3("VOICEROID2",parentUIAElement)
    # *Si est attaché
    if voiceroid2 == False:
        voiceroid2 = search_child_byname_3("VOICEROID2*",parentUIAElement)

    #Changer d'ici
    #Obtenez le ElementInfo de l'élément de sauvegarde avec le prénom
    saveEle = search_child_byclassname_3("#32770",voiceroid2)
    
    #Enregistrer sous un deuxième nom(Oui ou non)Obtenir ElementInfo de l'élément
    resaveEle = search_child_byclassname_3("#32770",saveEle)
    
    #Stocker dans la poignée à l'intérieur du second(Obtenez le bouton OUI)
    yessEle = search_child_byclassname_3("Button",resaveEle,target_all = True)
    #Trouvez le bouton Oui
    playyesEle = ""
    for yesEle in yessEle:
        #Le premier argument est le handle actuel, le second argument est le handle de sauvegarde précédent
        #Cherchez le nom oui là où vous êtes
        a=search_child_byclassname_3("#32770",saveEle)
        if yesEle.name=="Oui(Y)":
            playyesEle=yesEle
            break

    #Obtenir le contrôle du bouton
    playButtonControl = pywinauto.controls.uia_controls.ButtonWrapper(playyesEle)

    #Appuyez sur le bouton de lecture
    playButtonControl.click()

voiceroid2_4.py


#4e
# -*- coding: utf-8 -*-
import pywinauto

def search_child_byclassname_4(class_name, uiaElementInfo, target_all = False):
    target = []
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():
        #Confirmation de correspondance de nom de classe
        if childElement.class_name == class_name:
            if target_all == False:
                return childElement
            else:
                target.append(childElement)
    if target_all == False:
        #Faux sinon
        return False
    else:
        return target

def search_child_byname_4(name, uiaElementInfo):
    #Rechercher tous les éléments enfants
    for childElement in uiaElementInfo.children():
        #Confirmation de correspondance de nom
        if childElement.name == name:
            return childElement
    #Faux sinon
    return False

def talkVOICEROID2_4(speakPhrase):
    #Éléments de bureau
    parentUIAElement = pywinauto.uia_element_info.UIAElementInfo()
    #Rechercher voiceroid
    voiceroid2 = search_child_byname_4("VOICEROID2",parentUIAElement)
    # *Si est attaché
    if voiceroid2 == False:
        voiceroid2 = search_child_byname_4("VOICEROID2*",parentUIAElement)

    #Changer d'ici
    #Fenêtre d'enregistrement audio(Enregistrer la confirmation)Obtenir ElementInfo de l'élément
    wavEle = search_child_byclassname_4("Window",voiceroid2)
    #Obtenir ElementInfo pour l'élément de dialogue d'informations
    infoEle = search_child_byclassname_4("#32770",wavEle)
    
    #Acquisition du bouton OUI
    yessEle = search_child_byclassname_4("Button",infoEle,target_all = True)
    #Trouvez le bouton Oui
    playyesEle = ""
    for yesEle in yessEle:
        #Rechercher des blocs de texte

        w=search_child_byclassname_4("#32770",wavEle)
        if yesEle.name=="OK":
            playyesEle=yesEle
            break

    #Obtenir le contrôle du bouton
    playButtonControl = pywinauto.controls.uia_controls.ButtonWrapper(playyesEle)

    #Appuyez sur le bouton de lecture
    playButtonControl.click()

finalement

J'ai pu le sortir en toute sécurité! !! Aoi Chan Kawaii Yatter (Fatigue) Eh bien, à ce stade, seules les personnes qui ont VOICEROID2 peuvent le faire, mais j'aimerais pouvoir le faire sur des pages Web.

Sécurité? ?? Oh, c'était un bon gars ...

Recommended Posts

J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de visualiser les signets volant vers Slack avec Doc2Vec et PCA
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé de commencer avec Hy
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé de me connecter automatiquement à Twitter avec du sélénium (RPA, scraping)
J'ai essayé d'exprimer de la tristesse et de la joie face au problème du mariage stable.
Recevez des tweets avec la fonction Google Cloud et enregistrez automatiquement les images dans Google Photos
J'ai essayé de convertir la chaîne datetime <-> avec tzinfo en utilisant strftime () et strptime ()
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
[Chaîne de Markov] J'ai essayé de lire des citations et des émotions négatives en Python.
J'ai essayé de contrôler la bande passante et le délai du réseau avec la commande tc
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de déplacer GAN (mnist) avec keras
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé de détecter rapidement un mouvement avec OpenCV
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé de prédire la survie du Titanic avec PyCaret
J'ai essayé d'utiliser Linux avec Discord Bot
J'ai essayé d'étudier DP avec séquence de Fibonacci
J'ai essayé de démarrer Jupyter avec toutes les lumières d'Amazon
J'ai essayé de juger Tundele avec Naive Bays
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai essayé de déboguer.
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
[Introduction à AWS] J'ai essayé de porter une application de conversation et de jouer avec text2speech @ AWS ♪
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner