[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"project-47224295":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":34,"aspects":35,"strip":45,"post_text":48,"what":49,"said":81,"maker_in_thread":198,"shape":209,"grid":213,"attempts":661,"same_week":662,"maker_shows":41,"maker_hidden":690,"reader_version":691,"card":692},"47224295","I built a sub-500ms latency voice agent from scratch","A sub-500ms latency voice agent from scratch","title","Show HN: I built a sub-500ms latency voice agent from scratch","https:\u002F\u002Fwww.ntik.me\u002Fposts\u002Fvoice-agent","ntik.me","nicktikhonov",1772486620,2026,570,153,37,4366,1,"legend","ai","voice agent","other",[21,24,25,26,27],"latency","speech to text","text to speech","barge-in","curious",0.181,{"positive":31,"neutral":32,"mixed":18,"critical":33},18,31,10,60,{"idea":36,"docs":38,"performance":40,"design":42,"pricing":44},{"positive":33,"critical":37},6,{"positive":39,"critical":18},3,{"positive":41,"critical":39},2,{"positive":18,"critical":43},0,{"positive":43,"critical":43},[46,43,43,43,43,43,43,43,43,39,39,43,39,43,18,18,46,39,39,18,46,41,47,39,18,46,43,18,39,39,39,41,47,47,46,46,46,47,39,46],5,4,"I built a voice agent from scratch that averages ~400ms end-to-end latency (phone stop → first syllable). That’s with full STT → LLM → TTS in the loop, clean barge-ins, and no precomputed responses.\n\nWhat moved the needle:\n\nVoice is a turn-taking problem, not a transcription problem. VAD alone fails; you need semantic end-of-turn detection.\n\nThe system reduces to one loop: speaking vs listening. The two transitions - cancel instantly on barge-in, respond instantly on end-of-turn - define the experience.\n\nSTT → LLM → TTS must stream. Sequential pipelines are dead on arrival for natural conversa",{"problem":50,"audience":56,"pricing":56,"motivation":56,"time_to_build":56,"stack":57,"openness":80,"stage":80,"team_size":80},{"value":51,"source":52,"evidence":53},"Natural low-latency turn-taking in voice conversations with an AI agent","maker",[54],{"id":55},"post",null,[58,64,68,74],{"value":59,"source":52,"evidence":60},"Deepgram Flux for speech-to-text and endpointing",[61],{"id":62,"by":11,"text":63},"47225089","If you read the post, you'll see that I used Deepgram's Flux. It also does endpointing and is a higher-level abstraction than VAD.",{"value":65,"source":52,"evidence":66},"Groq for LLM inference",[67],{"id":55},{"value":69,"source":52,"evidence":70},"Twilio for telephony",[71],{"id":72,"by":11,"text":73},"47225246","I was using Twilio, and as far as I'm aware they handle any echos that may arise. I'm actually not sure where in the telephony stack this is handled, but I didn't see any issues…",{"value":75,"source":52,"evidence":76},"Claude used as coding assistant in development",[77],{"id":78,"by":11,"text":79},"47226384","I'd say it was a collaboration. I had to hand-hold Claude quite a bit in the early stages, especially with architecture, and find the right services to get the outcome I wanted.…","unknown",{"praise":82,"objections":106,"requests":125,"questions":147,"alternatives":170},[83,99],{"value":84,"source":85,"evidence":86},"Clear writeup and explanation of turn-taking and latency","commenter",[87,91,95],{"id":88,"by":89,"text":90},"47225408","armcat","This is an outstanding write up, thank you! Regarding LLM latency, OpenAI introduced web sockets in their Responses client recently so it should be a bit faster. An alternative…",{"id":92,"by":93,"text":94},"47228698","stonelazy","This is a really solid writeup. The streaming pipeline architecture, the detailed latency breakdown per stage are genuinely useful. Building the core turn-taking loop from…",{"id":96,"by":97,"text":98},"47224438","NickNaraghi","Pretty exciting breakthrough. This actually mirrors the early days of game engine netcode evolution. Since latency is an orchestration problem (not a model problem) you can beat…",{"value":100,"source":85,"evidence":101},"Interruption handling feels natural",[102],{"id":103,"by":104,"text":105},"47228496","aanet","The voice samples sound fantastic The interruption handling is amazing. I felt you were talking to an actual person. It might have helped that he had a British accent :)",[107,114,121],{"value":108,"source":85,"evidence":109},"Latency around 0.4-0.5 seconds still feels slow in conversation",[110],{"id":111,"by":112,"text":113},"47227717","ggm","Thats half a second delay. 0.4 to 0.5 seconds. Thats the same as the delay in a GEO orbit satellite mediated phone conversation. Perhaps I'm in an older cohort, but I remember…",{"value":115,"source":85,"evidence":116},"Post reads as AI-generated",[117],{"id":118,"by":119,"text":120},"47233178","eudamoniac","This post is AI except you manually replaced the em dashes with hyphens",{"value":122,"source":85,"evidence":123},"The 2x Vapi comparison ignores tool calls and platform work",[124],{"id":92,"by":93,"text":94},[126,137],{"value":127,"source":85,"evidence":128},"Open-source end-to-end or offline version",[129,133],{"id":130,"by":131,"text":132},"47225431","docheinestages","Does anyone know about a fully offline, open-source project like this voice agent (i.e. STT -> LLM -> TTS)?",{"id":134,"by":135,"text":136},"47225311","modeless","IMO STT -> LLM -> TTS is a dead end. The future is end-to-end. I played with this two years ago and even made a demo you can install locally on a gaming GPU:…",{"value":138,"source":85,"evidence":139},"Caching common phrases for lower latency",[140,144],{"id":141,"by":142,"text":143},"47227699","hosaka","Depending on the TTS model being used latency can be reduced further yet with an LRU cache, fetching common phrases from cache instead of generating fresh with TTS. However the…",{"id":145,"by":11,"text":146},"47226266","100% - I thought about that shortly after writing this up. One way to make this work is to have a tiny, lower latency model generate that first reply out of a set of options,…",[148,163],{"value":149,"source":85,"evidence":150},"How is semantic end-of-turn detection done and at what cost",[151,155,159],{"id":152,"by":153,"text":154},"47230076","swaminarayan","How are you doing semantic end-of-turn detection without adding latency to the critical path? Is it a separate lightweight model or integrated into the LLM stream?",{"id":156,"by":157,"text":158},"47230654","recognity","The insight about TTFT dominating everything resonates. We're seeing the same pattern in CLI tools — the perceived speed of AI features comes down to how fast you get the first…",{"id":160,"by":161,"text":162},"47231088","nthypes","What about the costs?",{"value":164,"source":85,"evidence":165},"How long-term memory and context are handled",[166],{"id":167,"by":168,"text":169},"47232099","mjbonanno","This is awesome! Exactly the kind of low-latency agent tooling I've been looking for. How are you handling long-term memory\u002Fcontext between calls?",[171,178,185,191],{"value":172,"source":85,"evidence":173},"Pipecat and LiveKit Agents",[174],{"id":175,"by":176,"text":177},"47225169","loevborg","Nice write-up, thanks for sharing. How does your hand-vibed python program compare to frameworks like pipecat or livekit agents? Both are also written in python.",{"value":179,"source":85,"evidence":180},"Soniox real-time STT with endpoint detection",[181],{"id":182,"by":183,"text":184},"47225053","lukax","Or you could use Soniox Real-time (supports 60 languages) which natively supports endpoint detection - the model is trained to figure out when a user's turn ended. This always…",{"value":186,"source":85,"evidence":187},"NVIDIA PersonaPlex",[188],{"id":189,"by":11,"text":190},"47225234","I didn't try Soniox, but I made a note to check it out! I chose Flux because I was already using Deepgram for STT and just happened to discover it when I was doing research. It…",{"value":192,"source":85,"evidence":193},"Dograh open source voice agent",[194],{"id":195,"by":196,"text":197},"47235885","pritesh1908","Great writeup. The speaking vs listening framing is underrated. TTFT with Groq and colocation are both real wins that don't get talked about enough. For anyone wanting this…",{"comments":199,"answered":200,"key":201},17,8,[202,205,206],{"id":203,"text":204},"47226619","This is fascinating, thanks for sharing! I wonder why amazon\u002Fgoogle\u002Fapple didn't hop on the voice assistant\u002Fagent train in the last few years. All 3 have existing products with…",{"id":145,"text":146},{"id":207,"text":208},"47225434","Very cool! starred and on my reading list. Would love to chat and share notes, if you'd like",{"commenters":210,"max_depth":211,"maker_replies":199,"first_comment_mins":200,"lifespan_hours":212},110,9,174,[214,218,220,222,225,227,231,233,236,238,241,243,246,249,251,254,256,259,262,265,268,270,272,274,276,278,281,284,287,290,293,296,299,302,305,308,311,315,318,320,323,326,330,332,335,338,341,344,347,350,353,356,357,360,363,366,369,372,375,377,379,381,384,387,390,392,394,398,401,404,405,406,409,411,414,416,417,419,422,425,427,431,433,436,439,442,445,448,451,452,454,458,461,462,463,465,468,471,473,478,480,482,486,490,492,496,499,502,505,508,510,512,514,518,522,525,527,529,533,537,538,540,543,545,548,552,554,558,561,564,567,569,571,575,579,581,584,586,589,593,595,597,601,605,607,611,615,618,622,626,631,635,638,642,646,651,655,657],[215,43,46,216,217,43],"47226535","project\u002Fpositive\u002Fidea","jedberg",[203,43,43,219,11,18],"other\u002Fneutral\u002Fnone",[221,43,43,219,217,43],"47226722",[223,43,43,219,224,43],"47226783","mcbits",[226,43,43,219,217,43],"47226821",[228,43,43,229,230,43],"47227411","commenter\u002Fneutral\u002Fprivacy","alexastoplying",[232,43,43,229,217,43],"47227491",[234,43,43,219,235,43],"47227636","argee",[237,43,43,219,217,43],"47227688",[239,43,43,219,240,43],"47227523","stavros",[242,43,43,219,217,43],"47227558",[244,43,43,219,245,43],"47228871","ghrl",[247,43,43,219,248,43],"47228364","llbbdd",[250,43,43,219,240,43],"47230553",[252,43,43,219,253,43],"47231276","derangedHorse",[255,43,43,219,240,43],"47231309",[257,43,43,219,258,43],"47231477","vidarh",[260,43,43,219,261,43],"47229803","aabdi",[263,43,43,219,264,43],"47227176","esperent",[266,43,43,219,267,43],"47227345","vcxy",[269,43,43,219,217,43],"47227506",[271,43,43,219,267,43],"47227868",[273,43,43,219,217,43],"47227917",[275,43,43,219,264,43],"47228387",[277,43,43,219,217,43],"47227501",[279,43,43,219,280,43],"47227998","emmelaich",[282,43,43,219,283,43],"47228656","sinuhe69",[285,43,43,219,286,43],"47231686","jermaustin1",[288,43,43,219,289,43],"47234219","BobaFloutist",[291,43,43,219,292,43],"47228270","YesBox",[294,43,43,219,295,43],"47228876","azinman2",[297,43,43,219,298,43],"47229444","miki_oomiri",[300,43,43,219,301,43],"47229548","iso1631",[303,43,43,219,304,43],"47230210","layer8",[306,43,43,219,307,43],"47230376","tmstieff",[309,43,43,219,310,43],"47229515","ktos",[312,43,39,313,314,43],"47228453","project\u002Fneutral\u002Fidea","russdill",[316,43,43,219,317,43],"47228549","Barbing",[319,43,43,219,314,43],"47229280",[321,43,43,322,317,43],"47234233","commenter\u002Fneutral\u002Fnone",[324,43,46,216,325,43],"47228977","mungoman2",[327,43,18,328,329,43],"47229895","project\u002Fcritical\u002Fidea","ismailmaj",[331,43,43,219,304,43],"47230151",[333,43,43,219,334,43],"47230684","kvirani",[336,43,43,219,337,43],"47230883","mywacaday",[339,43,43,219,340,43],"47231313","GrayShade",[342,43,43,219,343,43],"47232665","47282847",[345,43,43,219,346,43],"47304283","presentation",[348,43,43,219,349,43],"47318619","SergeAx",[351,43,43,322,352,43],"47233993","garettmd",[354,18,39,313,355,43],"47226218","brody_hamer",[145,18,43,216,11,18],[358,18,43,219,359,43],"47226882","dotancohen",[361,18,43,219,362,43],"47228298","eru",[364,18,43,219,365,43],"47234283","digitallyamar",[367,18,43,219,368,43],"47226455","starkparker",[370,18,39,313,371,43],"47226539","phkahler",[373,18,18,328,374,43],"47227273","fragmede",[376,18,43,322,362,43],"47228304",[378,18,18,328,374,43],"47229642",[380,18,43,322,362,43],"47235004",[382,18,43,322,383,43],"47228456","Rohunyyy",[385,18,43,322,386,43],"47228507","DoctorOetker",[388,18,43,322,389,43],"47233354","arcadianalpaca",[88,41,46,391,89,43],"maker\u002Fpositive\u002Fdocs",[207,41,43,393,11,18],"commenter\u002Fpositive\u002Fnone",[395,41,39,396,397,43],"47226365","project\u002Fneutral\u002Fperformance","alfalfasprout",[399,41,43,219,400,43],"47229121","ilaksh",[402,41,39,313,403,43],"47228716","riquito",[182,39,39,396,183,43],[62,39,43,322,11,18],[407,39,39,408,183,43],"47225181","maker\u002Fneutral\u002Fnone",[189,39,43,410,11,18],"project\u002Fneutral\u002Fnone",[412,39,39,410,413,43],"47227376","satvikpendem",[415,39,43,322,413,43],"47227379",[134,47,18,328,135,43],[418,47,43,313,11,18],"47225366",[420,47,43,322,421,43],"47225668","woodson",[423,47,43,322,424,43],"47226083","mountainriver",[426,47,43,219,400,43],"47229155",[428,47,46,429,430,43],"47226567","project\u002Fpositive\u002Fdesign","com2kid",[432,47,39,313,362,43],"47228321",[434,47,39,396,435,43],"47226824","donpark",[437,47,43,219,438,43],"47227268","tmzt",[440,47,39,313,441,43],"47227431","rockwotj",[443,47,18,444,314,43],"47228469","project\u002Fcritical\u002Fperformance",[446,47,43,219,447,43],"47228721","coppsilgold",[449,47,39,313,450,43],"47228784","cootsnuck",[96,46,46,216,97,43],[92,37,39,453,93,43],"project\u002Fmixed\u002Fperformance",[455,456,43,219,457,43],"47225335",7,"age123456gpg",[459,200,39,396,460,43],"47225220","perelin",[72,200,43,396,11,18],[130,211,39,313,131,43],[464,211,43,313,11,18],"47225480",[466,211,18,328,467,43],"47231035","numpad0",[469,211,43,219,470,43],"47235964","nfrench17",[472,33,43,219,400,43],"47229254",[474,475,46,476,477,43],"47230233",11,"maker\u002Fpositive\u002Fidea","evara-ai",[175,479,39,410,176,43],12,[481,479,43,410,11,18],"47225277",[483,484,46,476,485,43],"47224409",13,"MbBrainz",[487,488,43,219,489,43],"47227857",14,"kaonwarb",[195,491,43,219,196,43],15,[493,494,43,219,495,43],"47231412",16,"bachittle",[497,199,43,219,498,43],"47264315","mister_tars",[500,31,18,328,501,43],"47229627","juliendorra",[503,504,43,219,450,43],"47228667",19,[506,504,43,219,507,43],"47228731","totetsu",[509,504,43,219,450,43],"47228894",[511,504,43,219,507,43],"47232402",[156,513,39,313,157,43],20,[515,516,39,410,517,43],"47225265",21,"boznz",[519,520,43,219,521,43],"47226215",22,"nmstoker",[523,520,43,219,524,43],"47226483","upmind",[526,520,43,219,521,43],"47226738",[528,520,43,219,359,43],"47226931",[530,531,39,396,532,43],"47231515",23,"red2awn",[534,535,39,408,536,43],"47226333",24,"grayhatter",[78,535,43,408,11,18],[141,539,39,396,142,43],25,[541,539,43,542,11,18],"47230099","maker\u002Fneutral\u002Fperformance",[111,544,18,444,112,43],26,[118,546,18,547,119,43],27,"maker\u002Fcritical\u002Fdocs",[549,550,46,391,551,43],"47227451",28,"kelvinjps10",[553,550,43,219,11,18],"47230080",[555,556,39,313,557,43],"47233709",29,"thatsadude",[103,559,46,560,104,43],30,"project\u002Fpositive\u002Fperformance",[562,559,43,219,563,43],"47228772","NitpickLawyer",[565,32,39,396,566,43],"47232396","melvinodsa",[152,568,39,313,153,43],32,[167,570,46,216,168,43],33,[572,573,39,313,574,43],"47235836",34,"wordglyph",[576,577,39,410,578,43],"47228539",35,"CharlesLau",[580,577,43,219,11,18],"47230084",[582,583,39,396,362,43],"47228269",36,[585,583,43,396,11,18],"47230066",[587,16,46,216,588,43],"47227251","waynerisner",[590,591,46,216,592,43],"47227180",38,"bronco21016",[594,591,43,313,11,18],"47230048",[596,591,43,219,592,43],"47233005",[598,599,46,391,600,43],"47229726",39,"saghul",[602,603,39,313,604,43],"47228945",40,"medi8r",[606,603,43,313,11,18],"47230055",[608,609,43,219,610,43],"47232688",41,"tete",[612,613,46,216,614,43],"47226004",42,"shubh-chat",[160,616,39,617,161,43],43,"project\u002Fneutral\u002Fpricing",[619,620,46,216,621,43],"47227960",44,"mst98",[623,624,18,444,625,43],"47229686",45,"gytdev",[627,628,46,629,630,43],"47224682",46,"project\u002Fpositive\u002Fnone","jangletown",[632,633,39,396,634,43],"47227309",47,"suganesh95",[636,637,39,396,634,43],"47227364",48,[639,640,39,313,641,43],"47254719",49,"STARGA",[643,644,43,219,645,43],"47226909",50,"foxes",[647,648,46,649,650,43],"47230852",51,"maker\u002Fpositive\u002Fnone","yarivk",[652,653,43,219,654,43],"47225508",52,"CagedJean",[656,653,43,322,11,18],"47225709",[658,659,46,560,660,43],"47232131",53,"arashsadrieh",[],[663,668,672,677,681,686],{"id":664,"name":665,"points":666,"category":667},"47164270","Terminal Phone",322,"security_privacy",{"id":669,"name":670,"points":671,"category":20},"47195123","Now I Get It",305,{"id":673,"name":674,"points":675,"category":676},"47220809","Govbase",219,"productivity",{"id":678,"name":679,"points":680,"category":20},"47212576","Timber",207,{"id":682,"name":683,"points":684,"category":685},"47180083","RetroTick",195,"dev_tools",{"id":687,"name":688,"points":684,"category":689},"47197218","Stacked Game of Life","learning_science",false,"v2",{"id":693,"name":5,"line":6,"ai":690,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":694,"top":18,"kw":695,"maker":11,"domain":10,"tier":19,"attempts":43,"strip":696,"url":9,"mix":697,"praise":84,"objection":108,"sub":21},47224295,0.18,[21,24,25,26,27],"5000000003303011533152431501333244555435",[31,32,18,33],1794036694982]