百度云盤做網(wǎng)站百度新聞客戶端
文字轉(zhuǎn)語音神器+Python編程搞定語音報(bào)時(shí)小程序
今天一個(gè)好哥們發(fā)了一個(gè)文字轉(zhuǎn)語音的AI神器的短視頻。這個(gè)神器的網(wǎng)站是[ChatTTS - Text-to-Speech for Conversational Scenarios][https://chattts.com/],如下圖所示:
這個(gè)開源項(xiàng)目可以從github.com上下載,也可以在這個(gè)網(wǎng)頁下載。如下圖所示:
在主頁上大概體驗(yàn)了一下,文字轉(zhuǎn)語音還可以,但是有些生字(鎮(zhèn)賚縣)還是不能正常識別,比方說這個(gè)”賚“字。還有就是阿拉伯?dāng)?shù)字也不能正常識別。但是可以通過程序轉(zhuǎn)成漢字,然后就可以了。言歸正傳,這個(gè)開源項(xiàng)目給我的最好的體會就是免費(fèi),于是按照上圖所示的步驟,下載了源碼并安裝了依賴庫,強(qiáng)調(diào)一下,這個(gè)源碼運(yùn)行環(huán)境在Anaconda下可以,PyCharm我的電腦不能運(yùn)行,報(bào)錯(cuò)。
我首先想到的是利用這個(gè)API編一個(gè)語音報(bào)時(shí)的小程序,之前我編了一個(gè)萬年歷,這回可以實(shí)現(xiàn)語音播報(bào)了。我首先實(shí)現(xiàn)一個(gè)簡單的報(bào)時(shí)小程序。
下載之后的源碼文件夾拷貝到你指定的目錄下面,然后進(jìn)入Anaconda的Jupyter-Notebook下,打開
上面說到了,阿拉伯?dāng)?shù)字是不能準(zhǔn)確識別的。但是用datetime模塊生成的時(shí)間或者日期都是阿拉伯?dāng)?shù)字,必須轉(zhuǎn)成漢字才可以利用這個(gè)開源模塊實(shí)現(xiàn)語音播報(bào)。
環(huán)境
操作系統(tǒng):macOS Sonoma
開發(fā)環(huán)境:Anaconda+Python 3.11
源碼如下:
import torch
import ChatTTS
from IPython.display import Audio
import datetimechat = ChatTTS.Chat()
chat.load_models()# 定義一個(gè)類
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 "晚上"# 定義一個(gè)時(shí)間轉(zhuǎn)成漢字的函數(shù)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:] + '時(shí)'return f'{hour} {minute}'else:return f'{number_to_chinese(int(hour))[:]}時(shí) {minute}'def get_month_day(self):month = number_to_chinese(self.now.month)day = number_to_chinese(self.now.day)return month, day# 定義一個(gè)返回星期幾的函數(shù)def get_weekday(self):date = self.now.strftime('%Y-%m-%d')# 將日期轉(zhuǎn)換為datetime對象datetime_obj = datetime.datetime.strptime(date, '%Y-%m-%d')# 獲取星期幾的數(shù)字(0代表星期日,1代表星期一,...,6代表星期六)weekday = datetime_obj.strftime('%w')# 將星期幾數(shù)字轉(zhuǎn)換為中文星期幾weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']weekday_cn = weekdays[int(weekday)return weekday_cn# 定義一個(gè)數(shù)字轉(zhuǎn)成漢字的函數(shù)
def number_to_chinese(number):units = ['', '十']digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']if number == 0:return '零'result = ''digit_count = 0last_zero = Truewhile number > 0:digit = number % 10number //= 10if digit == 0:result = digits[number] + '十'breakif digit != 0:if last_zero:result = digits[digit] + resultelse:result = digits[digit] + units[digit_count] + resultlast_zero = Falseelse:if not last_zero:result = digits[digit] + resultlast_zero = Truedigit_count += 1return result# 實(shí)例化一個(gè)早中晚的對象
morning_noon_evening = PeriodDay()
# 獲取當(dāng)前的時(shí)段
time_of_day = morning_noon_evening.get_time_of_day()# 利用當(dāng)前時(shí)間提取月,日,時(shí),分
month, day = morning_noon_evening.get_month_day()
# 將時(shí):分轉(zhuǎn)成漢字
text_time = morning_noon_evening.format_time_final()
# 要報(bào)時(shí)的文字
time_text = f"{time_of_day}好,現(xiàn)在是{month}月{day}日 {week_day} 北京時(shí)間{text_time}。在干嘛?"
# 定義一個(gè)轉(zhuǎn)成語音的文字列表變量
texts = [time_text]
print(time_text)
# 生成語音
wavs = chat.infer(texts, use_decoder=True)# 播放語音
Audio(wavs[0], rate=24_000, autoplay=True)
運(yùn)行效果如下:
INFO:ChatTTS.core:All initialized.
下午好,現(xiàn)在是五月三十一日 星期五 北京時(shí)間十四時(shí) 一十一分。在干嘛?10%|████▏ | 38/384 [00:00<00:09, 38.29it/s]15%|██████ | 309/2048 [00:05<00:32, 53.73it/s]