當前位置:
首頁 > 知識 > ARKit 文檔翻譯

ARKit 文檔翻譯

來源:星夜暮晨

原文:https://developer.apple.com/arkit/

Apple 原文地址:

https://developer.apple.com/arkit/

iOS 11 引入了 ARKit,這是一個全新的框架,允許開發者輕鬆地為 iPhone 和 iPad 創建無與倫比的增強現實體驗。通過將虛擬對象和虛擬信息同用戶周圍的環境相互融合,ARKit 使得應用跳出屏幕的限制,讓它們能夠以全新的方式與現實世界進行交互。

基礎技術視覺慣性里程計

ARKit 使用視覺慣性里程計 (Visual Inertial Odometry, VIO) 來精準追蹤周圍的世界。VIO 將攝像頭的感測器數據同 Core Motion 數據進行融合。這兩種數據允許設備能夠高精度地感測設備在房間內的動作,而且無需額外校準。

場景識別與光亮估量

藉助 ARKit,iPhone 和 iPad 可以分析相機界面中所呈現的場景,並在房間當中尋找水平面。ARKit 不僅可以檢測諸如桌子和地板之類的水平面,還可以在較小特徵點 (feature points) 上追蹤和放置對象。ARKit 還利用攝像頭感測器來估算場景當中的可見光總亮度,並為虛擬對象添加符合環境照明量的光量。

高性能硬體與渲染優化

ARKit 運行在 Apple A9 和 A10 處理器上。這些處理器能夠為 ARKit 提供突破性的性能,從而可以實現快速場景識別,並且還可以讓您基於現實世界場景,來構建詳細並引人注目的虛擬內容。您可以利用 Metal、Scenekit 以及諸如 Unity、虛幻引擎之類的第三方工具,來對 ARKit 進行優化。

ARKit 概述

ARKit 將 iOS 設備的攝像頭和設備動作檢測 (Motion) 功能,集成到您的應用或者遊戲當中,從而為用戶提供增強現實體驗。

所謂的增強現實 (Augmented Reality, AR),指的是向設備攝像頭產生的實時動態視圖中,添加 2D 或者 3D 元素,然後用某種方法讓這些元素看起來就處於現實世界當中,所產生一種用戶體驗。ARKit 提供了設備動作追蹤、相機場景捕獲和高級場景處理,並讓 AR 元素的展示變得極為便利,從而大大簡化了建立 AR 用戶體驗的工作難度。

什麼是增強現實?

探索 AR 的概念、特性,以及了解構建優秀 AR 場景的最佳實踐。

概覽

對於所有的 AR 場景而言,最基本要求是:創建並追蹤現實空間和虛擬空間之間的關係,其中,現實空間是用戶所處的世界,虛擬空間是可對可視化內容進行建模的世界,這同時也是 ARKit 的基本特徵。

當您的應用將這些虛擬內容與實時視頻結合,並一起顯示的時候,用戶就可以體驗到所謂的「增強現實」:您的虛擬內容成為了真實世界的一部分,儘管這只是「錯覺」而已。

全局追蹤是如何工作的

為了在現實世界和虛擬世界之間建立對應關係,ARKit 使用了一種被稱為視覺慣性里程計的技術。這項技術會將 iOS 設備的動作感測硬體信息,加上對可見場景的計算機視覺分析功能,然後與設備的攝像頭相結合。

ARKit 將會去識別場景圖像當中的顯著特徵,然後在視頻幀中追蹤這些特徵位置的距離,然後再將這些信息與動作感測數據進行比較。從而生成具備設備位置和動作特徵的高精度模型。

全局追蹤 (World Tracking) 同樣也可以分析和識別場景當中的內容。通過使用點擊測試 (hit-testing) 方法(參見 ARHitTestResult 類),從而找到與相機圖像中的某個點所對應的真實世界面。

如果您在 Session (會話) 配置當中啟用了 planeDetection 配置的話,那麼 ARKit 就會去檢測相機圖像當中的水平面,並報告其位置和大小。您可以使用點擊測試所生成的結果,或者使用所檢測到的水平面,從而就可以在場景當中放置虛擬內容,或者與之進行交互。

最佳實踐與限制

全局追蹤是一項不精確的科學 (inexact science)。儘管在這個過程當中,經常會產生可觀的準確度,從而讓 AR 的體驗更加真實。

然而,它嚴重依賴於設備物理環境的相關細節,而這些細節並不總是一致,有些時候也難以實時測量,這也就導致這些物理細節往往都會存在某種程度的錯誤。要建立高品質的 AR 體驗,那麼請注意下述這些注意事項和提示:

>>基於可見的照明條件來設計 AR 場景。全局追蹤涉及到了圖像分析的相關內容,因此就需要我們提供清晰的圖像。如果攝像頭沒有辦法看到相關的物理細節,比如說攝像頭拍到的是一面空空如也的牆壁,或者場景的光線實在太暗的話,那麼全局追蹤的質量就會大大降低。

>>根據追蹤質量的相關信息來給用戶進行反饋提示。全局追蹤會將圖像分析與設備的動作模式關聯起來。如果設備正在移動的話,那麼 ARKit 就可以更好地對場景進行建模,這樣即便設備只是略微晃動,也不會影響追蹤質量。

但是一旦用戶的動作過多、過快或者晃動過於激烈,就會導致圖像變得模糊,或者導致視頻幀中要追蹤的特徵之間的距離過大,從而致使追蹤質量的降低。

ARCamera類能夠提供追蹤狀態,此外還能提供導致該狀態出現的相關原因,您可以在 UI 上展示這些信息,告訴用戶如何解決追蹤質量低這個問題。

>>給水平面檢測預留點時間來生成清晰的結果,一旦您獲得所需的結果後,就禁用水平面檢測。一開始對水平面進行檢測的時候,所檢測到的水平面位置和範圍很可能不準確。

不過隨著時間的推移,只要水平面仍然保持在場景當中,那麼 ARKit 就能夠較為精確地估計水平面的位置和範圍。

當場景中有一個比較大的平坦表面的話,就算您已經使用過這個水平面來放置內容,那麼ARKit 可能還會繼續對水平面的錨點位置、範圍和變換點進行修正 。

構建基本的 AR 場景

配置 AR Session,然後使用 SceneKit 或者 SpriteKit 來展示 AR 內容。

概覽

如果您使用了 ARSCNView 或者 ARSKView 類的話,那麼 ARKit 就可自行滿足創建 AR 場景的基本要求:即每個視圖的背景用實時的相機圖像來展示,然後還可以渲染您提供的 2D 或者 3D 覆蓋物 (overlay),從而構建出「這些覆蓋物實際上是位於現實世界中」這樣一種錯覺。

要使用這些視圖類的話,您可以根據您所想要創建的 AR 場景類型來進行配置,然後為覆蓋物選定位置和表示方式。

如果您需要構建自定義的視圖來展示 AR 場景的話,請參閱「使用 Metal 來展示 AR 場景」一節。

注意

本文所涉及的代碼均可以在 Xcode 項目模板當中找到。如果要獲取完整的示例代碼,請使用 「Augmented Reality」 模板來創建一個新的 iOS 應用,然後在彈出的 Content Technology 菜單當中選擇 「Metal」。

配置 AR Session 並運行

ARSCNView 和 ARSKView 類都是包含在 ARSession 當中的,而 ARSession 對象則用來管理設備動作追蹤和進行圖像處理的,也就是創建 AR 場景的必需品。但是,要運行 Session,您首先必須選擇一種 Session 配置。

您所選擇的配置對象的類型,決定了您所創建的 AR 場景的風格和質量:

>>在具備 A9 或者更高版本處理器的 iOS 設備中,

ARWorldTrackingSessionConfiguration 子類提供了高精度的設備動作追蹤功能,可以幫助您將虛擬內容「放置」在現實世界中的某個表面上。

>>在 ARKit 所支持的其他設備當中,

ARSessionConfiguration 這個基礎類則提供了基本的動作追蹤功能,可以提供略弱的沉浸式 AR 體驗。

要啟動 AR Session,那麼首先要使用您所需要的配置,來創建 Session 配置對象,然後對 ARSCNView 或者 ARSKView 實例中的 session 對象調用 run(_:options:) 方法:

override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated) // 創建 Session 配置

let configuration = ARWorldTrackingSessionConfiguration()

configuration.planeDetection = .horizontal

// 運行視圖 Session

sceneView.session.run(configuration)

}

重要

只有當視圖即將展示在屏幕的時候,才能夠運行視圖 Session。

當您配置完 AR Session 之後,就可以使用 SceneKit 或者 SpriteKit ,來將虛擬內容放置到視圖當中了。

使用 SpriteKit 來提供 2D 虛擬元素

使用 SpriteKit 在您的 3D AR 場景中放置二維圖像。

要將 SpriteKit 元素放進增強現實當中,您首先需要運行 AR Session(請參閱「構建基本的 AR 場景」一節)。

SpriteKit 只包含有 2D 元素,但是增強現實則涉及到現實世界的 3D 空間。

因此,使用ARSKView 類來創建 AR 場景,這樣就可以在真實世界對應的 3D 位置 ( ARAnchor 對象) 中放置 2D 精靈元素 ( SKNode) 對象)。當用戶移動設備的時候,視圖會自動旋轉並縮放與錨點相對應的 SpriteKit 結點,看起來這些元素能夠追蹤相機所看到的真實世界。

舉個例子,您可以將 2D 圖像以漂浮的方式,放置在 3D 空間當中:

// Create a transform with a translation of 0.2 meters in front of the camera.

var translation = matrix_identity_float4x4

translation.columns.3.z = -0.2let transform = simd_mul(view.session.currentFrame.camera.transform, translation)

// Add a new anchor to the session.

let anchor = ARAnchor(transform: transform)

view.session.add(anchor: anchor)

// (Elsewhere...) Provide a label node to represent the anchor.

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {

return SKLabelNode(text: "")

}

上面的這個 view(_:nodeFor:) 方法將會返回一個 SKLabelNode 對象,用以展示文本標籤。與大多數 SpriteKit 結點一樣,這個類將會創建一個 2D 的可視化表示,因此ARSKView 類將會以廣告牌的樣式來展示這個結點:精靈可以通過(圍繞 z 軸)縮放以及旋轉,讓其看起來能夠跟隨錨點的 3D 位置,但是卻始終面向相機。

使用 SceneKit 來提供 3D 虛擬元素

使用 SceneKit 在您的 AR 場景中放置逼真的三維圖像。

要將 SceneKit 元素放到增強現實當中的話,您首先需要運行 AR Session(請參閱「構建基本的 AR 場景」一節)。

由於 ARKit 會自動將 SceneKit 空間與現實世界進行匹配,因此只需要放置一個虛擬對象,然後讓其位於一個看起來比較真實的位置,這就需要您適當地設置 SceneKit 對象的位置。例如,在默認配置下,以下代碼會將一個 10 立方厘米的立方體放置在相機初始位置的前 20 厘米處:

let cubeNode = SCNNode(geometry: SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0))

cubeNode.position = SCNVector3(0, 0, -0.2) // SceneKit/AR coordinates are in meterssceneView.scene.rootNode.addChildNode(cubeNode)

上述代碼直接在視圖的 SceneKit 場景中放置了一個對象。該對象會自動追蹤真實世界的位置,因為 ARKit 將 SceneKit 空間與現實世界空間互相匹配了起來。

此外,您也可以使用 ARAnchor 類來追蹤現實世界的位置,可以自行創建錨點並將其添加到 Session 當中,也可以對 ARKit 自動創建的錨點進行觀察 (observing)。

例如,當水平面檢測啟用的時候,ARKit 會為每個檢測到的水平面添加錨點,並保持更新。要為這些錨點添加可視化內容的話,就需要實現 ARSCNViewDelegate 方法,如下所示:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { // This visualization covers only detected planes.

guard let planeAnchor = anchor as? ARPlaneAnchor else { return } // Create a SceneKit plane to visualize the node using its position and extent.

let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z)) let planeNode = SCNNode(geometry: plane)

planeNode.position = SCNVector3Make(planeAnchor.center.x, 0, planeAnchor.center.z) // SCNPlanes are vertically oriented in their local coordinate space.

// Rotate it to match the horizontal orientation of the ARPlaneAnchor.

planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0) // ARKit owns the node corresponding to the anchor, so make the plane a child node.

node.addChildNode(planeNode)

}

遵循設計 3D 資源時的最佳實踐

>>使用 SceneKit 基於物理引擎的照明模型,以便獲得更為逼真的外觀。

(參見SCNMaterial 類和 SceneKit 示例代碼項目當中的 「Badger: Advanced Rendering」。)

>>打上環境光遮蔽陰影

(Bake ambient occlusion shading),使得物體在各種場景照明條件下能夠正常亮起。

>>如果您打算創建一個虛擬對象,並打算將其放置在 AR 的真實平面 (real-world flat surface) 上,那麼請在 3D 素材中的對象下方,添加一個帶有柔和陰影紋理的透明平面。

使用 Metal 來展示 AR 場景

通過渲染相機圖像,以及使用位置追蹤信息來展示覆蓋物,從而來構建自定義的 AR 視圖場景。

概覽

ARKit 中內置了一些視圖類,從而能夠輕鬆地用 SceneKit 或者 SpriteKit 來展示 AR 場景。然而,如果您使用的是自己的渲染引擎(或者集成了第三方引擎),那麼 ARKit 還提供了自定義視圖以及其他的支持環境,來展示 AR 場景。

在所有的 AR 場景中,首先就是要配置一個 ARSession 對象,用來管理攝像頭拍攝和對設備動作進行處理。Session 定義並維護現實空間和虛擬空間之間的關聯關係,其中,現實空間是用戶所處的世界,虛擬空間是可對可視化內容進行建模的世界。如果要在自定義視圖當中展示您的 AR 場景的話,那麼您需要:

(1)從 Session 中檢索視頻幀和追蹤信息;

(2)將這些幀圖像作為背景,渲染到自定義視圖當中;

(3)使用追蹤信息,從而在相機圖像上方定位並繪製 AR 內容。

注意

本文所涉及的代碼均可以在 Xcode 項目模板當中找到。如果要獲取完整的示例代碼,請使用 「Augmented Reality」 模板來創建一個新的 iOS 應用,然後在彈出的 Content Technology 菜單當中選擇 「Metal」。

從 Session 中獲取視頻幀和追蹤數據

請自行創建並維護 ARSession 實例,然後根據您所希望提供的 AR 場景類型,使用合適的 Session 配置來運行這個實例。(要實現這點的話,請參閱「構建基本的 AR 場景」。)

Session 從攝像機當中捕獲視頻,然後在建模的 3D 空間中追蹤設備的位置和方向,並提供 ARFrame 對象。每個ARFrame對象都包含有單獨的視頻幀 (frame) 圖像和被捕獲時的設備位置追蹤信息。

要訪問 AR Session 中生成的 ARFrame 對象的話,有以下兩種方法,使用何種方法取決於您應用的設計模式是偏好主動拉取 (pull) 還是被動推(push)。

如果您傾向於定時獲取視頻幀的話(也就是主動拉取設計模式),那麼請使用 Session 的 currentFrame 屬性,這樣就可以在每次重繪視圖內容的時候,獲取當前的幀圖像和追蹤信息。ARKit Xcode 模板使用了如下方法:

// 在 Renderer 類當中,通過 Renderer.update() 來從 MTKViewDelegate.draw(in:) 中調用func updateGameState() {

guard let currentFrame = session.currentFrame else { return

}

updateSharedUniforms(frame: currentFrame)

updateAnchors(frame: currentFrame)

updateCapturedImageTextures(frame: currentFrame) if viewportSizeDidChange {

viewportSizeDidChange = false

updateImagePlane(frame: currentFrame)

}

}

相反,如果您的應用設計傾向於使用被動推送模式的話,

那麼請實現session(_:didUpdate:) 代理方法,當每個視頻幀被捕獲之後,Session 就會調用這個代理方法(默認每秒捕獲 60 幀)。

獲得一個視頻幀之後,您就需要繪製相機圖像了,然後將 AR 場景中包含的所有覆蓋物進行更新和展示。

繪製相機圖像

每個 ARFrame 對象的 capturedImage 屬性都包含了從設備相機中捕獲的像素緩衝區 (pixel buffer)。要將這個圖像作為背景繪製到自定義視圖當中,您需要從圖像內容中構建紋理 (texture),然後提交使用這些紋理進行 GPU 渲染的命令。

像素緩衝區的內容將被編碼為雙面 (biplanar) YCbCr 數據格式(也成為 YUV);要渲染圖像的話,您需要將這些像素數據轉換為可繪製的 RGB 格式。對於 Metal 渲染而言,最高效的方法便是使用 GPU 著色代碼 (shader code) 來執行這個轉換了。

藉助CVMetalTextureCache API,可以從像素緩衝區中生成兩個 Metal 紋理——一個用於決定緩衝區的亮度 (Y),一個用於決定緩衝區的色度 (CbCr) 面。

func updateCapturedImageTextures(frame: ARFrame) { // 從所提供的視頻幀中,根據其中所捕獲的圖像,創建兩個紋理 (Y and CbCr)

let pixelBuffer = frame.capturedImage if (CVPixelBufferGetPlaneCount(pixelBuffer) < 2) { return

}

capturedImageTextureY = createTexture(fromPixelBuffer: pixelBuffer, pixelFormat:.r8Unorm, planeIndex:0)!

capturedImageTextureCbCr = createTexture(fromPixelBuffer: pixelBuffer, pixelFormat:.rg8Unorm, planeIndex:1)!

}func createTexture(fromPixelBuffer pixelBuffer: CVPixelBuffer, pixelFormat: MTLPixelFormat, planeIndex: Int) -> MTLTexture? { var mtlTexture: MTLTexture? = nil

let width = CVPixelBufferGetWidthOfPlane(pixelBuffer, planeIndex) let height = CVPixelBufferGetHeightOfPlane(pixelBuffer, planeIndex) var texture: CVMetalTexture? = nil

let status = CVMetalTextureCacheCreateTextureFromImage(nil, capturedImageTextureCache, pixelBuffer, nil, pixelFormat, width, height, planeIndex, &texture) if status == kCVReturnSuccess {

mtlTexture = CVMetalTextureGetTexture(texture!)

} return mtlTexture

}

接下來,使用藉助顏色變換矩陣將 YCbCr 轉換為 RGB 的函數片段,完成這兩個紋理的繪製,我們這裡將整個渲染命令進行編碼。

fragment float4 capturedImageFragmentShader(ImageColorInOut in [[stage_in]],

texture2d capturedImageTextureY [[ texture(kTextureIndexY) ]],

texture2d capturedImageTextureCbCr [[ texture(kTextureIndexCbCr) ]]) {

constexpr sampler colorSampler(mip_filter::linear,

mag_filter::linear,

min_filter::linear); const float4x4 ycbcrToRGBTransform = float4x4(

float4(+1.164380f, +1.164380f, +1.164380f, +0.000000f),

float4(+0.000000f, -0.391762f, +2.017230f, +0.000000f),

float4(+1.596030f, -0.812968f, +0.000000f, +0.000000f),

float4(-0.874202f, +0.531668f, -1.085630f, +1.000000f)

); // Sample Y and CbCr textures to get the YCbCr color at the given texture coordinate

float4 ycbcr = float4(capturedImageTextureY.sample(colorSampler, in.texCoord).r,

capturedImageTextureCbCr.sample(colorSampler, in.texCoord).rg, 1.0); // Return converted RGB color

return ycbcrToRGBTransform * ycbcr;

}

注意

請使用

displayTransform(withViewportSize:orientation:) 方法來確保整個相機圖像完全覆蓋了整個視圖。關於如何使用這個方法,以及完整的 Metal 管道配置代碼,請參閱完整的 Xcode 模板。(請使用 「Augmented Reality」 模板來創建一個新的 iOS 應用,然後在彈出的 Content Technology 菜單當中選擇 「Metal」。)

追蹤並渲染覆蓋內容

AR 場景通常側重於渲染 3D 覆蓋物,使得這些內容似乎是從相機中所看到的真實世界的一部分。為了實現這種效果,

我們使用 ARAnchor 類,來對 3D 內容相對於現實世界空間的位置和方向進行建模。錨點提供了變換 (transform) 屬性,在渲染的時候可供參考。舉個例子,當用戶點擊屏幕的時候,Xcode 模板會在設備前方大約 20 厘米處,創建一個錨點。

func handleTap(gestureRecognize: UITapGestureRecognizer) {

// Create anchor using the camera s current position

if let currentFrame = session.currentFrame {

// Create a transform with a translation of 0.2 meters in front of the camera

var translation = matrix_identity_float4x4

translation.columns.3.z = -0.2

let transform = simd_mul(currentFrame.camera.transform, translation)

// Add a new anchor to the session

let anchor = ARAnchor(transform: transform)

session.add(anchor: anchor)

}

}

在您的渲染引擎當中,使用每個 ARAnchor 對象的 transform 屬性來放置虛擬內容。Xcode 模板在內部的方法中,使用添加到 Session 當中每個錨點來定位一個簡單的立方體網格 (cube mesh):

func updateAnchors(frame: ARFrame) {

// Update the anchor uniform buffer with transforms of the current frame s anchors anchorInstanceCount = min(frame.anchors.count, kMaxAnchorInstanceCount)

var anchorOffset: Int = 0

if anchorInstanceCount == kMaxAnchorInstanceCount { anchorOffset = max(frame.anchors.count - kMaxAnchorInstanceCount, 0)

} for index in 0..

let anchor = frame.anchors[index + anchorOffset]

// Flip Z axis to convert geometry from right handed to left handed

var coordinateSpaceTransform = matrix_identity_float4x4

coordinateSpaceTransform.columns.2.z = -1.0

let modelMatrix = simd_mul(anchor.transform, coordinateSpaceTransform)

let anchorUniforms = anchorUniformBufferAddress.assumingMemoryBound(to: InstanceUniforms.self).advanced(by: index)

anchorUniforms.pointee.modelMatrix = modelMatrix

}

}

注意

在更為複雜的 AR 場景中,您可以使用點擊測試或者水平面檢測,來尋找真實世界當中曲面的位置。要了解關於此內容的詳細信息,請參閱 planeDetection 屬性和hitTest(_:types:) 方法。對於這兩者而言,ARKit 都會生成 ARAnchor 對象作為結果,因此您仍然需要使用錨點的 transform 屬性來放置虛擬內容。

根據實際光照度進行渲染

當您在場景中配置用於繪製 3D 內容的著色器時,請使用每個 ARFrame 對象當中的預計光照度信息,來產生更為逼真的陰影:

// in Renderer.updateSharedUniforms(frame:):

// Set up lighting for the scene using the ambient intensity if provided

var ambientIntensity: Float = 1.0if let lightEstimate = frame.lightEstimate { ambientIntensity = Float(lightEstimate.ambientIntensity) / 1000.0}let ambientLightColor: vector_float3 = vector3(0.5, 0.5, 0.5)

uniforms.pointee.ambientLightColor = ambientLightColor * ambientIntensity

注意

要了解該示例中的全部 Metal 配置,以及所使用的渲染命令,請參見完整的 Xcode 模板。(請使用 「Augmented Reality」 模板來創建一個新的 iOS 應用,然後在彈出的 Content Technology 菜單當中選擇 「Metal」。)

小編拉你進粉絲微信群

不是在文章評論里回復

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員之家 的精彩文章:

Hello World 程序的起源與歷史
程序員給孩子取名字,新技能
如何提升程序員的非技術才能
程序猿媳婦兒注意事項

TAG:程序員之家 |

您可能感興趣

GitHub中文幫助文檔上線:統一術語翻譯,Fork成「分叉」
必應翻譯被拋棄:Twitter PWA轉用谷歌翻譯
《Digital-Tutors-AE動畫原理12則教程》中文翻譯教程+工程文件分享
12頁《The Dark Knight》劇本翻譯
RaoTips翻譯 有關Batch Brew
開發者將Google Lens AR文本翻譯應用於VR場景中
Ten Little Ones 中英文音頻和翻譯
玩 High API 系列之:拍照翻譯
Twitter PWA Win10版更新:翻譯實用
CMBYN翻譯序言
Timekettle時空壺翻譯耳機WT2 Plus使用評測
微軟OneDrive App更新:修復文本翻譯,增加指紋解鎖
好文翻譯丨Linux 文件系統 EXT4 的前世今生
StarGAN - 圖像到圖像的翻譯
外文翻譯丨「王者對戰」之 MySQL 8 vs PostgreSQL 10(深度)
通吃BERT、GPT-2,用TF 2.0實現谷歌破世界紀錄的機器翻譯模型Transformer
【翻譯組】INS怎樣征服NBA
Deep Voice Report個人翻譯
谷歌將AutoML應用於Transformer架構,翻譯結果飆升,已開源
Facebook 開源 ConvNet AI:重新定義在線翻譯!