第59章 HICQ的百日封閉開發

投票推薦 加入書籤 小說報錯

  三月一日,驚蟄。深圳蛇口,海上世界背後的一處老別墅區。一棟三層白色小樓藏在榕樹和九里香叢中,鐵門緊閉,窗簾拉得嚴嚴實實。別墅是林浩租的,簽了半年,對外說是「浩宇遊戲平台技術攻堅基地」,實際門口掛了個手寫木牌,上面兩個字:「氧艙」。

  上午九點,別墅一樓客廳。十二個人,十二台電腦,沿著牆壁擺了一圈。窗簾是厚重的墨綠色絨布,隔絕了所有自然光,只有屏幕的冷光和頭頂日光燈慘白的光。空氣里有新電腦散發的塑料味,有速溶咖啡的焦苦,有熬夜後的汗酸,還有一種緊繃的、近乎實驗室的無菌感。

  張小龍站在客廳中央的白板前,白板上沒寫代碼,沒畫架構,只有一行用紅筆加粗的字:「老太太也能上來就語音聊天」。字下面畫了個簡單的流程圖:開機→點圖標→說話。只有三步。

  「從今天起,我們在這裡封閉開發一百天。」張小龍開口,聲音不高,但很清晰,「目標只有一個:做出一款讓老太太都能零門檻使用的語音聊天工具。不是『好用』,是『不用學就會用』。不是『流暢』,是『像呼吸一樣自然』。做不到,我們不出這個門。」

  十二個人,有從浩宇調來的老員工,有張小龍從廣州帶來的前Foxmail工程師,有剛招的應屆生。所有人看著那行字,表情各異。有人皺眉,有人困惑,有人躍躍欲試。

  「老大,」一個戴眼鏡的年輕工程師舉手,叫周明,是浩宇的老員工,之前做遊戲客戶端的,「語音聊天技術很複雜,要調編解碼,要搞網絡適配,要處理回聲消除。老太太怎麼可能懂這些?我們應該先做內測,讓核心用戶反饋,慢慢優化……」

  「沒有慢慢。」張小龍打斷他,「林浩只給三個月。三個月後,產品公測。我們要面對的,是幾億普通用戶,不是極客。他們不會給我們第二次機會。體驗不好,一秒就刪。」

  他走到白板前,在那行字下面又寫了一行:「所有技術問題,必須在產品層解決,不能讓用戶感知。」

  「什麼意思?」另一個工程師問,李濤,張小龍從廣州帶來的,做底層協議出身。

  「意思是,網絡不好,我們要自動降碼率,不能卡。有回聲,我們要算法消除,不能有雜音。對方說話聲音小,我們要動態增益,不用用戶調音量。」張小龍頓了頓,「所有技術實現,必須藏起來。用戶看到的,只是一個按鈕,點下去,就能說話。就這麼簡單。」

  「這……這做不到吧?」周明嘟囔,「網絡波動是物理限制,算法再強也……」

  「那就做到物理極限。」張小龍看向他,「林浩給了我們一個算法,『小藝』壓縮。語音帶寬能降到原來的30%。用這個當基礎,我們再優化。網絡波動,前向糾錯。回聲消除,用深度學習模型。這些技術,我們都有。現在要做的,是把它們打磨到極致,然後包裝成一個最簡單的界面。」

  他走到第一台電腦前,打開一個簡陋的Demo。屏幕上只有一個界面:深灰色背景,中間一個大大的圓形按鈕,按鈕上是麥克風圖標。按鈕下方一行小字:「按住說話」。

  「這是第一版界面。」張小龍說,「只有這一個按鈕。點一下,開始錄音。鬆開,發送。收到語音消息,自動播放。沒有好友列表,沒有群組,沒有設置——什麼都沒有。就這一個按鈕。」

  客廳里一片寂靜。所有人都盯著那個簡陋到可笑的界面。這……這也叫產品?

  「我們要做的,就是讓這個按鈕,在任何網絡環境下,任何硬體配置上,都能穩定工作。」張小龍說,「分組。周明,你帶三個人,攻網絡自適應。目標:在56K撥號、1M ADSL、區域網三種環境下,語音延遲都低於200毫秒,卡頓率低於1%。李濤,你帶三個人,攻音頻處理。目標:在菜市場、地鐵、辦公室三種噪音環境下,語音清晰度達到90%以上。小王,你帶兩個人,做UI和交互。目標:從點擊按鈕到開始錄音,反應時間低於50毫秒。小劉,你帶兩個人,做後台服務。目標:支持百萬級並發,消息到達率99.99%。我負責整體架構和算法調優。」

  分工明確,時間緊迫。沒人再質疑。鍵盤聲瞬間響起,密集得像暴雨。

  第一天,周明組就卡住了。他們在模擬56K撥號環境下測試,丟包率一旦超過5%,語音就斷斷續續。「前向糾錯要發冗餘包,但冗餘包占帶寬,反而增加延遲。這是個死循環。」

  張小龍走過去,看著屏幕上的數據流。「冗餘包不用每次發。根據網絡實時狀況動態調整。網絡好,少發。網絡差,多發。用機器學習預測丟包率,提前發冗餘。」

  「可機器學習模型需要訓練……」


  「林浩給了訓練數據,浩宇遊戲平台幾千萬條語音消息,帶網絡環境標籤。今晚就訓。」

  第二天,李濤組遇到回聲。他們在別墅里測試,兩個房間互相語音,回聲大得像在山谷里喊話。「現有的回聲消除算法,對付不了這種複雜環境。」

  張小龍調出「小藝」算法里的深度學習模型。「用這個。輸入原始音頻和回聲參考信號,輸出消除後的音頻。模型我預訓練過了,你們微調。」

  「可深度學習計算量大,實時性……」

  「優化。模型壓縮,定點量化,彙編級加速。我要明天看到結果。」

  第三天,小王組的UI出了問題。按鈕點擊響應時間達標了,但用戶反饋「不知道按了沒有」。張小龍說:「加一個視覺反饋。按下時按鈕顏色變深,周圍有漣漪擴散動畫。動畫要流暢,不能卡。」

  「可動畫會吃資源……」

  「用CSS3硬體加速。我要的是體驗,不是省那點CPU。」

  每天,林浩會在下午四點準時出現。不開車,步行過來,背著一個雙肩包,裡面是當天要看的代碼和測試報告。他進來後不說話,只是走到每個人的電腦後面,看屏幕,看日誌,看測試數據。看完了,走到張小龍面前,只說一句話。

  第一天:「網絡延遲的99分位值太高,降到150毫秒以下。」

  第二天:「回聲消除在低頻段效果不好,重訓模型。」

  第三天:「按鈕動畫掉幀,優化到60FPS。」

  第四天:「啟動速度慢了一秒,砍掉所有非必要初始化。」

  第五天:「語音消息播放時不能打斷,加個進度條。」

  第六天:「斷網重連邏輯太複雜,簡化到三步。」

  第七天:「安裝包大了0.5M,砍掉一個冗餘庫。」

  永遠只有一句話,指出一個最具體的問題。然後轉身離開,不多說一個字。像最苛刻的教練,只指出你的弱點,不告訴你怎麼練。

  壓力巨大。但團隊在高壓下,開始蛻變。周明組把網絡自適應算法優化到第七版,56K撥號下的延遲降到180毫秒。李濤組用深度學習模型,在菜市場噪音下也能提取清晰人聲。小王組的UI流暢得像德芙巧克力。小劉組的後台服務穩如磐石。

  但張小龍不滿意。他看著測試數據,總覺得少了什麼。

  第三十天,凌晨兩點。張小龍把所有人叫到客廳,打開電視,接上攝像頭。攝像頭對著客廳中央的一把椅子。

  「現在開始用戶測試。」他說,「不測試功能,測試『感覺』。我坐在這裡,你們輪流過來,假裝是我奶奶,用這個產品給我發語音消息。我要看你們的操作,看你們的表情,聽你們第一句話說什麼。」

  眾人面面相覷。但還是照做。第一個是周明,他坐下,拿起手機(測試機),點開那個唯一的按鈕,按住,說:「小龍啊,吃飯了沒?」

  發送。播放。聲音清晰,延遲很低。

  「感覺不對。」張小龍搖頭,「你太熟練了。我奶奶不會這麼自然。她會猶豫,會緊張,會不知道說什麼。再來。」

  李濤上。他坐下,盯著按鈕看了三秒,才小心地按下去,說:「餵?能聽見嗎?」

  「好一點,但還是很像測試。」張小龍說,「想像你真的是老人,第一次用智慧型手機,第一次語音聊天。你會怎麼做?」

  測試持續到凌晨四點。十二個人,演了十二個「奶奶」。有的小心翼翼,有的大大咧咧,有的說方言,有的嗓子啞。張小龍看著,記著,在白板上寫觀察:

  「猶豫期平均3秒」

  「第一次說話習慣說『餵』」

  「鬆手時很緊張,怕沒發出去」

  「聽到自己聲音會愣一下」

  「背景音很重要(電視聲、炒菜聲)」

  第二天,產品改了。啟動後,不是直接進聊天界面,而是一段簡單的引導動畫:一個慈祥的老奶奶頭像,配一行字:「按住下面,對孫子說話」。按鈕變大,顏色更醒目。按下時,按鈕會有溫和的脈動,像心跳。鬆開時,有「嗖」的一聲輕響,表示發送成功。收到消息自動播放,但第一次播放前,有文字提示:「孫子來信啦」。

  林浩下午來看,沒說話,自己坐下,用了一次。按住,說:「測試。」鬆開。播放。


  然後他說:「引導動畫裡的老奶奶,不像我奶奶。」

  張小龍愣住。

  「我奶奶更瘦,頭髮更白,眼神更慈祥。」林浩說,「換一個。要讓人一看就有親近感。」

  美術組連夜改圖,找了上百張老人照片,最終定稿一個:清瘦,白髮梳得整齊,眼睛彎彎的,嘴角有笑紋。像每個人的奶奶。

  第四十五天,林浩來,說:「語音播放時,不能操作其他應用。老太太可能會邊聽邊想回話,結果點不了按鈕。」

  加了一個「語音播放時按鈕禁用」的提示,但提示要友好:「先聽完孫子說啥,別急」。

  第六十天,網絡自適應算法終於穩定。在模擬的極端網絡環境下(丟包率20%,延遲500毫秒),語音依然連續,只是音質下降,但不會斷。張小龍說:「可以了。」

  林浩測試後,說:「音質下降時,加個提示:『網絡不太好,我慢點說』。用老奶奶的聲音說。」

  加了個TTS語音,溫柔,緩慢,帶點方言腔。

  第七十五天,產品基本成型。啟動快,連接穩,語音清,交互順。團隊鬆了口氣,覺得終於可以交差了。

  林浩來,測試了十分鐘,然後說:「不夠極致。」

  眾人心一沉。

  「哪裡?」張小龍問。

  「情感。」林浩說,「這還是個工具,冷冰冰的工具。我們要做的,是橋樑,是溫暖。奶奶給孫子發語音,不是要傳達信息,是要傳達關心。孫子給奶奶回語音,不是要匯報近況,是要讓她安心。這個產品,要能傳遞情緒。」

  「怎麼傳遞?」

  「細節。」林浩說,「比如,奶奶說話慢,我們的語音播放速度,可以自動適配——奶奶的語音,用原速。孫子的語音,如果太快,自動放慢一點。比如,深夜收到消息,播放音量自動調低,不吵醒人。比如,長時間沒聯繫,啟動時加一句:『好久沒和孫子聊天了吧?』比如,發送成功時,加一個溫暖的音效,像擁抱的聲音。」

  團隊沉默了。這些細節,每一個都要改代碼,調參數,測體驗。時間只剩二十五天了。

  「做不做?」張小龍問團隊。

  沒人說話。但眼神說明了一切——做。

  最後二十五天,瘋狂。周明組重寫了音頻播放引擎,加了語速自適應。李濤組優化了噪音檢測,深夜自動降噪。小王組設計了十幾個情感化提示,每一個都測試了上百遍。小劉組在後台加了用戶行為分析,用來觸發那些溫暖的提醒。

  第九十九天,凌晨。產品最終測試。十二個人,輪流模擬奶奶和孫子,發了三百條語音消息。每條消息,都在不同網絡環境、不同噪音背景、不同時間下測試。數據完美:延遲、卡頓、清晰度、用戶滿意度,全部達標。

  張小龍坐在那把椅子上,最後一次測試。他點開產品,啟動,看到那個慈祥的老奶奶頭像,看到「按住下面,對孫子說話」。他按住按鈕,忽然不知道該說什麼。

  沉默了三秒,他鬆開。發送了一條空白語音。

  然後,他聽到產品的提示音,是老奶奶溫和的聲音:「怎麼不說話?想孫子了吧?」

  那一刻,張小龍眼眶突然一熱。

  他知道,成了。

  第一百天,三月十日。林浩準時出現。他沒測試,只是坐下,讓張小龍演示了一遍。從啟動,到發送,到接收,到那些溫暖的細節。

  演示完,林浩沉默了很久。

  然後他說:「名字定了。叫『氧氣』。O₂。讓溝通,像呼吸一樣自然。」

  他站起身,走到門口,回頭:

  「明天,公測。」

  門關上。腳步聲遠去。

  別墅里,十二個人,沒人說話。只有屏幕上的O₂圖標,在黑暗裡,靜靜亮著。

  像一顆剛剛點燃的星。

  即將照亮,無數人孤獨的夜。

章節目錄