当前位置:   article > 正文

Python让AI虚拟主播接入微软Azure语音合成并精准嘴型同步_azure ai 语音和数字人唇

azure ai 语音和数字人唇

上一篇文字中讲了利用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代码吧!

  1. from ffmpy import FFmpeg as mpy
  2. import os
  3. def read_folder(mp3_folder, wav_folder):
  4. '''
  5. 文件夹读取函数
  6. :param mp3_folder:
  7. :param wav_folder:
  8. :return:
  9. '''
  10. # 遍历需要转换的MP3文件夹中的MP3文件
  11. for a in os.listdir(mp3_folder):
  12. # 创建MP3文件的绝对路径
  13. mp3_file = os.path.join(mp3_folder, a)
  14. # 调用格式转换函数
  15. trans_to_wav(mp3_file, wav_folder)
  16. def trans_to_wav(mp3_file, wav_folder):
  17. '''
  18. 格式转换格式
  19. :param mp3_file:
  20. :param wav_folder:
  21. :return:
  22. '''
  23. # 格式化文件
  24. file_fmt = os.path.basename(mp3_file).strip()
  25. # 获取文件格式
  26. file_fmt = file_fmt.split('.')[-1]
  27. # 校验文件格式
  28. if file_fmt.strip() != 'mp3':
  29. raise Exception('改文件不是MP3格式,请检查!')
  30. elif file_fmt.strip() == '':
  31. raise Exception('文件格式出现异常,请检查!')
  32. # 创建wav的文件以供转换完成后输出
  33. wav_file_path = os.path.join(wav_folder)
  34. wav_file_path = os.path.join(wav_file_path, '{}.{}'.format(
  35. os.path.basename(mp3_file).strip().split('.')[0], 'wav'
  36. ))
  37. # 创建转换时的命令行参数字符串
  38. cmder = '-f wav -ac 1 -ar 11025'
  39. # 创建转换器对象
  40. mpy_obj = mpy(executable='ffmpeg.exe',
  41. inputs={
  42. mp3_file: None
  43. },
  44. outputs={
  45. wav_file_path: cmder
  46. }
  47. )
  48. print('执行CMDER 命令:{}'.format(mpy_obj.cmd))
  49. mpy_obj.run()
  50. if __name__ == '__main__':
  51. '''
  52. 主函数入口
  53. '''
  54. # 输入MP3文件夹
  55. mp3_folder = input('输入MP3文件夹路径:\n')
  56. # 校验MP3文件夹是否存在
  57. if mp3_folder.strip() == '':
  58. raise Exception('输入空值,请检查!')
  59. elif mp3_folder.strip() != '':
  60. if os.path.exists(mp3_folder) is False:
  61. raise Exception('文件路径不存在')
  62. # 输入wav文件夹路径
  63. wav_folder = input('输入wav文件夹路径:\n')
  64. # 校验wav文件夹是否存在
  65. if wav_folder.strip() == '':
  66. raise Exception('输入空值,请检查!')
  67. elif wav_folder.strip() != '':
  68. if os.path.exists(wav_folder) is False:
  69. raise Exception('文件路径不存在')
  70. # 调用文件夹读取批量文件
  71. read_folder(mp3_folder, wav_folder)

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

  1. import sys
  2. import threading
  3. import urllib
  4. import ssl
  5. from urllib.parse import urlparse
  6. from scripts import watcher, webdriver
  7. from config.helper import config
  8. import requests
  9. def sendFile(filename, filepath):
  10. url = "http://192.168.3.131:8080/cgi/savewav"
  11. 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'}
  12. files = {'file': open(filepath, 'rb') }
  13. files1 = {
  14. 'file':(filename,open(filepath, 'rb'), 'audio/wav')
  15. }
  16. data = {
  17. 'file':filename,
  18. 'objectName': filename,
  19. 'fileDownloadName': filename,
  20. }
  21. upload_res = requests.post(url,
  22. data=data,
  23. files=files1)
  24. if __name__ == '__main__':
  25. print('1')
  26. sendFile('rec.wav','rec.wav')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/278362
推荐阅读
相关标签
  

闽ICP备14008679号