Python让AI虚拟主播接入微软Azure语音合成并精准嘴型同步

本文介绍了如何使用Python将微软Azure的文本转语音服务与虚拟主播软件Motionface结合,实现语音合成的mp3文件转为wav,并进行嘴型同步。通过ffmeg进行音频格式转换,然后通过python脚本将wav音频文件传递给Motionface以驱动嘴型同步。
摘要由CSDN通过智能技术生成

上一篇文字中讲了利用Python实现利用微软Azure无限免费将文本转mp3格式的音频文件并下载到本地。微软Azure TTS的优点不用多说,今天将讲如何利用Python将其接入到虚拟主播中来。

订阅专栏,我将免费向您提供具体的方案。

看过专栏其他文章的朋友,一定知道,我们使用的虚拟主播软件为Motionface,其支持一些简单好用的接口。我们先看看Motionface的效果:

我们看到了其要求是需要wav格式的音频来驱动嘴型同步,但是微软Azure语音合成为mp3格式,这时,我们需要将mp3音频文件转换成wav的音频切采样率为11025。

这个转换过程是利用ffmeg,通过python脚本调用实现。

ffmpeg -i mp3\output_1649494987952.mp3 -f wav -ac 1 -ar 16000 ./output_1649494987952.wav

开始python代码吧!

from ffmpy import FFmpeg as mpy
import os 

def read_folder(mp3_folder, wav_folder):
    '''
    文件夹读取函数
    :param mp3_folder:
    :param wav_folder:
    :return:
    '''
    # 遍历需要转换的MP3文件夹中的MP3文件
    for a in os.listdir(mp3_folder):
        # 创建MP3文件的绝对路径
        mp3_file = os.path.join(mp3_folder, a)
        # 调用格式转换函数
        trans_to_wav(mp3_file, wav_folder)

def trans_to_wav(mp3_file, wav_folder):
    '''
    格式转换格式
    :param mp3_file:
    :param wav_folder:
    :return:
    '''
    # 格式化文件
    file_fmt = os.path.basename(mp3_file).strip()
    # 获取文件格式
    file_fmt = file_fmt.split('.')[-1]
    # 校验文件格式
    if file_fmt.strip() != 'mp3':
        raise Exception('改文件不是MP3格式,请检查!')
    elif file_fmt.strip() == '':
        raise Exception('文件格式出现异常,请检查!')
    # 创建wav的文件以供转换完成后输出
    wav_file_path = os.path.join(wav_folder)
    wav_file_path = os.path.join(wav_file_path, '{}.{}'.format(
        os.path.basename(mp3_file).strip().split('.')[0], 'wav'
    ))
    # 创建转换时的命令行参数字符串
    cmder = '-f wav -ac 1 -ar 11025'
    # 创建转换器对象
    mpy_obj = mpy(executable='ffmpeg.exe',
        inputs={
            mp3_file: None
        },
        outputs={
            wav_file_path: cmder
        }
    )
    print('执行CMDER 命令:{}'.format(mpy_obj.cmd))
    mpy_obj.run()

if __name__ == '__main__':
    '''
    主函数入口
    '''
    # 输入MP3文件夹
    mp3_folder = input('输入MP3文件夹路径:\n')
    # 校验MP3文件夹是否存在
    if mp3_folder.strip() == '':
        raise Exception('输入空值,请检查!')
    elif mp3_folder.strip() != '':
        if os.path.exists(mp3_folder) is False:
            raise Exception('文件路径不存在')
    # 输入wav文件夹路径
    wav_folder = input('输入wav文件夹路径:\n')
    # 校验wav文件夹是否存在
    if wav_folder.strip() == '':
        raise Exception('输入空值,请检查!')
    elif wav_folder.strip() != '':
        if os.path.exists(wav_folder) is False:
            raise Exception('文件路径不存在')
    # 调用文件夹读取批量文件
    read_folder(mp3_folder, wav_folder)

 接下来,我们将利用python,将wav音频文件传给motionface即可进行嘴型同步了:

import sys
import threading
import urllib
import ssl

from urllib.parse import urlparse

from scripts import watcher, webdriver
from config.helper import config
import requests



def sendFile(filename, filepath):
    url =   "http://192.168.3.131:8080/cgi/savewav"
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'}
    files = {'file': open(filepath, 'rb') }
    files1 = {
        'file':(filename,open(filepath, 'rb'), 'audio/wav')
    }

    data = {
            'file':filename,
            'objectName': filename,
            'fileDownloadName': filename,
        }
    upload_res = requests.post(url,
                                   data=data,
                                   files=files1)



if __name__ == '__main__':
    print('1')
    sendFile('rec.wav','rec.wav')


1.注册 Microsoft Azure 帐户并创建语音服务。您可以在 Microsoft Azure 门户中创建自己的语音服务。在创建语音服务时,您需要选择订阅、位置和定价层。根据您的预算和需求,选择一个合适的定价层。创建好语音服务后,记下该服务的订阅密钥和区域。 2.下载 Microsoft Cognitive Services SDK for Unity。在 Microsoft Cognitive Services SDK for Unity 网站上下载最新版本的 SDK。解压缩下载的文件,并将其添加到 Unity 项目中。 3.编写代码。在 Unity 中编写代码以与 Microsoft Cognitive Services SDK 进行交互。以下是一个示例代码: ``` using UnityEngine; using UnityEngine.Networking; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; public class TextToSpeech : MonoBehaviour { public Text text; public AudioSource audioSource; private string subscriptionKey = "YOUR_SUBSCRIPTION_KEY_HERE"; private string region = "YOUR_REGION_HERE"; private string endpoint = "https://" + region + ".tts.speech.microsoft.com/cognitiveservices/v1"; private string voiceName = "en-US-Jessa24kRUS"; private float pitch = 0.5f; private float rate = 0.5f; private string format = "riff-24khz-16bit-mono-pcm"; private string authToken = ""; private string audioData = ""; private bool isSpeaking = false; IEnumerator GetToken() { UnityWebRequest www = UnityWebRequest.Post("https://" + region + ".api.cognitive.microsoft.com/sts/v1.0/issueToken", ""); www.SetRequestHeader("Ocp-Apim-Subscription-Key", subscriptionKey); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { authToken = www.downloadHandler.text; } } IEnumerator GetAudio() { List<IMultipartFormSection> formData = new List<IMultipartFormSection>(); formData.Add(new MultipartFormDataSection("text", text.text)); formData.Add(new MultipartFormDataSection("voice", voiceName)); formData.Add(new MultipartFormDataSection("pitch", pitch.ToString())); formData.Add(new MultipartFormDataSection("rate", rate.ToString())); formData.Add(new MultipartFormDataSection("format", format)); UnityWebRequest www = UnityWebRequest.Post(endpoint, formData); www.SetRequestHeader("Authorization", "Bearer " + authToken); www.timeout = 60; www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { audioData = www.downloadHandler.text; audioSource.clip = WavUtility.ToAudioClip(audioData); audioSource.Play(); isSpeaking = false; } } public void Speak() { if (!isSpeaking) { isSpeaking = true; StartCoroutine(GetToken()); StartCoroutine(GetAudio()); } } } ``` 在代码中,我们使用了 Microsoft Cognitive Services SDK for Unity 中的 TTS (Text-to-Speech) API。我们首先需要获取一个访问令牌,然后使用该令牌向 API 发送请求来获取音频数据。然后我们使用 WavUtility.ToAudioClip() 方法将音频数据转换为 AudioClip,并将其播放出来。 4.在 Unity 中使用 TextToSpeech 类。在 Unity 中创建一个新的游戏对象,并将 TextToSpeech 脚本添加到该对象中。将您要转换为语音的文本添加到 Text 组件中。在 Unity 中单击 “Play” 按钮,您应该可以听到该文本转换为语音的声音。 这就是将微软语音合成接入 Unity 的基本步骤。您可以根据自己的需求和技能水平对代码进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Softboy_TM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值