ChatTTS+Python编程搞定语音报时小程序

文字转语音神器+Python编程搞定语音报时小程序

今天一个好哥们发了一个文字转语音的AI神器的短视频。这个神器的网站是[ChatTTS - Text-to-Speech for Conversational Scenarios][https://chattts.com/],如下图所示:

Screenshot 2024-05-30 at 19.36.49

Screenshot 2024-05-30 at 19.37.24

这个开源项目可以从github.com上下载,也可以在这个网页下载。如下图所示:

Screenshot 2024-05-30 at 19.41.02

在主页上大概体验了一下,文字转语音还可以,但是有些生字(镇赉县)还是不能正常识别,比方说这个”赉“字。还有就是阿拉伯数字也不能正常识别。但是可以通过程序转成汉字,然后就可以了。言归正传,这个开源项目给我的最好的体会就是免费,于是按照上图所示的步骤,下载了源码并安装了依赖库,强调一下,这个源码运行环境在Anaconda下可以,PyCharm我的电脑不能运行,报错。

我首先想到的是利用这个API编一个语音报时的小程序,之前我编了一个万年历,这回可以实现语音播报了。我首先实现一个简单的报时小程序。

下载之后的源码文件夹拷贝到你指定的目录下面,然后进入Anaconda的Jupyter-Notebook下,打开

上面说到了,阿拉伯数字是不能准确识别的。但是用datetime模块生成的时间或者日期都是阿拉伯数字,必须转成汉字才可以利用这个开源模块实现语音播报。

环境

操作系统:macOS Sonoma

开发环境:Anaconda+Python 3.11

源码如下:

import torch
import ChatTTS
from IPython.display import Audio
import datetime


chat = ChatTTS.Chat()
chat.load_models()

# 定义一个类
class PeriodDay:
    def __init__(self):
        self.now = datetime.datetime.now()

    def get_time_of_day(self):
        if self.now.hour < 12:
            return "上午"
        elif 12 <= self.now.hour < 18:
            return "下午"
        else:
            return "晚上"

    # 定义一个时间转成汉字的函数
    def format_time_final(self):
        hour, minute = self.now.strftime('%H:%M').split(':')
        if int(minute) == 0:
            minute = '整'
        elif int(minute) < 10:
            minute = '零' + number_to_chinese(int(minute)) + '分'
        elif int(minute) < 20:
            minute = number_to_chinese(int(minute))[1:] + '分'
        else:
        	minute = number_to_chinese(int(minute)) + '分'

        if 10 <= int(hour) < 20:
            hour = number_to_chinese(int(hour))[1:] + '时'
            return f'{hour} {minute}'
        else:
            return f'{number_to_chinese(int(hour))[:]}{minute}'

    def get_month_day(self):
        month = number_to_chinese(self.now.month)
        day = number_to_chinese(self.now.day)
        return month, day
    
    # 定义一个返回星期几的函数
    def get_weekday(self):
        date = self.now.strftime('%Y-%m-%d')
        # 将日期转换为datetime对象
        datetime_obj = datetime.datetime.strptime(date, '%Y-%m-%d')

        # 获取星期几的数字(0代表星期日,1代表星期一,...,6代表星期六)
        weekday = datetime_obj.strftime('%w')

        # 将星期几数字转换为中文星期几
        weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
        weekday_cn = weekdays[int(weekday)
        return weekday_cn


# 定义一个数字转成汉字的函数
def number_to_chinese(number):
    units = ['', '十']
    digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']

    if number == 0:
        return '零'

    result = ''
    digit_count = 0
    last_zero = True

    while number > 0:
        digit = number % 10
        number //= 10

        if digit == 0:
            result = digits[number] + '十'
            break
        if digit != 0:
            if last_zero:
                result = digits[digit] + result
            else:
                result = digits[digit] + units[digit_count] + result
            last_zero = False
        else:
            if not last_zero:
                result = digits[digit] + result
            last_zero = True

        digit_count += 1

    return result


# 实例化一个早中晚的对象
morning_noon_evening = PeriodDay()
# 获取当前的时段
time_of_day = morning_noon_evening.get_time_of_day()

# 利用当前时间提取月,日,时,分
month, day = morning_noon_evening.get_month_day()
# 将时:分转成汉字
text_time = morning_noon_evening.format_time_final()
# 要报时的文字
time_text = f"{time_of_day}好,现在是{month}{day}{week_day}  北京时间{text_time}。在干嘛?"
# 定义一个转成语音的文字列表变量
texts = [time_text]
print(time_text)
# 生成语音
wavs = chat.infer(texts, use_decoder=True)

# 播放语音
Audio(wavs[0], rate=24_000, autoplay=True)

运行效果如下:

INFO:ChatTTS.core:All initialized.
下午好,现在是五月三十一日 星期五  北京时间十四时 一十一分。在干嘛?
 10%|████▏                                     | 38/384 [00:00<00:09, 38.29it/s]
 15%|██████                                  | 309/2048 [00:05<00:32, 53.73it/s]

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671175.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]轮胎检测数据集VOC+YOLO格式439张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;439 标注数量(xml文件个数)&#xff1a;439 标注数量(txt文件个数)&#xff1a;439 标注类别…

智慧商砼搅拌车安监运营管理的创新实践

随着城市化进程的加速&#xff0c;商砼搅拌车作为城市建设的重要设备&#xff0c;其安全管理与运营效率直接关系到工程质量和施工进度。近年来&#xff0c;通过引入先进的4G无线视频智能车载终端套件&#xff0c;我们实现了对商砼搅拌车的高精度定位、实时音视频调度、实时油量…

队列——一种操作受限的线性表

队列 队列&#xff08;Queue&#xff09;简称队&#xff0c;也是一种操作受限的线性表&#xff0c;只允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素称为入队或进队&#xff0c;删除元素称为出队或离队。队列中的元素是先进先出&#xff08;Fir…

C++设计模式-桥接模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 29. 桥接模式 桥接模式将抽象与实现分离&#xff0c;使二者可以独立地变化。 应用&#xff1a;如在游戏开发中&#xff0c;多个角色和多个武器交叉组合时。可以使用桥接模式&#xff0c;定义角色抽象类&#xff0c;武器抽象…

注册北京个体工商户条件和办理时间

在北京这座充满活力的城市中&#xff0c;每天都有无数的创业者怀揣着梦想&#xff0c;踏上创业之路。然而&#xff0c;对于许多初次接触企业注册的人来说&#xff0c;往往对注册流程和时间感到困惑。特别是选择代理服务时&#xff0c;更希望了解一个大概的时间范围。那么&#…

Flutter开发效率提升1000%,Flutter Quick教程之对Widget进行删除,剪切,粘贴

一&#xff0c;删除操作 1&#xff0c;首先我们选中要删除的Widget。 2&#xff0c;在左边的侧边栏&#xff0c;点击删除按钮&#xff0c;即可完成对组件的删除操作。 二&#xff0c;剪切。剪切是相同的道理&#xff0c;都是先选中&#xff0c;再点击对应的按钮。 1&#xff…

拿捏AVL(C++)

文章目录 前言AVL树介绍模拟实现框架查找插入验证删除完整代码 性能分析总结 前言 在本篇文章中我&#xff0c;我们将会介绍一下有关AVL树的相关内容&#xff0c;并且对一些接口进行模拟实现。 AVL树介绍 为什么会有AVL树呢&#xff1f;&#xff1f; 我们在之前学习二叉树时…

UI的学习(一)

UI的学习(一) 文章目录 UI的学习(一)UIlabelUIButtonUIButton的两种形式UIButton的事件触发 UIView多个视图之间的关系 UIWindowUIViewController一个视图推出另一个视图 定时器和视图移动UISwitchUISlider和UIProgressSlid步进器与分栏控制器UITextFieldUIScrollView有关实现它…

【Python打包成exe】

Python打包成exe 前言一、理论知识打底二、实操开始----pyinstaller【Base环境下】【这是一个失败案例】规规矩矩 总结 前言 先放点参考 这个字多&#xff0c;写得很详细⇨用 Pyinstaller 模块将 Python 程序打包成 exe 文件&#xff08;全网最全面最详细&#xff0c;万字详述…

C语言王国——内存函数

目录 1 memcpy函数 1.1 函数表达式 1.2 函数模拟 2 memmove函数 2.1 函数的表达式 2.2 函数模拟 3 memset函数 3.1 函数的表达式 3.2 函数的运用 4 memcmp函数 4.1函数的表达式&#xff1a; 4.2 函数的运用 5 结论 接上回我们讲了C语言的字符和字符串函数&#…

UI案例——登陆系统

UI的登陆界面实例 在学习了UILabel&#xff0c;UIButton&#xff0c;UIView&#xff0c;UITextField的内容之后&#xff0c;我们就可以写一个简单的登陆界面 我们可以通过UILabel来编写我们显示在登陆界面上的文字比方说下面这两行字就是通过UILabel去实现的。 下面给出一下实现…

6.2 休息日 背包问题总结

就目前所遇到的01背包与完全背包作总结。 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包 动规五部曲 1.确定…

【Linux】System V 信号量

一、信号量的概念理论渗透 1.1 基本概念 共享资源&#xff1a;多个执行流&#xff0c;可以看到的一份资源临界资源&#xff1a;被保护起来的资源 —— 保护的方式&#xff1a;同步和互斥互斥&#xff1a;任何时候只能有一个进程在访问共享资源资源&#xff0c;一定要被程序员…

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下&#xff0c;一个上午都在床上趴着看完了《百年孤独》&#xff0c;撑伞去吃了个饭&#xff0c;又回到了宿舍。打开许久未开的老电脑&#xff0c;准备做题了。《百年孤独》讲了什么&#xff0c;想表达什么&#xff0c;想给读者留下什么&#xff0c;我不知道&am…

每日一题《leetcode-- LCR 025.两数相加||》

https://leetcode.cn/problems/lMSNwu/ 分别把给定的两个链表翻转&#xff0c;然后从头开始相加。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ //反转链表 struct ListNode* reverselist(struct ListNode*h…

项目中统一异常处理

项目中统一异常处理 1.异常处理框架图2.实现 1.异常处理框架图 异常处理除了输出在日志中&#xff0c;还需要提示给用户&#xff0c;前端和后端需要作一些约定&#xff1a; 错误提示信息统一以json格式返回给前端。以HTTP状态码决定当前是否出错&#xff0c;非200为操作异常。…

基于51单片机数控直流数控电源的设计

电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行…

Win10 Edge提示兼容性问题打不开|解决浏览器兼容性问题

Edge有时候会与某些安全软件不兼容&#xff0c;导致报错 报错代码&#xff1a;STATUS_INVALID_IMAGE_HASH 解决Edge浏览器兼容性问题方法/步骤&#xff1a; 1、按 Win R 组合键&#xff0c;打开运行&#xff0c;并输入 regedit 命令&#xff0c;确定或回车&#xff0c;可以…

大语言模型实战——最小化模型评测

1. 引言 现在国内外的主流模型&#xff0c;在新模型发布时都会给出很多评测数据&#xff0c;用以说明当前模型在不同数据集上的测评表现&#xff08;如下面llama3发布的评测数据&#xff09;。 这些评测数据是如何给出来的呢&#xff1f;这篇文章会用一个最小化的流程来还原下…

【Android】手动下载gradle插件包,解决gradle插件包下载不全问题。

问题描述 拉取别人的项目时&#xff0c;因为网络问题gradle插件包一直下载不全&#xff0c;一直build。 解决方案&#xff1a; 打开gradle>wrapper文件下gradle-wrapper.properties&#xff0c;查看需要下载gradle-7.2-bin.zip。 distributionBaseGRADLE_USER_HOME distr…