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()

<span class="token keyword">def</span> <span class="token function">get_time_of_day</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">if</span> self<span class="token punctuation">.</span>now<span class="token punctuation">.</span>hour <span class="token operator">&lt;</span> <span class="token number">12</span><span class="token punctuation">:</span>
        <span class="token keyword">return</span> <span class="token string">"上午"</span>
    <span class="token keyword">elif</span> <span class="token number">12</span> <span class="token operator">&lt;=</span> self<span class="token punctuation">.</span>now<span class="token punctuation">.</span>hour <span class="token operator">&lt;</span> <span class="token number">18</span><span class="token punctuation">:</span>
        <span class="token keyword">return</span> <span class="token string">"下午"</span>
    <span class="token keyword">else</span><span class="token punctuation">:</span>
        <span class="token keyword">return</span> <span class="token string">"晚上"</span>

<span class="token comment"># 定义一个时间转成汉字的函数</span>
<span class="token keyword">def</span> <span class="token function">format_time_final</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
    hour<span class="token punctuation">,</span> minute <span class="token operator">=</span> self<span class="token punctuation">.</span>now<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%H:%M'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">':'</span><span class="token punctuation">)</span>
    <span class="token keyword">if</span> <span class="token builtin">int</span><span class="token punctuation">(</span>minute<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>
        minute <span class="token operator">=</span> <span class="token string">'整'</span>
    <span class="token keyword">elif</span> <span class="token builtin">int</span><span class="token punctuation">(</span>minute<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">10</span><span class="token punctuation">:</span>
        minute <span class="token operator">=</span> <span class="token string">'零'</span> <span class="token operator">+</span> number_to_chinese<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>minute<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'分'</span>
    <span class="token keyword">elif</span> <span class="token builtin">int</span><span class="token punctuation">(</span>minute<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">20</span><span class="token punctuation">:</span>
        minute <span class="token operator">=</span> number_to_chinese<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>minute<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">'分'</span>
    <span class="token keyword">else</span><span class="token punctuation">:</span>
    	minute <span class="token operator">=</span> number_to_chinese<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>minute<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'分'</span>

    <span class="token keyword">if</span> <span class="token number">10</span> <span class="token operator">&lt;=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>hour<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">20</span><span class="token punctuation">:</span>
        hour <span class="token operator">=</span> number_to_chinese<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>hour<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">'时'</span>
        <span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f'</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>hour<span class="token punctuation">}</span></span><span class="token string"> </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>minute<span class="token punctuation">}</span></span><span class="token string">'</span></span>
    <span class="token keyword">else</span><span class="token punctuation">:</span>
        <span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f'</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>number_to_chinese<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>hour<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token format-spec">]</span><span class="token punctuation">}</span></span><span class="token string">时 </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>minute<span class="token punctuation">}</span></span><span class="token string">'</span></span>

<span class="token keyword">def</span> <span class="token function">get_month_day</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
    month <span class="token operator">=</span> number_to_chinese<span class="token punctuation">(</span>self<span class="token punctuation">.</span>now<span class="token punctuation">.</span>month<span class="token punctuation">)</span>
    day <span class="token operator">=</span> number_to_chinese<span class="token punctuation">(</span>self<span class="token punctuation">.</span>now<span class="token punctuation">.</span>day<span class="token punctuation">)</span>
    <span class="token keyword">return</span> month<span class="token punctuation">,</span> day

<span class="token comment"># 定义一个返回星期几的函数</span>
<span class="token keyword">def</span> <span class="token function">get_weekday</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
    date <span class="token operator">=</span> self<span class="token punctuation">.</span>now<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%Y-%m-%d'</span><span class="token punctuation">)</span>
    <span class="token comment"># 将日期转换为datetime对象</span>
    datetime_obj <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>strptime<span class="token punctuation">(</span>date<span class="token punctuation">,</span> <span class="token string">'%Y-%m-%d'</span><span class="token punctuation">)</span>

    <span class="token comment"># 获取星期几的数字(0代表星期日,1代表星期一,...,6代表星期六)</span>
    weekday <span class="token operator">=</span> datetime_obj<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%w'</span><span class="token punctuation">)</span>

    <span class="token comment"># 将星期几数字转换为中文星期几</span>
    weekdays <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'星期日'</span><span class="token punctuation">,</span> <span class="token string">'星期一'</span><span class="token punctuation">,</span> <span class="token string">'星期二'</span><span class="token punctuation">,</span> <span class="token string">'星期三'</span><span class="token punctuation">,</span> <span class="token string">'星期四'</span><span class="token punctuation">,</span> <span class="token string">'星期五'</span><span class="token punctuation">,</span> <span class="token string">'星期六'</span><span class="token punctuation">]</span>
    weekday_cn <span class="token operator">=</span> weekdays<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">(</span>weekday<span class="token punctuation">)</span>
    <span class="token keyword">return</span> weekday_cn

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

<span class="token keyword">if</span> number <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>
    <span class="token keyword">return</span> <span class="token string">'零'</span>

result <span class="token operator">=</span> <span class="token string">''</span>
digit_count <span class="token operator">=</span> <span class="token number">0</span>
last_zero <span class="token operator">=</span> <span class="token boolean">True</span>

<span class="token keyword">while</span> number <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">:</span>
    digit <span class="token operator">=</span> number <span class="token operator">%</span> <span class="token number">10</span>
    number <span class="token operator">//=</span> <span class="token number">10</span>

    <span class="token keyword">if</span> digit <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>
        result <span class="token operator">=</span> digits<span class="token punctuation">[</span>number<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">'十'</span>
        <span class="token keyword">break</span>
    <span class="token keyword">if</span> digit <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">:</span>
        <span class="token keyword">if</span> last_zero<span class="token punctuation">:</span>
            result <span class="token operator">=</span> digits<span class="token punctuation">[</span>digit<span class="token punctuation">]</span> <span class="token operator">+</span> result
        <span class="token keyword">else</span><span class="token punctuation">:</span>
            result <span class="token operator">=</span> digits<span class="token punctuation">[</span>digit<span class="token punctuation">]</span> <span class="token operator">+</span> units<span class="token punctuation">[</span>digit_count<span class="token punctuation">]</span> <span class="token operator">+</span> result
        last_zero <span class="token operator">=</span> <span class="token boolean">False</span>
    <span class="token keyword">else</span><span class="token punctuation">:</span>
        <span class="token keyword">if</span> <span class="token keyword">not</span> last_zero<span class="token punctuation">:</span>
            result <span class="token operator">=</span> digits<span class="token punctuation">[</span>digit<span class="token punctuation">]</span> <span class="token operator">+</span> result
        last_zero <span class="token operator">=</span> <span class="token boolean">True</span>

    digit_count <span class="token operator">+=</span> <span class="token number">1</span>

<span class="token keyword">return</span> 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]

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于深度学习的数字语音识别微信小程序是一种使用深度学习技术来实现语音识别功能的微信小程序。该小程序结合了深度学习、Flask框架和Python语言等技术。 在该小程序中,深度学习技术被应用于语音识别任务中,通过训练模型来识别和理解用户输入的语音信息。通过使用深度学习算法,模型可以自动学习特征并进行模式识别,从而提高对语音的准确度和鲁棒性。 Flask框架是一种轻量级的Python Web框架,它提供了搭建Web应用所需的基本组件和功能。在该小程序中,使用Flask框架来搭建服务器端的后台,并提供接收语音数据、进行预处理和特征提取的功能。 Python是一种简单易学且广泛使用的编程语言,在该小程序中使用Python语言编写相关代码和逻辑,包括实现深度学习模型的训练和测试、搭建服务器端的后台逻辑等。 通过该微信小程序,用户可以通过语音输入进行数字识别,输入的语音数据会被发送到服务器端进行处理。服务器端使用深度学习模型对语音数据进行分析和识别,并返回识别结果给用户。 综上所述,基于深度学习的数字语音识别微信小程序利用了深度学习技术、Flask框架和Python语言等技术,实现了对语音输入的数字识别。它可以提供便捷的数字输入方式,并且通过深度学习模型的应用,可以提高语音识别的准确性和可靠性。 ### 回答2: 基于深度学习的数字语音识别微信小程序使用了深度学习技术和Flask框架开发,主要运用Python语言进行编写。 该小程序的核心功能是通过语音识别技术将输入的语音数据转化为对应的数字。用户只需点击小程序中的录音按钮,说出想要识别的数字,录音结束后,语音数据被发送到后台服务器进行处理。 后台服务器首先通过深度学习算法对语音数据进行特征提取,提取出关键的声音特征。接着,使用训练好的深度学习模型对特征进行分类,判断语音所代表的数字是多少。最后,将识别结果返回给微信小程序,并显示在界面上。 整个流程中,深度学习算法是核心。通过大量的语音数据进行训练,深度学习模型能够学习到不同数字之间的声音特征差异,从而准确判断输入语音对应的数字。 Flask框架提供了后台服务器的搭建和接口调用功能,使得语音数据的传输和处理变得简单高效。 在小程序的界面设计上,由于是数字语音识别应用,简洁直观的界面风格是首选。用户可以在录音按钮旁边看到已经成功识别的数字,并有一个清除按钮用于重新录音。 总之,基于深度学习的数字语音识别微信小程序通过利用深度学习算法和Flask框架的完美结合,实现了高效准确的数字语音识别功能,为用户提供了一种便捷的数字输入方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值