有道技術沙龍博客-分享有道人的技術思考 - 仙境傳說私服
仙境傳說私服

有道技術沙龍博客-分享有道人的技術思考

  

  rox新世代極速

  有道縱橫是網易有道旗下專爲4-8歲孩子量身打造的在線年啓動,自研了全國首部在線交互式圍棋動漫課程,從孩子的理解力和喜好出發,采用直播互動的課程形式將圍棋知識變得簡單有趣、易懂好學,幫助孩子掌握圍棋的各類規則和技巧。不僅如此,課後還設有AI對弈功能,能夠智能識別孩子的段位水平匹配對局練習,從根源培養孩子的思維習慣。每局對弈結束後的智能分析,會從大局觀、計算力、穩定性、戰鬥和棋型五方面進行全方位分析,幫助孩子在複盤中進步。

  Google旗下Deepmind提出的AlphaGo、AlphaGo Zero、AlphaZero系列算法展示了深度強化學習在棋類領域超凡的能力。2016年AlphaGo橫空出世擊敗歐洲圍棋冠軍樊麾二段,2017年以4:1擊敗韓國圍棋職業九段,14個世界冠軍得主李世石,2018年無師自通的AlphaGo Zero以3:0擊敗最年輕的六冠王柯潔九段。至此以後再無人質疑AI在圍棋領域的霸主地位,同時引發了職業棋手學習AI招法的熱潮。在職業圍棋賽場上,時常出現“狗招”,學習、研究AI招法的背後的邏輯,已是職業棋手的必修課。

  Github上已經有了Leela Zero、KataGo等基于AlphaZero系列算法的優秀圍棋AI開源項目,它們的主要目標是提升AI的棋力,目前上述圍棋AI的棋力已遠超人類職業棋手。然而當強AI應用在少兒圍棋教學時,出現了“水土不服”的現象,比如:

  • AI實在是太強了,人很難在與AI對弈的過程中體會到“旗鼓相當”的感覺,這極易引起用戶的挫敗感。

  • AI的學習路徑與人大相徑庭,一些在人早期圍棋學習階段就可以掌握的知識(如征子),AI在訓練後期才掌握。

  有道圍棋AI團隊隸屬于有道人工智能語音組,負責有道縱橫産品與圍棋AI相關的研發、落地工作,主要發力點在于AI的人機對弈和複盤。現有的工作成果引用一段CEO周楓的話:

  總體上有道縱橫是一個面向孩子的圍棋啓蒙課程,大班直播、名師教學,在邊學邊練過程中有豐富的互動,同時也具備AI對弈能力。與此同時,有道縱橫將教、學、練、測、評五個環節做了非常好的整合,形成了這個産品的全貌。

  技術團隊永遠都說AI老師特別有用,可以解決個性化教學的問題,可以因材施教;老師背景的團隊往往覺得AI老師就是洪水猛獸,既沒有用而且騙了很多VC的錢。

  縱橫項目當中做了比較多的AI老師的思考和實踐。我們看法是,大衆對于AI的認知,其實對于産品團隊來說是個雙刃劍,只有認識到雙刃劍的作用才能做出正確的設計。

  什麽是雙刃劍?一方面AI是一個非常好的營銷抓手;另外一方面,用戶不懂做産品,團隊必須去自己尋找真正的AI價值點。如果你聽用戶對哪個東西興奮就做哪個,最後往往掉坑裏了。

  在AI場景下,我們思考了非常久。首先想到AlphaGo,不管多牛都下得過你,但這麽和用戶講顯然不可能,所以本身對弈的難度和棋力不是教學當中AI的指標,而是如何降低難度,怎麽能夠靈活的調整難度。

  所以,第一,我們團隊花了大量功夫做難度可控的、棋力可控的圍棋AI;第二,可控棋力的AI和複盤能力;第三,我們推的是學員和學員、學員和老師之間的對弈,強調人人對弈而不是人機對弈,人機對弈只是找不到人對弈時候的補充手段。

  通過這樣的手段,我們實現了自主研發的圍棋AI,教學過程當中能夠代替掉人的部分工作,提高了團隊的生産效率。

  一些其他方案在實現人機對弈系統時,一般使用AI訓練過程早期的模型,然後使用模型的top-n輸出,隨機抽樣進行落子行爲,避免AI落子過于單一。

  這種方案除了易于想到之外沒有其他優點,由于早期模型訓練量不大,采用top-n的采樣方法會導致AI的招式沒有條理,用戶很容易誘導出這種落子邏輯的漏洞(如征子)。其次,在對弈過程中,AI模型和落子策略是固定的,但我們在實踐中發現,AI對于圍棋中的布局、中盤、收官等階段的招法學習速度並不相同,AI對布局的掌握速度遠遠超出中盤、收官,使用相同的模型和策略會導致AI在整盤棋的表現差異極大。再者,AI的自對弈訓練中,沒有定式的概念(定式是圍棋高手在某些局部的經驗總結,用戶學習定式走法可以快速提升棋力),低水平的AI很難在局部中下出最優解,而人可以通過學習高手的棋譜快速掌握局部最佳下法,即使人的水平並沒有達到提出該定式的圍棋高手水平。上述問題的根源在于AI與人的學習路徑大相徑庭,難以直接移植。

  • 棄用top-n隨機抽樣的落子策略,使用AI引擎的policy輸出,按概率采樣。保證了AI招法邏輯性、連貫性。

  • 在不同手數階段,結合勝率和目差信息,調用不用的AI模型。保證AI在不同階段的水平表現相近。

  複盤指對局完畢後,複演該盤棋的記錄,以檢查對局中招法的優劣與得失關鍵。一般用以自學,或請高手給予指導分析。下圍棋的高手都有複盤的習慣。複盤就是每次博弈結束以後,雙方棋手把剛才的對局再重複一遍,這樣可以有效地加深對這盤對弈的印象,也可以找出雙方攻守的漏洞,是提高自己水平的好方法。在有道縱橫産品中,AI承擔了複盤老師的角色。

  一些其他方案中,AI複盤主要是展示整局棋的勝率或目差曲線、AI的推薦變化圖、以及一些基礎的統計數據,這些內容更適合專業的用戶,專業用戶的需求在于快速定位自己下的不好的棋,然後根據AI提供的變化圖等推理AI的落子邏輯,此類用戶僅根據圍棋AI引擎的原始數據就可以完成自我學習。

  但是當用戶群體定位到少兒時,上述的解決方案效果就會大打折扣,少兒用戶很難理解統計數據背後的意義,同時對AI提供的變化圖的邏輯缺乏分析能力,甚至注意力很難集中在變化圖上,僅關注整局棋的勝率、目差的變化。此外,其他方案采用的複盤使用的GPU資源消耗很大,有的用戶甚至需要半天時間才能拿到對局的複盤結果。

  • 性能優化,在少兒用戶的使用場景中,用戶並不需要高算力AI産生的複盤結果,我們指定了根據局面的複雜程度分配算力的方案。

  目前圍棋AI的技術主要集中于提升AI水平上,這固然爲專業用戶自我訓練提供了極大的便利,但由于高水平AI背後的行棋邏輯較爲高深,當圍棋AI爲少兒用戶提供服務時,少兒用戶很難直接從高水平AI獲取知識。

  接下來我們希望可以在人機對弈場景中,爲用戶提供水平更合適、邏輯更連貫的AI陪練;在複盤場景中,爲用戶提供更清晰易懂的複盤報告。

  本次以Redis爲範例,闡述了有道基礎架構團隊在基礎設施容器化道路上的實踐,主要將從聲明式管理,Operator工作原理,容器編排,主從模式,集群模式,高可用策略,集群擴縮容等方面展開。

  Redis 是業務系統中較爲常用的緩存服務,常用于流量高峰、數據分析、積分排序等場景,並且通過中間件可以實現系統之間的解耦,提升系統的可擴展性。

  傳統物理機部署中間件,需要運維人員手動搭建,啓動時間較長,也不利于後期維護,無法滿足業務快速發展的需求。

  雲原生相較于傳統IT,可以助力業務平滑遷移、快速開發、穩定運維,大幅降低技術成本,節約硬件資源。

  雲原生中間件是指依托容器化、服務網格、微服務、Serverless等技術,構建可擴展的基礎設施,持續交付用于生産系統的基礎軟件,在功能不變的前提下,提高了應用的可用性與穩定性。

  在這種大趨勢下,有道基礎架構團隊開始了雲原生中間件的實踐,除了本文介紹的 Redis,還包括 Elasticsearch、ZooKeeper 等。

  利用雲原生技術可以解決當前Redis部署緩慢,資源利用率低等問題,同時容器化 Redis 集群也面臨著一些挑戰:

  對于一個 Redis 集群,我們的期望是能夠 724 小時無間斷提供服務,遇故障可自行修複。這與Kubernetes API的聲明式特點如出一轍。

  所謂“聲明式”, 指的就是我們只需要提交一個定義好的 API 對象來“聲明”我所期望的狀態是什麽樣子,Kubernetes中的資源對象可在無外界幹擾的情況下,完成當前狀態到期望狀態的轉換,這個過程就是Reconcile過程。例如,我們通過yaml創建了一個Deployment ,Kubernetes將“自動的”根據yaml中的配置,爲其創建好Pod,並拉取指定存儲卷進行挂載,以及其他一系列複雜要求。

  因此,我們的Redis集群是否可以使用一個類似的服務去完成這個過程呢?即我們需要定義這樣的對象,定義服務Reconcile的過程。Kubernetes的Operator剛好可以滿足這個需求,可以簡單的理解Operator由資源定義和資源控制器構成,在充分解讀集群和Operator的關系後,我們將整體架構圖設計如下

  哨兵模式中Redis服務用一套哨兵集群,使用StatefulSet部署,持久化配置文件。Redis server也采用 StatefulSet部署, 哨兵模式的實例爲一主多從。

  Redis的資源定義在ETCD中存儲一份即可,我們只需要預先提交自定義資源的 yaml配置。如下所示爲創建三個副本的Redis主從集群:

  Operator 無需任何修改,即可從 Kubernetes 核心中獲得許多內置的自動化功能,如使用 Kubernetes 自動化部署和運行工作負載, 甚至可以自動化 Kubernetes 自身。

  Kubernetes 的 Operator 模式可在不修改 Kubernetes 自身的代碼基礎上,通過控制器關聯到一個以上的定制資源,即可以擴展集群的行爲。Operator 是 Kubernetes API 的客戶端,核心功能是充當定制資源的控制器。

  用戶創建一個CRD自定義資源,ApiServer把CRD轉發給webhook,webhook 進行缺省值配置 驗證配置和修改配置,webhook處理完成後的的配置會存入ETCD中 ,返回給用戶是否創建成功信息。Controller 會監測到CRD,按照預先寫的業務邏輯,處理這個CRD,比如創建Pod、處理新節點與舊集群關系等,保證運行的狀態與期望的一致。

  Redis 集群在 Kubernetes 中的最小部署單位爲 Pod,因此在架構設計之前,需預先考慮Redis特性、資源限制、部署形態、數據存儲、狀態維護等內容,爲不同類型的Redis集群配置合適的部署方式。

  • limit(資源限制):即運行Pod期間,可能內存使用量會增加,那最多能使用多少內存,這就是資源限額。

  Redis 基本不會濫用 cpu,因此配置1-2個核即可。內存根據具體業務使用分配,考慮到部分場景下會fork較多的內存,例如 aof 頻繁刷寫,aof 重寫過程中,Redis 主程序稱依舊可以接收寫操作,這時會采用 copy on write (寫時複制)的方法操作內存數據,若業務使用特點爲“寫多讀少”,那麽刷寫期間將産生大量的內存拷貝,從而導致 OOM,服務重啓。

  一個有效的解決方式爲減少刷寫次數,將刷寫操作放在夜間低流量時段進行。減少刷寫次數的方法爲適當增加auto-aof-rewrite-min-size的大小,可配置使用內存的5倍甚至更大的最小刷寫量;其次可以主動觸發刷寫,判斷內存使用達到的配額兩倍時進行刷寫,實際部署時一般也會預留50%的內存防止OOM。

  依據數據是否需要持久化或是否需要唯一標識區分服務爲無狀態和有狀態的服務,Redis集群需要明確主從、分片標識,大部分場景也需要數據持久化,Kubernetes使用StatefulSet來滿足這一類需求。StatefulSet的順序部署、逆序自動滾動更新更能提高Redis集群的可用性。

  Redis Server 啓動時需要一些配置文件,裏面涉及到用戶名和密碼,我們使用 Configmap 和 Secret 來存儲的。Configmap 是 Kubernetes的Api 對象,常用于存儲小于1MB的非機密鍵值對。而 Secret 可以用于存儲包含敏感信息的密碼、令牌、密鑰等數據的對象。

  Redis容器化後建立的每個 CR 表示一個完整的Redis服務,具體的服務模式包括哨兵模式和集群模式兩種,在進行容器化過程中,除覆蓋裸服務器部署結構外,也對架構進行了一定程度的優化。

  所有實例共用一組哨兵將進一步提高實例啓動速度,並在一定程度上可提高硬件資源利用率,實測單組哨兵可輕松應對百規模的主從集群。

  檢查是否按照預期啓動了全部的Pod,比如創建3個Server,那麽需要按照預期啓動三個才能繼續進行後面的操作。

  檢查Master的數量,確保該實例僅有一個主節點(數量爲0主動選一個;數量大于1手動修複)。

  通過在傳統Redis Cluster架構中引入代理功能,實現動態路由分發,並基于Kubernetes原生動態擴縮容特性,更易應對突發流量,合理分配使用資源。

  • 對于操作單個Key的命令,Proxy會根據Key所屬的Slot(槽)將請求發送給所屬的數據分片。

  • 對于操作多個Key的命令,如果這些Key是儲存在不同的數據分片,Proxy會將命令拆分成多個命令分別發送給對應的分片。

  (1)處理失敗節點, 對部分節點重啓後的無效ip、狀態爲noaddr的僵屍節點進行forget操作;

  (2)處理不可信節點 (所有handshake狀態的節點),發生于某一個節點被移除(由forget node觸發),但試圖加入集群時,即該Pod在Operator角度下存在,但實際集群節點並不需要該節點,處理方式爲刪掉這個Pod,並再次做forget操作直到Pod被刪除。

  爲StatefulSet中的Pod建立主從關系,同時給其分配Slots。若當前Master數量同預期不一致,則對應擴縮容操作,具體見’集群擴縮容’的橫向擴縮容小節。

  從代理獲取Redis Server信息,將集群信息同步到所有的代理上,代理中不存在的Server ip做移除操作。

  若代理中無可用Redis Server, 表示被全部移除,則添加一個,代理可自動發現集群其他Redis節點。

  Redis部署最小資源對象爲Pod,Pod是Kubernetes創建或部署的最小/最簡單的基本單位。

  當啓動出錯,例如出現“CrashLoopBackOff”時,Kubernetes將自動在該節點上重啓該Pod,當出現物理節點故障時,Kubernetes將自動在其他節點上重新拉起一個。

  Pod未出問題,但程序不可用時,依托于健康檢查策略,Kubernetes也將重啓該Redis節點。

  節點縱向擴容時,使用StatefulSet的滾動升級機制,Kubernetes將逆序重啓更新每個Pod,提高了服務的可用性。

  Kubernetes本身不處理Redis 多個Pod組建的集群之間的部署關系,但提供了部署策略,爲保證特定場景下的高可用,如因物理節點導致所有Redis節點均宕機,CRD在設計中加入了親和與反親和字段。

  默認使用 podAntiAffinity 做節點打散,如下所示實例instance1的所有 Pod 將被盡可能調度到不同的節點上。

  Redis 服務運行期間不可避免的出現各種特殊情況,如節點宕機、網絡抖動等,如何持續監測這類故障並進行修複,實現 Redis 集群的高可用,也是 Operator 需解決的問題,下面以哨兵模式模式爲例描述集群如何進行故障恢複。

  主節點宕機:因物理節點驅逐、節點重啓、進程異常結束等導致的Redis主節點宕機情況,哨兵會進行切主操作,然後Kubernetes會在可用物理節點上重新拉起一個Pod。

  從節點宕機:哨兵模式的Redis集群未開啓讀寫分離,從節點宕機對服務無影響,後續Kubernetes會重啓拉起一個Pod,Operator會將該Pod設置爲新主節點的從節點。

  集群全部節點宕機:發生概率極小,但基于持久化可將服務影響降至最低,集群恢複後可繼續提供服務。

  節點網絡故障:主從模式下配置了三個哨兵用于集群選主操作,哨兵集群的每一個節點會定時對 Redis 集群的所有節點發心跳包檢測節點是否正常。如果一個節點在down-after-milliseconds時間內沒有回複Sentinel節點的心跳包,則該Redis節點被該Sentinel節點主觀下線。

  當節點被一個 Sentinel 節點記爲主觀下線時,並不意味著該節點肯定故障了,還需要Sentinel集群的其他Sentinel節點共同判斷爲主觀下線才行。

  如果客觀下線的 Redis 節點是從節點或者是Sentinel節點,則操作到此爲止楓之谷私服沒有後續的操作了;如果客觀下線的Redis節點爲主節點,則開始故障轉移,從從節點中選舉一個節點升級爲主節點。

  縱向擴縮容主要指Pod的CPU、內存資源的調整,基于Kubernetes的特性,只需修改實例對應的spec字段,Operator的調和機制將持續監測參數變化,並對實例做出調整 。當修改cpu 、內存等參數時,Operator同步更新StatefulSet的limit、request信息,Kubernetes將逆序滾動更新Pod,滾動更新時,若停掉的是主節點,主節點的preStop功能會先通知哨兵或者集群進行數據保存,然後做主從切換操作,從而將服務的影響降至最低。更新後的主從關系建立以及哨兵monitor主節點功能也由Operator一並處理,全過程對客戶端無感知。主從版、集群版在該場景下均支持秒級斷閃。

  橫向擴縮容主要指副本數或節點數的調整,得益于 Kubernetes 的聲明式 API,可以通過更改聲明的資源規模對集群進行無損彈性擴容和縮容。

  Redis Server擴容操作時,主從版本中Operator將獲取新節點ip, 新啓動節點將在下一輪調和時觸發slaveof 主節點操作,且同步過程中,哨兵不會將該節點選爲主節點。集群版本中Operator將在同步節點信息後進行分片遷移,保證所有節點上的Slots盡可能均勻分布。

  Redis Server縮容操作時,主從版本中Operator將逆序銷毀Pod,銷毀時會先詢問哨兵,自己是否爲主節點,若爲主節點則進行先failover操作再退出。集群版本中Operator中會先進行分片遷移,再對該節點做刪除操作。

  代理的擴縮容,更易實現,根據流量波峰波谷規律,可手動定期在波峰到來時對 Proxy 進行擴容,波峰過後對 Proxy 進行縮容;也可根據HPA實現動態擴縮容,HPA也是Kubernetes的一種資源,可以依據Kubernetes 的Metrics API的數據,實現基于CPU使用率、內存使用率、流量的動態擴縮容。

  本次以 Redis 爲範例,闡述了有道基礎架構團隊在基礎設施容器化道路上的實踐,Redis上雲後將大幅縮短集群部署時間,支持秒級部署、分鍾級啓動、啓動後的集群支持秒級自愈,集群依托于哨兵和代理的特性,故障切換對用戶無感知。

  有道架構團隊最終以雲平台的形式提供中間件能力,用戶無需關注基礎設施的資源調度與運維,重點關注具體業務場景,助力業務增長。未來,將進一步圍繞Redis實例動態擴縮容、故障分析診斷、在線遷移、混合部署等內容展開探索。

  Kubernetes 是一個容器編排系統,可以自動化容器應用的部署、擴展和管理。Kubernetes 提供了一些基礎特性:

  部署:部署更快,集群建立無需人工幹預。容器部署後可保證每個的Redis節點服務正常,節點啓動後將由Operator持續監測調和Redis集群狀態,包括主從關系、集群關系、哨兵監控、故障轉移等。

  資源隔離:如果所有服務都用同一個集群,修改了Redis集群配置的話,很可能會影響到其他的服務。但如果你是每個系統獨立用一個Redis群的話,彼此之間互不影響,也不會出現某一個應用不小心把集群給打挂了,然後造成連鎖反應的情況。

  (2) 網絡故障:因宿主機網絡故障帶來的實例延遲高,哨兵可進行主從切換,而爲了保證集群的健康,將由Operator負責同步集群信息。

  擴縮容:容器部署可根據limit和request限制實例的cpu和內存,也可以進行擴縮容操作,擴容後的故障恢複由Operator處理。

  節點調整:基于Operator對CRD資源的持續調和,可在Operator的Controller中爲每個Redis實例進行狀態維護,因此,節點調整後帶來的主副關系建立、集群Slots遷移等均可自動完成。

  自 2017 年 10 月推出有道翻譯蛋開始,網易有道已先後推出了二十余款智能學習硬件産品,包括有道翻譯王、有道口袋打印機、有道超級詞典、有道詞典筆、有道聽力寶等。

  在近期有道詞典筆的全新軟件升級中(關聯閱讀:全新軟件升級!真的很有料),有兩個重要的優化,分別是:

  爲了給用戶帶來更好的體驗,有道 AI 團隊選取了多種真人發音素材,從來自公司內部、真實用戶和 native speakers 等人群中選取足夠大的樣本發放調查問卷,從發音准確度、音色喜愛度等方面進行打分,並和專業的發音進行比較,最終選取了目前版本中的音色。

  在語言學習場景中,機械式的發音不僅讓人覺得枯燥乏味,而且會影響口語學習的效果。最自然、最理想的交互莫過于通過人的聲音進行交流。如何讓智能學習硬件的發音接近真人,是一個重要的課題。

  同時,通過有道 AI 團隊對語言模型的不斷訓練,有道詞典筆的發音准確度再一次得到突破,在掃描句子的過程中,有道詞典筆可以快速預判語義,輕松讀對一些英語學習者和 AI 都非常容易讀錯的單詞,比如「多音詞」。

  這些能力的背後,是有道 TTS 語音合成技術的加持。本文將會詳細介紹有道 TTS 技術的相關思考和實踐。

  文本分析前端的主要作用是將語句轉換爲語言學特征,主要是音素序列和韻律特征, 其中音素序列決定 TTS 是否正確讀對了文本;韻律特征決定 TTS 的停頓位置、自然度等,這也是有道 TTS 技術能夠實現接近真人發音和正確朗讀多音詞的關鍵所在。

  傳統的文本分析模塊會單獨建模每個任務,並且串行處理效率較低,這種做法在嵌入式場景中難以實現性能和質量的平衡,多個任務分離也會提高系統的維護成本。

  相比于傳統方案,有道 AI 團隊基于 BERT 預訓練模型進行了多任務建模,將多個任務進行統一建模,大大提高了效率。

  這些優化能夠支持 TTS 前端的文本正則化、多音字判別、韻律預測等任務,使有道系統能夠在設備端合成低發音錯誤、韻律自然和感情豐富的高質量語音。

  結合詞性、詞義等細化多音字模型標簽,使得建模更高效;在中文古詩詞、文言文發音上,通過 ssml 技術將詞典筆海量權威發音詞典資源應用到TTS 發音中;

  通過構建bert多任務模型,聯合預測多音字、韻律、分詞、詞性任務,多個任務之互相促進不僅了提升多音字模型和韻律模型的准確率,同時也節省了參數量;最後通過蒸餾技術,小參數量多任務模型在保證質量的同時,也達到嵌入式性能要求;

  系統集成:在系統集成階段,工程化團隊通過自研bert pipeline技術,更進一步優化了內存和推理時間;

  通過這些方面的工作,最終推出了基于預訓練模型的多任務架構 TTS 中英混前端,保證了 TTS 合成的發音正確性和韻律停頓。

  聲學模型的主要作用是將語言學特征轉換爲對應的聲學特征。常見的神經網絡聲學模型大致可以分成兩大類:

  一是自回歸聲學模型:比如 Tacotron、Tacotron2,優點是高自然度,缺點是性能較差;基于 attention 的自回歸聲學模型難以建模長語音,更容易出現丟字、重複的現象。

  二是非自回歸聲學模型:比如Fastspeech、Fastspeech2,優點是並行生成聲學特征,性能好,對長句建模足夠魯棒;缺點是韻律建模略差于自回歸聲學模型。

  綜合質量和性能,有道 AI 團隊最終選擇了基于 VAE 的非自回歸聲學模型。原因在于它有以下優勢:

  同時,我們針對一部分算子的計算耗時占總時長比例較大的問題進行了工程上的優化,進一步改善了系統整體的實時率。

  聲碼器的作用是將聲學模型輸出的聲學特征轉換成語音時域信號。它直接影響著合成語音的音質,因此對于用戶體驗來說至關重要。

  一是音質問題。聲碼器模型的建模能力不足,會直接導致合成語音産生底噪或者電音。但如果僅僅只是單純地加大模型的參數,則會影響系統的推理速度。

  二是性能問題。聲碼器的計算量在語音合成的整個框架中占比較大。要在嵌入式場景中合成高質量的語音,需要一個足夠大、建模能力足夠強的聲碼器模型。

  但由于設備芯片的算力弱、內存小,大的聲碼器會導致體驗延時明顯上升。從用戶的角度出發,延時過長,用戶等待時間過久,自然不會有好的體驗效果。

  爲了解決以上難題,通過大量實驗和綜合比對,最終有道 AI 團隊選擇了基于 GAN 方案的聲碼器。

  首先是針對不同場景使用不同的模型配置,有道 AI 團隊對 GAN 聲碼器中的生成器模塊進行了參數的細致調整,讓它能夠成功應用在嵌入式場景下,不同于傳統參數聲碼器的機械感與模糊感,基于 GAN 的神經網絡聲碼器可以合成高自然度、高清晰度的音頻,縮短了離線 TTS 和在線 TTS 質量上的差距。

  此外,我們還在模型的量化、壓縮方面做了大量的工作,大大提升了語音合成的速度,明顯降低了系統的資源占用。

  在智能硬件産品人機交互中,語音合成技術扮演著非常重要的角色,但在落地中面臨著很多挑戰,其核心是硬件計算資源與合成語音質量之間的矛盾。

  如何更快地、更穩定地在有限資源下提供高質量的語音合成技術是有道 AI 團隊的目標和關注的重點。

  目前,有道 TTS 語音合成技術已應用在許多內部和外部的在線場景和嵌入式場景,並表現出了相對傳統方案更加穩定、更加魯棒的合成效果。

  相信了解算法同學經常會說動態規劃太難了,看到題目完全不知從何下手,或者是說“一看題解就會,一看題目就廢”這樣的一個狀態。本質上是由于學習動態規劃的時候,學習方法不對,最終導致南轅北轍,沒有掌握其中精髓。而動態規劃與遞推算法又有著暧昧不清的關系,我們選擇先從遞推算法入手,一步一步揭開動態規劃的神秘面紗。

  相關遊戲資訊連結:

  天堂W職業推薦練級方法快速升級攻

  dnf艾恩葛朗特1-100層怪物

  《天堂W》將與日本知名IP《烙印

  神域天堂平民玩家怎麽使用鑽石的效

  圖:MM玩家練成《天堂》第一個6