Mur fissuré Amway ! Utilisez la synthèse vocale Tencent Cloud AI pour créer votre premier livre audio

Dans la vie moderne, nous rencontrons inévitablement beaucoup de temps fragmentés, comme attendre le bus, prendre le métro, sortir de l'acide nucléique, acheter le petit-déjeuner, etc. L’accumulation de ce temps est sans aucun doute une énorme ressource personnelle, et si vous souhaitez utiliser cette partie du temps, l’écoute est évidemment la meilleure façon.

Les services nationaux de synthèse vocale dans le cloud computing sont déjà très matures. En intégrant les services TTS PaaS basés sur des outils open source, il est très pratique de créer un outil de production de livres audio personnalisé.

Bon, la demande est là, la faisabilité n’est pas un problème, c’est parti ! Salissez-vous les mains !

1. Analyse et recherche

En un mot, la demande pour les livres audio est de transformer le livre électronique en audio et de fournir un lien de téléchargement.

Affinons d’abord les exigences, décomposons-les en différents processus et voyons quelles capacités sont nécessaires pour les prendre en charge :

  1. Nous téléchargeons de bons livres électroniques en fonction de préférences personnelles (pour un usage commercial, assurez-vous qu'il est autorisé). Depuis que j'ai utilisé Kindle auparavant, j'ai beaucoup de livres électroniques mobi.
  2. Ouvrez l'outil de production et téléchargez le livre électronique mobi spécifié. (Recherche de bibliothèques d'interaction Web)
  3. L'outil de production doit d'abord analyser le mobi pour obtenir le contenu du texte. (Recherche dans la bibliothèque d'analyse mobi)
  4. En fonction du contenu du texte, appelez le service de synthèse vocale pour obtenir le contenu audio du livre audio. (Recherche de services PaaS de synthèse vocale dans le cloud computing)
  5. Des téléchargements audio de livres audio sont disponibles.

Après quelques recherches, la pile d'outils prête à être utilisée est la suivante.

2. Développement de codes

Une fois la pile d’outils en place, commencez à coder.

Étape 1 : Analyse du fichier de livre électronique

Le module d'analyse introduit d'abord la bibliothèque externe mobi, lit le fichier du livre électronique via la fonction mobi.extract et l'analyse dans un fichier au format html tmp_html.

Pour l'utilisation de la bibliothèque mobi, veuillez vous référer au document  mobi - bibliothèque pour décompresser les fichiers mobi

import mobi
def load_file(self, file_name):
        logging.info('begin to parse file')
        start_t = time.time()
        tmp_dir, tmp_html = mobi.extract(file_name) # 解析 mobi 文件
        end_t = time.time()
        logging.info('extract {} to {}. cost {}ms'.format(file_name, tmp_html, int((end_t-start_t)*1000)))

        with open(tmp_html, 'r') as fp:
            lines = fp.readlines()
        self.html_content = ''.join(lines) # 读取 html 
        logging.info('load file total {} chars'.format(len(self.html_content)))

        shutil.rmtree(tmp_dir)
        logging.info('clean temp dir {}'.format(tmp_dir))

Après avoir obtenu le fichier HTML, analysez-le dans une arborescence DOM via lxml.etree, puis utilisez XPath, un gros tueur, pour obtenir le contenu de votre choix.

Par exemple, des éléments avec des attributs spécifiques, des paragraphes, des titres à des positions spécifiques, etc. Les étudiants qui ne comprennent pas peuvent lire le didacticiel XPath .

from lxml import etree
def parse_html(self):
        logging.info('parse html')
        # pre process
        self.html_content = self.pre_process(self.html_content)
        
        # parse dom
        dom = etree.fromstring(self.html_content)
        plist = dom.xpath('//p/text()')
        audio_texts = []

		# 示例,比如从 1010 段开始,获取后面 10 个段落
        idx_start = 1010
        for p in plist[idx_start:idx_start+10]:
            #logging.info('{}'.format(p))
            audio_texts.append(p)
        
        self.text = ''.join(audio_texts)
        logging.info('content length {}'.format(len(self.text)))

Ce qui précède est le module d'analyse de livres électroniques, encapsulé dans la classe AudioBookGenerator, voir src/audio_book_generator.py pour plus de détails .

Étape 2 : Synthèse vocale audio

La synthèse vocale vocale nécessite un service TTS de synthèse vocale tiers. Après avoir étudié les services PaaS des fournisseurs de cloud computing courants sur le marché, nous avons décidé d'utiliser le service Tencent Cloud TTS.

Je pense qu'il y a trois meilleurs points :

  1. La documentation de développement est basée sur le point de vue du développeur et semble très fluide.
  2. L'interface de synthèse de texte long prend en charge jusqu'à 100 000 mots et peut synthétiser complètement un chapitre, ce qui convient aux scénarios de synthèse de livres audio sans fractionnement fréquent du texte.
  3. Le son de Zhixiaoyao et la capacité de soutenir la narration conviennent aux scènes de roman ; en particulier lorsqu'elles contiennent des dialogues de personnages, la narration et le dialogue sont clairement superposés après avoir été séparés.

Concernant l'enregistrement et l'activation du service, le document officiel est très détaillé, je n'entrerai donc pas dans les détails. Vous pouvez vous référer à Tencent Cloud TTS .

Une fois le service activé, ouvrez la page de gestion des clés API dans la console , copiez la clé d'accès suivante et configurez-la dans le fichier de configuration.

Fichier de configuration src/config.py

class Config(object) : 
    SECRET_ID = 'XXXX' # Correspond au SecretId ci-dessus 
    SECRET_KEY = 'XXXX' # Correspond au SecretKey ci-dessus

Voyons comment utiliser le SDK fourni par le site officiel pour appeler le service de synthèse vocale.

Ouvrez le document de développement officiel pour la synthèse de texte long , faites défiler vers le bas et trouvez le sdk correspondant. Ici, nous utilisons python sdk

Intégrez le SDK dans notre projet.

La synthèse de texte long est un service asynchrone qui fournit deux interfaces pour les appels de service.

  1. Créer une interface de tâches synthétiques : CreateTtsTask
  2. Statut de la tâche de requête et interface de résultat : DescribeTtsTaskStatus

Les fonctions create_task et query_task ci-dessous sont encapsulées respectivement pour ces deux fonctions.

Il convient de noter que lors de l'interrogation de l'état de la tâche, la tâche peut ne pas être terminée, vous devez donc boucler la requête après un certain temps jusqu'à ce que la tâche soit terminée (succès ou échec).

Créer une tâche : CreateTtsTask

Lors de votre appel, faites attention à deux paramètres

  • VoiceType : ID vocal, utilisé pour sélectionner différents locuteurs. Le Zhixiaoyao (100510000) déterminé lors de la recherche précédente est utilisé ici. Il semble très approprié pour les scènes d'arts martiaux ou de romans fantastiques.
  • VoiceoverDialogueSplit : l'option de prise en charge du dialogue voix off doit être définie sur True, vous pouvez diviser le dialogue et la narration dans le texte et les synthétiser avec les timbres correspondants.

Une fois la demande réussie, l'ID unique de la tâche est renvoyé : TaskId 

def create_task(self) -> str:
        task_id = ''

        req = models.CreateTtsTaskRequest()
        req.Text = self.text # 合成文本
        req.VoiceType = self.voice_type # 设置音色id,此处选用 智逍遥100510000
        req.VoiceoverDialogueSplit = self.voiceover_dialogue_split # 打开旁对白支持
        req.Codec = self.codec
        req.SampleRate = self.sample_rate
        req.ModelType = self.model_type
        try:
            resp = self.client.CreateTtsTask(req)
            task_id = resp.Data.TaskId
            req_id = resp.RequestId
            print('call CreateTtsTask succeed, task_id: {} request_id: {}'.format(task_id, req_id))
        except TencentCloudSDKException as err:
            print('call CreateTtsTask failed, err: {}'.format(str(err)))
        
        return task_id

Statut et résultats de la tâche de requête : DescribeTtsTaskStatus

Lors de l'appel, transmettez le TaskId obtenu ci-dessus en paramètre, et la requête renverra des informations liées à la tâche en temps réel, notamment

  • Statut : statut de la tâche
  • ErrorMsg : message d'erreur de tâche (lorsque la tâche échoue)
  • ResultUrl : adresse audio synthétisée
def query_task(self, task_id):
        req = models.DescribeTtsTaskStatusRequest()
        req.TaskId = task_id
        try:
            resp = self.client.DescribeTtsTaskStatus(req)
            data = resp.Data
            req_id = resp.RequestId
            print('call DescribeTtsTaskStatus succeed, data: {} request_id: {}'.format(str(data), req_id))
        except TencentCloudSDKException as err:
            print('call DescribeTtsTaskStatus failed, err: {}'.format(str(err)))

        if data:
            return data.Status, data.ErrorMsg, data.ResultUrl # 任务状态、错误信息、音频文件地址
        else:
            return 3, 'internal error', ''

Ce qui précède est le module de synthèse vocale de livre audio, encapsulé dans la classe TencentSDK, voir src/tencent_sdk.py pour plus de détails .

Troisième étape : terminer le script de production du livre audio

Grâce au script principal, le module d'analyse de livres électroniques et le module de synthèse vocale des deux étapes précédentes sont intégrés, et la fonction de téléchargement de fichiers est ajoutée pour compléter le script de production de livres audio.

Pour l'URL audio synthétisée renvoyée par le service Tencent Cloud TTS, la classe HttpAgent est ajoutée pour télécharger le fichier binaire audio localement.

from audio_book_generator import AudioBookGenerator
from http_agent import HttpAgent

def main():
    file_name = sys.argv[1]
    logging.info('upload file: {}'.format(file_name))

    # gen audio
    generator = AudioBookGenerator()
    generator.process(file_name)
    audio_url = generator.get_audio_url()
    logging.info('get audo url: {}'.format(audio_url))
    
    # download audio
    session_path = os.environ.get('SESSION_PATH', './')
    audio_name = os.path.join(session_path, 'result.mp3')
    agent = HttpAgent()
    agent.download(audio_url, audio_name)
    logging.info('download audio to: {}'.format(audio_name))

Pour plus de détails sur HttpAgent, consultez le fichier src/http_agent.py .

L'outil local est terminé et peut être appelé via la commande suivante pour voir l'effet.

(venv) justin@VM_centos:[~/audio_book/src]: python main.py ../dou.mobi 
2022-06-21 10:36:44,959 - main.py[line:13] - INFO: upload file: ../dou.mobi
2022-06-21 10:36:44,959 - /home/justin/audio_book/src/audio_book_generator.py[line:26] - INFO: begin to parse file
2022-06-21 10:36:47,253 - /home/justin/audio_book/src/audio_book_generator.py[line:30] - INFO: extract ../dou.mobi to /tmp/mobiexk287bwzw/mobi7/book.html. cost 2294ms
2022-06-21 10:36:47,293 - /home/justin/audio_book/src/audio_book_generator.py[line:35] - INFO: load file total 4988080 chars
2022-06-21 10:36:47,295 - /home/justin/audio_book/src/audio_book_generator.py[line:38] - INFO: clean temp dir /tmp/mobiexk287bwzw
2022-06-21 10:36:47,295 - /home/justin/audio_book/src/audio_book_generator.py[line:45] - INFO: parse html
2022-06-21 10:36:47,506 - /home/justin/audio_book/src/audio_book_generator.py[line:60] - INFO: content length 625
2022-06-21 10:36:47,549 - /home/justin/audio_book/venv/lib64/python3.6/site-packages/urllib3/connectionpool.py[line:1005] - DEBUG: Starting new HTTPS connection (1): tts.tencentcloudapi.com:443
2022-06-21 10:36:47,699 - /home/justin/audio_book/venv/lib64/python3.6/site-packages/urllib3/connectionpool.py[line:465] - DEBUG: https://tts.tencentcloudapi.com:443 "POST / HTTP/1.1" 200 125
2022-06-21 10:36:47,701 - /home/justin/audio_book/venv/lib64/python3.6/site-packages/tencentcloud/common/http/request.py[line:112] - DEBUG: GetResponse Status: 200
Header: Server: nginx
Date: Tue, 21 Jun 2022 02:36:41 GMT
Content-Type: application/json
Content-Length: 125
Connection: keep-alive
Data: {"Response":{"RequestId":"ffb6f632-bd56-427d-ae21-xxxx","Data":{"TaskId":"gz-27ac44ab-c21e-4e58-b0b3-xxxx"}}}

call CreateTtsTask succeed, task_id: gz-27ac44ab-c21e-4e58-b0b3-xxxx request_id: ffb6f632-bd56-427d-ae21-xxxx

2022-06-21 10:37:27,964 - /home/justin/audio_book/venv/lib64/python3.6/site-packages/urllib3/connectionpool.py[line:1005] - DEBUG: Starting new HTTPS connection (1): tts.tencentcloudapi.com:443
2022-06-21 10:37:28,016 - /home/justin/audio_book/venv/lib64/python3.6/site-packages/urllib3/connectionpool.py[line:465] - DEBUG: https://tts.tencentcloudapi.com:443 "POST / HTTP/1.1" 200 576
2022-06-21 10:37:28,017 - /home/justin/audio_book/venv/lib64/python3.6/site-packages/tencentcloud/common/http/request.py[line:112] - DEBUG: GetResponse Status: 200
Header: Server: nginx
Date: Tue, 21 Jun 2022 02:37:21 GMT
Content-Type: application/json
Content-Length: 576
Connection: keep-alive
Data: {"Response":{"RequestId":"7c4c20d3-ad79-47ea-86a8-xxxx","Data":{"TaskId":"gz-27ac44ab-c21e-4e58-b0b3-xxxx","Status":2,"StatusStr":"success","ResultUrl":"https://xxxx","ErrorMsg":""}}}

call DescribeTtsTaskStatus succeed, data: {"TaskId": "gz-27ac44ab-c21e-4e58-b0b3-xxxx", "Status": 2, "StatusStr": "success", "ResultUrl": "https://xxxx", "ErrorMsg": ""} request_id: 7c4c20d3-ad79-47ea-86a8-xxxx
2022-06-21 10:37:28,580 - /home/justin/audio_book/venv/lib64/python3.6/site-packages/urllib3/connectionpool.py[line:465] - DEBUG: https://xxxx:443 "GET /xxxx HTTP/1.1" 200 535248
http download succ: https://xxxx -> ./result.mp3
2022-06-21 10:37:29,001 - main.py[line:26] - INFO: download audio to: ./result.mp3

Le fichier audio result.mp3 peut être généré normalement. Il y a une démo audio en annexe, vous pouvez l'écouter, l'effet est plutôt bon.

Étape 4 : Visualisation du script

Le script de production du livre audio est terminé, mais le script n'est toujours pas pratique à utiliser et ne peut pas être utilisé par d'autres.

Ici, vous devez visualiser le script et le déployer en tant qu'outil Web.

La bibliothèque open source Wooey est utilisée ici, qui présente les avantages suivants :

  • En compilant une classe d'adaptation, l'outil de script peut être facilement converti en une page Web interactive.
  • Prend en charge les composants interactifs courants de l'interface utilisateur, tels que les listes déroulantes, les téléchargements de fichiers, etc., qui peuvent être affichés sur la page via la configuration du code sans aucune connaissance frontale.
  • Prend en charge des fonctions telles que le démarrage de tâches, le processus d'exécution d'écho, le téléchargement du fichier de résultats, etc.

La classe d'adaptation est la suivante, ajoutant un composant de téléchargement de fichiers via l'analyseur

import os
import sys
import argparse

parser = argparse.ArgumentParser(description="convert mobi file to audio")
parser.add_argument('--audio', help='the mobi file to make audio', type=argparse.FileType('r'), required=True) # 文件上传组件

def audio_book(mobi_file):
    _format = mobi_file.split('.')[-1].lower()
    if _format != 'mobi':
        print('only mobi is supported')
        return
    
    # TODO: 此处填写业务逻辑

if __name__ == '__main__':

    args = parser.parse_args()
    audio_book(args.audio.name)

Appelez l'outil de script de production de livres électroniques et utilisez python venv pour isoler les variables d'environnement de wooey et le script de l'outil, permettant ainsi à la plate-forme wooey d'intégrer plus facilement d'autres scripts.

SCRIPT_PATH = '/root/audio_book'

def audio_book(mobi_file):
    # ...
    # TODO: 此处填写业务逻辑
    cmd = []
    cmd.append('export SESSION_PATH={}'.format(os.getcwd())) # 传输本次执行 session 路径到脚本
    cmd.append('cd {}'.format(SCRIPT_PATH))
    cmd.append('source {}/venv/bin/activate'.format(SCRIPT_PATH))
    cmd.append('cd src')
    cmd.append('python main.py {}'.format(mobi_file))
    cmd.append('cd ')
    cmd = '&&'.join(cmd)

    print(cmd)
    os.system(cmd)

Ajouter des scripts à la plateforme de visualisation

[root@VM-centos ~/TOOLS]# python manage.py addscript ../audio_book/audio_book_adaptor.py --group 小工具
Conversion ../audio_book/audio_book_adaptor.py 
0 script converti

Tout le travail est fait, profitons des effets.

3. Expérience produit

Synthétisez votre premier livre audio

Ouvrez la plateforme d'outils et sélectionnez l'outil de création de livre audio

 

Cliquez sur le bouton [Sélectionner un fichier] pour télécharger le fichier de livre électronique que vous souhaitez convertir.

Démarrez la tâche et vous pourrez voir le journal d'exécution du script à partir de la page

Une fois l'exécution de la tâche terminée, l'état indique succès. Vous pouvez cliquer sur result.mp3 pour télécharger à partir de la liste des fichiers en bas de la page.

À ce stade, l'ensemble de l'outil de production de livres audio est terminé et le code audio et technique de l'audition se trouve en annexe.

Concernant l'effet du livre audio, les étudiants intéressés peuvent le télécharger depuis l'annexe et l'écouter, je pense personnellement qu'il est plutôt bien.

La partie code d'ingénierie est essentiellement disponible prête à l'emploi. Si vous êtes intéressé, vous pouvez la télécharger et l'exécuter. Vous pouvez également ajouter certaines fonctionnalités dont vous avez besoin sur cette base.

D'accord, arrêtons-nous ici ~~

annexe

En savoir plus sur les informations sur le produit de synthèse vocale Tencent Cloud AI : Speech Synthesis_Voice Customization_text-to-speech service-Tencent Cloud 

Je suppose que tu aimes

Origine blog.csdn.net/tencentAI/article/details/126420690
conseillé
Classement