[Python] ai音色翻译器

news/2024/9/24 6:29:07/

之前看到了ai voice有些许兴趣便玩了玩,用花儿不哭大佬制作的rvc推理包做了几个模型,可能因为训练量和杂音的原因导致最后使用的效果不佳,后关注到花儿不哭大佬新的GPT-SoVITS项目。这个由于是文字转语音,训练出来的效果好上很多,但是是tts,没法用做变声器,而且推理时间相对rvc变声器过长。因此发现可以以语音转文字然后翻译再转为音频,以当做一个翻译器来用。

项目使用需有GPT-SoVITS的后端接口所以选择了箱庭XTer的推理包,给了相应接口给与调用

https://www.yuque.com/xter/zibxlp/kkicvpiogcou5lgp


模型训练:

https://github.com/RVC-Boss/GPT-SoVITS


翻译使用谷歌翻译,调用对应api。参考编写

https://www.52pojie.cn/thread-1730501-1-1.html
备用api参考:
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1903090&highlight=%B9%C8%B8%E8%B7%AD%D2%EB


由于语音转文字使用的是python的vosk库需去网址下载对应的模型文件(感觉识别准确度不够高)

https://alphacephei.com/vosk/models
<blockquote>import sounddevice as sd
import vosk
import queue
import json
import os
import sys
import requests
import pyaudio
import requests
from requests.exceptions import JSONDecodeError
from bs4 import BeautifulSoup# 初始化队列
q = queue.Queue()# 设置音频输入设备的采样率
samplerate = 16000# 确保模型路径正确
model_path = "E:/aivoice/vosk-model-cn-0.22"  # 替换为你的模型文件夹路径,例如 "vosk-model-small-cn-0.3"# 检查模型路径是否存在
if not os.path.exists(model_path):print(f"模型路径 {model_path} 不存在,请检查路径是否正确。")sys.exit(1)# 加载Vosk模型
model = vosk.Model(model_path)def translate_text(text,source_lang='',target_lang='ja'):                     #接口1:https://findmyip.net/api/translate.php# url = f"https://findmyip.net/api/translate.php?text={text}"url =f"https://findmyip.net/api/translate.php?text={text}&source_lang={source_lang}&target_lang={target_lang}"response = requests.get(url)try:data = response.json()print(data)if response.status_code == 200:if data['code']== 200:translation = data['data']['translate_result']print("translation",translation)return translationelif data['code'] == 400:return "出错"else:return "内部接口错误,请联系开发者"else:return "内部接口错误,请联系开发者"    except JSONDecodeError as e:return "出错"except requests.RequestException as e:return "出错"    def google_translate_text(text,source_lang='zh-CN',target_lang='ja'):         #接口2:https://translate.google.comurl = "https://www.google.com.hk/async/translate"# word="你好"payload = f"async=translate,sl:{source_lang},tl:{target_lang},st:{text},id:1672056488960,qc:true,ac:true,_id:tw-async-translate,_pms:s,_fmt:pc"payload_encoded = payload.encode('utf-8')headers = { 'sec-ch-ua': '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"', 'DNT': '1', 'sec-ch-ua-mobile': '?0', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 'sec-ch-ua-arch': '"x86"', 'sec-ch-ua-full-version': '"108.0.5359.125"', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'sec-ch-ua-platform-version': '"10.0.0"', 'sec-ch-ua-full-version-list': '"Not?A_Brand";v="8.0.0.0", "Chromium";v="108.0.5359.125", "Google Chrome";v="108.0.5359.125"', 'sec-ch-ua-bitness': '"64"', 'sec-ch-ua-model': '', 'sec-ch-ua-wow64': '?0', 'sec-ch-ua-platform': '"Windows"', 'Accept': '*/*', 'X-Client-Data': 'CKW1yQEIhbbJAQiktskBCMS2yQEIqZ3KAQjb08oBCLD+ygEIlaHLAQjv8swBCN75zAEI5PrMAQjxgM0BCLKCzQEI7ILNAQjIhM0BCO+EzQEIt4XNAQ==', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'host': 'www.google.com.hk', 'Cookie': '1P_JAR=2022-12-26-12; NID=511=eVLI1bG9nhyOZtqU14JBHm5Be00epdxfR4XmfQeehYyIkzgpXi6dbpNY75ZMVyS7aOjoM2oZ5WdoR8eNq6wi1-e_J0NeoyI0dtsHW-_8Ik4PGrqvuGHdcvVC03zTOEK2TY1FZL85Wimo_ZPIE3hGIrmGPSiel6-rRRW9lD30UPs'} response = requests.request("POST", url, headers=headers, data=payload_encoded) html=response.textsoup = BeautifulSoup(html, 'html.parser')target_text = soup.find('span', {'id': 'tw-answ-target-text'})if target_text:print(target_text.get_text())return target_text.get_text()return None# return response# 定义回调函数
def callback(indata, frames, time, status):if status:print(status, file=sys.stderr)q.put(bytes(indata))# 定义发送文字到文本到语音服务并播放音频的函数
def text_to_speech(text):stream_url = f'http://127.0.0.1:5000/tts?character=holi&text={text}&stream=true'# 初始化pyaudiop = pyaudio.PyAudio()# 打开音频流stream = p.open(format=p.get_format_from_width(2),channels=1,rate=32000,output=True)# 使用requests获取音频流response = requests.get(stream_url, stream=True)# 读取数据块并播放for data in response.iter_content(chunk_size=1024):stream.write(data)# 停止和关闭流stream.stop_stream()stream.close()# 终止pyaudiop.terminate()# 打开音频流
with sd.RawInputStream(samplerate=samplerate, blocksize=8000, device=2, dtype='int16',channels=1, callback=callback):                      #device是所使用的录入设备,需要自行调整,可通过代码输出查看所有设备列表进行更改print('#' * 80)print('按 Ctrl+C 结束')print('#' * 80)rec = vosk.KaldiRecognizer(model, samplerate)last_partial = ""while True:data = q.get()if rec.AcceptWaveform(data):result = rec.Result()result_json = json.loads(result)recognized_text = result_json['text']print(f"识别结果: {recognized_text}")last_partial = ""# 将识别结果发送到文本到语音服务并播放音频if recognized_text:# translated_text=translate_text(recognized_text)                                          #调用接口1translated_text=google_translate_text(recognized_text,'zh-CN','ja')                        #调用接口2  前一个是输入语言(需跟vosk模型一样),后一个是翻译后的语言text_to_speech(translated_text)else:partial_result = rec.PartialResult()partial_result_json = json.loads(partial_result)new_partial = partial_result_json['partial']# 分割新旧部分的不同内容new_words = new_partial[len(last_partial):].strip().split()if new_words:print(f"部分识别结果: {' '.join(new_words)}")last_partial = new_partial</blockquote>


http://www.ppmy.cn/news/1503969.html

相关文章

python爬虫【3】—— 爬虫反反爬

一、常见的反爬手段和解决方法 二、splash 介绍与安装 三、验证码识别 图片验证码的处理方案 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况图像识别引擎解析 使用光学识别引擎处理图片中的数据&#xff0c;目前常用于图片数据提取&#xff0c;较少用于验证码…

CAPL使用结构体的方式组装一条DoIP车辆声明消息(方法1)

如果你参加过我的《CAPL编程系统性课程》,你就结构体类型天然就能表示报文结构,用结构体表示报文虽然麻烦,但灵活度更高。 我们今天试着用结构体类型表示DoIP车辆声明消息的DoIP报头,然后组装一条DoIP消息发送出去。 DoIP消息结构如下: DoIP车辆声明消息结构如下: /**…

生成式人工智能(AIGC):开发者的得力助手还是职业威胁?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在当今软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;技术正在以前所未有的方式改变着开发者的工作…

手撕数据结构---栈和队列的概念以及实现

栈的概念&#xff1a; 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈…

Spring Boot中的 6 种API请求参数读取方式

​ 博客主页: 南来_北往 &#x1f525;系列专栏&#xff1a;Spring Boot实战 前言 在利用Spring Boot框架开发应用程序接口时&#xff0c;从客户端请求中提取参数是一项基础而关键的任务。Spring Boot为了迎合各式各样的接口设计需求&#xff0c;提供了多样化的机制以供开…

spring boot + vue3 接入钉钉实现扫码登录

1&#xff1a;准备工作 1.1&#xff1a;进入钉钉开放平台创建开发者应用。应用创建和类型介绍&#xff0c;参考下方。 应用类型介绍 - 钉钉开放平台 (dingtalk.com) 应用能力介绍 - 钉钉开放平台 (dingtalk.com) 扫码登录第三方网站 - 钉钉开放平台 (dingtalk.com) 1.2&…

全开源TikTok跨境商城源码/TikTok内嵌商城+搭建教程/前端uniapp+后端

多语言跨境电商外贸商城 TikTok内嵌商城&#xff0c;商家入驻一键铺货一键提货 全开源完美运营 海外版抖音TikTok商城系统源码&#xff0c;TikToK内嵌商城&#xff0c;跨境商城系统源码 接在tiktok里面的商城。tiktok内嵌&#xff0c;也可单独分开出来当独立站运营 二十一种…

Unity-Redis数据存储

1.Redis 安装测试&#xff1a;   安装&#xff1a;     安装包 链接&#xff1a;https://pan.baidu.com/s/1BzuqRNJHW1MiB4xm4UT4MA 提取码&#xff1a;pvrj   使用:     运行包内 redis-server.exe 启动 Redis 服务 &#xff0c;运行包内 redis-cli.exe 启动客户端…