TextToSpeech-神經網路如何理解文字

更新於 發佈於 閱讀時間約 7 分鐘

一.引言

  上篇我們簡單的了解了 TTS 想要達到的目標,但是對於訓練資料的處理、網路架構、損失函數、輸出分析等考慮到篇幅尚未解釋清楚,這篇將針對訓練資料處理中的文字部分進行詳細說明,讓我們開始吧。

二.文字前處理流程

  上篇稍微提到了文字分析,那麼,實際上要做甚麼呢 ?

其實就是我們需要將非中文的表達轉換成中文表達,以及刪除一些對於語音表達無效的字元

例如 :

  • 日期處理 : "2024-05-27" >>> "二零二四年五月二十七日"
  • 縮寫處理 : "NTD100" >>> "新台幣一百元"
  • 符號/空格處理 : "本日推薦 ◎醬油拉麵◎" >>> "本日推薦醬油拉麵"
  • 其他自定義處理

其餘如逗號、句號、問號、驚嘆號等對於句子停頓、語氣等有意義的符號可以保留,我們能夠期待網路能從中學到這些特性。

  但是這樣還不夠,對於神經網路而言,"二零二四年五月二十七日",這樣的輸入是無法處理的,沒轉換成數學表達,就無法參與到神經網路的計算中,那麼如何轉換成數學表達呢?

字典索引

  我們可以建立一個字典庫,根據每個字去定義對應的字典索引。例如:"二零二四年五月二十七日" 可以編碼成 "[10,8,10,12,23,13,31,10,18,15,57]",其中每個數字代表字典中的索引。這樣一來,文字與數字就有了對應關係。

One-hot 編碼

  單純的索引列表仍不足以讓神經網路提取有用的訊息。儘管後續有人提出利用 One-hot 編碼將連續整數轉變成離散型編碼,也就是[0]這個索引若在有10個字的字典庫中,則編碼成[1,0,0,0,0,0,0,0,0,0],只有索引[0]為1,其他則為0的方式編碼,這種編碼方式可以避免順序偏見(即避免某些模型因數值大的索引而給予更大的關注),但無論是字典索引還是 One-hot 編碼,兩者之間的字詞並無關聯性,缺乏語義信息,所以這樣做仍無法解決語義相關性問題,且 One-hot 編碼還有儲存量龐大的問題,通常一個字典庫裏頭的字詞成千上萬,若是使用 One-hot ,則會有大量部分為0,在存儲及計算上都會有浪費問題。

Word Embedding

  為了解決這個問題,有人提出了 Word Embedding 的想法,這也奠定了自然語言處理深度模型的輸入基礎,Word Embedding 使用神經網路訓練詞與詞的關係,並將詞映射到指定維度的向量上,這樣一來,就不用使用與字典同維度的空間去紀錄一個字詞。

Word Embedding 可以捕捉到詞與詞之間的語義關係,這樣即使兩個詞在表面上看起來完全不同,它們的向量表示也能夠反映出它們之間的相關性。這種方法大大提升了神經網路在自然語言處理任務中的效果。

現在如果要快速使用的話,可以使用Word2Vec套件提供的方法訓練你自己的 Word Embedding 模型,以及使用jieba進行詞分割,例如 :

import jieba
from gensim.models import Word2Vec

jieba.load_userdict("Mydict.txt")

# 準備訓練數據
sentences = [
"臺灣鐵路已放棄興建的路線",
"人是一種從動物進化的生物",
"你是英文系的,可以幫我翻譯一下嗎?"
]

# 將句子分詞
tokenized_sentences = [list(jieba.cut(sentence)) for sentence in sentences]
print(tokenized_sentences)

這樣我們切分出的句子便會是

['臺灣', '鐵路', '已', '放棄', '興建', '的', '路線']

['人', '是', '一種', '從', '動物', '進化', '的', '生物']

['你', '是', '英文系', '的', ',', '可以', '幫', '我', '翻譯', '一下', '嗎', '?']

model = Word2Vec(sentences=tokenized_sentences, vector_size=100, 
window=5, min_count=1, sg=0)

# 保存模型
model.save("word2vec.model")

# 加載模型
model = Word2Vec.load("word2vec.model")

# 測試模型
word_vectors = model.wv

# 測試是否符合預期​
print(word_vectors.similarity("人", "鐵路"))
print(word_vectors.similarity("人", "生物"))

# 直接檢視詞向量​
print(word_vectors["人"])

結果人與鐵路的相關性為 -0.027132183;人與生物的相關性為 0.12371957,雖然有拉開,但似乎並沒有很好,這是因為案例只有三句話,需要更多的樣本進行訓練方能獲得較好的結果。

而我們映射完的詞向量可能會長這樣(上方案例為100維不適合展示,這邊以5維為例)

人 : [-0.01270834 -0.14365004 0.20052692 0.0955428 0.18737748]

生物 : [ 0.10361788 0.17437415 -0.02223953 -0.18728271 0.08719231]

這樣一來,我們便充分的利用小維度的向量代表這兩種字詞

實務上,可以使用其他人已經訓練好的模型來進行 Embedding ,若你的詞專業性偏高,也能夠使用此方法訓練出更符合你資料集的 Embedding 模型。

三.結語

  今天介紹了該如何處理文字訓練輸入,但對於 Embedding ,我打算使用單獨的一篇進行詳解其是如何做到將字詞映射到更小維度的向量中,所以這篇只先帶一下套件用起來的功能便利性,以及 Embedding 出現的理由,畢竟這個是自然語言相關的應用中,必不可少的課題,我想好好面對它。


留言
avatar-img
留言分享你的想法!
avatar-img
貓貓學習筆記
9會員
21內容數
AI、電腦視覺、圖像處理、AWS等等持續學習時的學習筆記,也包含一些心得,主要是幫助自己學習,若能同時幫助到不小心來到這裡的人,那也是好事一件 : )
貓貓學習筆記的其他內容
2024/07/08
我們前面幾篇已經講完TTS技術的一大半架構了,知道了如何將聲學特徵重建回音訊波形,也從中可以知道要是聲學特徵不完善,最終取得的結果也會不自然,剩下要探討該如何將文字轉換成聲學特徵,且能夠自然地表現停頓及細節變化,讓我們開始吧。
Thumbnail
2024/07/08
我們前面幾篇已經講完TTS技術的一大半架構了,知道了如何將聲學特徵重建回音訊波形,也從中可以知道要是聲學特徵不完善,最終取得的結果也會不自然,剩下要探討該如何將文字轉換成聲學特徵,且能夠自然地表現停頓及細節變化,讓我們開始吧。
Thumbnail
2024/06/26
距離上篇已經快過一個月了,這個月我也沒閒著,我FF14生產職拉了不少等級進行了上篇 WaveNet 的後續調試,也比較與其他人實現的效果,又發現了幾個實作上可能造成困難的點,現在就跟各位分享一下~
Thumbnail
2024/06/26
距離上篇已經快過一個月了,這個月我也沒閒著,我FF14生產職拉了不少等級進行了上篇 WaveNet 的後續調試,也比較與其他人實現的效果,又發現了幾個實作上可能造成困難的點,現在就跟各位分享一下~
Thumbnail
2024/06/01
WaveNet 提供了一個先進的架構用於音訊重建,但是,有必要嗎? Mel 頻譜本身就是經過數學轉換而獲得的結果,不能反運算嗎 ? 到底 WaveNet 在其中扮演了甚麼腳色 ?它是如何運作的 ? 讓我們在這篇好好探討下去。
Thumbnail
2024/06/01
WaveNet 提供了一個先進的架構用於音訊重建,但是,有必要嗎? Mel 頻譜本身就是經過數學轉換而獲得的結果,不能反運算嗎 ? 到底 WaveNet 在其中扮演了甚麼腳色 ?它是如何運作的 ? 讓我們在這篇好好探討下去。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 118 安裝完 googletrans,現在示範如何從英文翻譯成法文: import googletrans translator
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 118 安裝完 googletrans,現在示範如何從英文翻譯成法文: import googletrans translator
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 在 AI說書 - 從0開始 - 74 中提到,我們想要建立「Transformer 數學」與「ChatGPT 產生的文字」兩者間的關係。 有鑑於此,我們以句子「
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 在 AI說書 - 從0開始 - 74 中提到,我們想要建立「Transformer 數學」與「ChatGPT 產生的文字」兩者間的關係。 有鑑於此,我們以句子「
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformers for Natural Language Processing and Computer Vision, 2024 這本書中講 Trainin
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformers for Natural Language Processing and Computer Vision, 2024 這本書中講 Trainin
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformers for Natural Language Processing and Computer Vision, 2024 這本書中講 Decoder
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformers for Natural Language Processing and Computer Vision, 2024 這本書中講 Decoder
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 再度回到 Transformer 架構中的 Encoder 部分,如下圖所示: 我現在手上有的素材如下: Embedding 訓練方式:AI說書 - 從0開始
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 再度回到 Transformer 架構中的 Encoder 部分,如下圖所示: 我現在手上有的素材如下: Embedding 訓練方式:AI說書 - 從0開始
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們在AI說書 - 從0開始 - 42中,見識了 Tokenizer 做的事情了,以下來羅列幾個要點: 它將原始文字轉成小寫 有可能將原始文字再進行切割 通常 T
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們在AI說書 - 從0開始 - 42中,見識了 Tokenizer 做的事情了,以下來羅列幾個要點: 它將原始文字轉成小寫 有可能將原始文字再進行切割 通常 T
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News