From 75506e0fcec7ede13db8e5ce6a6e78a2f28c61b7 Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Thu, 19 Sep 2024 16:53:40 -0700 Subject: [PATCH 01/35] progress on app scaffold --- src/app.py | 1 - src/moshi.py | 75 +++++++++++++++++++++++ src/prototype.py | 77 ++++++++++++++++++++++++ tests/moshi_client.py | 46 ++++++++++++++ tests/requirements.txt | 1 + tests/test-audio/user_input_chunk1.opus | Bin 0 -> 72805 bytes 6 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 src/moshi.py create mode 100644 src/prototype.py create mode 100644 tests/moshi_client.py create mode 100644 tests/test-audio/user_input_chunk1.opus diff --git a/src/app.py b/src/app.py index 4d3f408..8f4f1a8 100644 --- a/src/app.py +++ b/src/app.py @@ -16,7 +16,6 @@ static_path = Path(__file__).with_name("frontend").resolve() - @app.function( mounts=[modal.Mount.from_local_dir(static_path, remote_path="/assets")], container_idle_timeout=600, diff --git a/src/moshi.py b/src/moshi.py new file mode 100644 index 0000000..ef3b5bb --- /dev/null +++ b/src/moshi.py @@ -0,0 +1,75 @@ +import modal +import time + +from .common import app + + +image = ( + modal.Image.debian_slim(python_version="3.11") + .pip_install( + "moshi", + "huggingface_hub", + "hf_transfer", + ) + .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"}) +) + +with image.imports(): + from huggingface_hub import hf_hub_download + import torch + from moshi.models import loaders, LMGen + import sentencepiece + +@app.cls( + image=image, + gpu="A10G", + container_idle_timeout=60, + timeout=60, +) +class Moshi: + @modal.build() + def download_model(self): + hf_hub_download(loaders.DEFAULT_REPO, loaders.MOSHI_NAME) + hf_hub_download(loaders.DEFAULT_REPO, loaders.MIMI_NAME) + hf_hub_download(loaders.DEFAULT_REPO, loaders.TEXT_TOKENIZER_NAME) + + @modal.enter() + def enter(self): + device = "cuda" if torch.cuda.is_available() else "cpu" + + mimi_weight = hf_hub_download(loaders.DEFAULT_REPO, loaders.MIMI_NAME) + self.mimi = loaders.get_mimi(mimi_weight, device=device) + self.mimi.set_num_codebooks(8) + self.frame_size = int(self.mimi.sample_rate / self.mimi.frame_rate) + print("Sample rate", self.mimi.sample_rate) + + moshi_weight = hf_hub_download(loaders.DEFAULT_REPO, loaders.MOSHI_NAME) + self.moshi = loaders.get_moshi_lm(moshi_weight, device=device) + self.lm_gen = LMGen(self.moshi) # can add temp here + + self.mimi.streaming_forever(1) + self.lm_gen.streaming_forever(1) + + tokenizer_config = hf_hub_download(loaders.DEFAULT_REPO, loaders.TEXT_TOKENIZER_NAME) + self.text_tokenizer = sentencepiece.SentencePieceProcessor(tokenizer_config) + + # Warmup them GPUs + for chunk in range(4): + chunk = torch.zeros(1, 1, self.frame_size, dtype=torch.float32, device=device) + codes = self.mimi.encode(chunk) + for c in range(codes.shape[-1]): + tokens = self.lm_gen.step(codes[:, :, c: c + 1]) + if tokens is None: + continue + _ = self.mimi.decode(tokens[:, 1:]) + torch.cuda.synchronize() + + @modal.method() + def generate(self, prompt): + return prompt + + +@app.local_entrypoint() +def test_moshi(prompt: str = "What is the capital of France?"): + moshi = Moshi() + print(moshi.generate.remote(prompt)) \ No newline at end of file diff --git a/src/prototype.py b/src/prototype.py new file mode 100644 index 0000000..fe35594 --- /dev/null +++ b/src/prototype.py @@ -0,0 +1,77 @@ +import modal +import asyncio + +app = modal.App() + +image = ( + modal.Image.debian_slim(python_version="3.11") + .pip_install( + "sphn", + "fastapi", + ) +) + +@app.cls( + +) +class Moshi: + @modal.enter() + def enter(self): + import sphn + + tmp_sample_rate = 24000 + self.opus_writer = sphn.OpusStreamWriter(tmp_sample_rate) + self.opus_reader = sphn.OpusStreamReader(tmp_sample_rate) + + @modal.asgi_app() + def app(self): + from fastapi import FastAPI, Response, WebSocket, WebSocketDisconnect + + # ERIK TODO FOR TOMORROW + # this server is untested, use moshi_client.py to stream opus to it. the client is currently broken + + web_app = FastAPI() + + @web_app.websocket("/ws") + async def websocket(ws: WebSocket): + await ws.accept() + + # We use asyncio to run multiple loops concurrently, within the context of this single websocket connection + + # Receive Opus data, as chunks of bytes, and append to the opus_reader intake stream + async def recv_loop(): + while True: + data = await ws.receive_bytes() + + if not isinstance(data, bytes): + print("received non-bytes message") + continue + if len(data) == 0: + print("received empty message") + continue + + self.opus_reader.append_bytes(data) + + + async def inference_loop(): + while True: + await asyncio.sleep(0.001) + pcm = self.opus_reader.read_pcm() + # todo: do inference with pcm + self.opus_writer.append_pcm(pcm) + + + async def send_loop(): + while True: + await asyncio.sleep(0.001) + msg = self.opus_writer.read_bytes() + await ws.send_bytes(msg) + + + # This runs all the loops concurrently + try: + await asyncio.gather(inference_loop(), recv_loop(), send_loop()) + except WebSocketDisconnect: + print("WebSocket disconnected") + + return web_app \ No newline at end of file diff --git a/tests/moshi_client.py b/tests/moshi_client.py new file mode 100644 index 0000000..d19ab0d --- /dev/null +++ b/tests/moshi_client.py @@ -0,0 +1,46 @@ +# websocket test + +import asyncio +import websockets +import json +import sphn +import scipy.io.wavfile +import numpy as np + +def read_wav_to_pcm(path: str) -> np.ndarray: + wav = scipy.io.wavfile.read(path) + pcm = wav[1].astype(np.float32) + return pcm + +async def main(): + sample_rate: float = 24000 + frame_size: int = 1920 + + ## ERIK TODO FOR TOMORROW + # this client is broken. we want to stream opus to the server as bytes + # it should echo them back to the client as bytes + + opus_writer = sphn.OpusStreamWriter(sample_rate) + opus_reader = sphn.OpusStreamReader(sample_rate) + with open("./test-audio/user_input_chunk1.opus", "rb") as f: + opus_reader.append_bytes(f.read()) + + pcm = opus_reader.read_pcm() + opus_writer.append_pcm(pcm) + + async with websockets.connect("wss://erik-dunteman--src-prototype-moshi-app-dev.modal.run/ws") as websocket: + + async def send_loop(): + while True: + await asyncio.sleep(0.001) + msg = opus_writer.read_bytes() + await websocket.send(msg) + + async def recv_loop(): + while True: + data = await websocket.recv() + print("got data back") + + asyncio.gather(send_loop(), recv_loop()) + +asyncio.run(main()) \ No newline at end of file diff --git a/tests/requirements.txt b/tests/requirements.txt index b7c90d3..f7afbbe 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,3 +1,4 @@ -r requirements.txt requests websockets +sphn \ No newline at end of file diff --git a/tests/test-audio/user_input_chunk1.opus b/tests/test-audio/user_input_chunk1.opus new file mode 100644 index 0000000000000000000000000000000000000000..75b486fe7b51bfca446f3d54bc90fef587ea27cd GIT binary patch literal 72805 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%0A_)2}EA0 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�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 O95@HC)36RCGWideM&F14 literal 0 HcmV?d00001 From c44336cc049d589d721457e439b84566ea901e39 Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Fri, 20 Sep 2024 12:27:07 -0700 Subject: [PATCH 02/35] basic opus streaming working, checkpoint before I break it again --- src/prototype.py | 48 ++++++++++++--- tests/moshi_client.py | 77 ++++++++++++++---------- tests/test-audio/user_input_chunk1.opus | Bin 72805 -> 0 bytes 3 files changed, 83 insertions(+), 42 deletions(-) delete mode 100644 tests/test-audio/user_input_chunk1.opus diff --git a/src/prototype.py b/src/prototype.py index fe35594..4bd0253 100644 --- a/src/prototype.py +++ b/src/prototype.py @@ -11,30 +11,32 @@ ) ) -@app.cls( +with image.imports(): + import sphn +@app.cls( + image=image ) class Moshi: @modal.enter() def enter(self): - import sphn + self.tmp_sample_rate = 24000 + self.reset_state() - tmp_sample_rate = 24000 - self.opus_writer = sphn.OpusStreamWriter(tmp_sample_rate) - self.opus_reader = sphn.OpusStreamReader(tmp_sample_rate) + def reset_state(self): + self.opus_writer = sphn.OpusStreamWriter(self.tmp_sample_rate) + self.opus_reader = sphn.OpusStreamReader(self.tmp_sample_rate) @modal.asgi_app() def app(self): from fastapi import FastAPI, Response, WebSocket, WebSocketDisconnect - # ERIK TODO FOR TOMORROW - # this server is untested, use moshi_client.py to stream opus to it. the client is currently broken - web_app = FastAPI() @web_app.websocket("/ws") async def websocket(ws: WebSocket): await ws.accept() + tasks = [] # We use asyncio to run multiple loops concurrently, within the context of this single websocket connection @@ -57,6 +59,11 @@ async def inference_loop(): while True: await asyncio.sleep(0.001) pcm = self.opus_reader.read_pcm() + if pcm is None: + continue + if len(pcm) == 0: + continue + print("Inferencing on pcm chunk of size", len(pcm)) # todo: do inference with pcm self.opus_writer.append_pcm(pcm) @@ -65,13 +72,36 @@ async def send_loop(): while True: await asyncio.sleep(0.001) msg = self.opus_writer.read_bytes() + if msg is None: + continue + if len(msg) == 0: + continue await ws.send_bytes(msg) # This runs all the loops concurrently try: - await asyncio.gather(inference_loop(), recv_loop(), send_loop()) + tasks = [ + asyncio.create_task(recv_loop()), + asyncio.create_task(inference_loop()), + asyncio.create_task(send_loop()) + ] + await asyncio.gather(*tasks) + except WebSocketDisconnect: print("WebSocket disconnected") + self.opus_reader.close() + + # reset the state + self.opus_writer = sphn.OpusStreamWriter(self.tmp_sample_rate) + self.opus_reader = sphn.OpusStreamReader(self.tmp_sample_rate) + + finally: + for task in tasks: + task.cancel() + await asyncio.gather(*tasks, return_exceptions=True) + self.opus_reader.close() + self.reset_state() + return web_app \ No newline at end of file diff --git a/tests/moshi_client.py b/tests/moshi_client.py index d19ab0d..17c1fa0 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -1,46 +1,57 @@ -# websocket test - import asyncio import websockets -import json import sphn -import scipy.io.wavfile import numpy as np -def read_wav_to_pcm(path: str) -> np.ndarray: - wav = scipy.io.wavfile.read(path) - pcm = wav[1].astype(np.float32) - return pcm - async def main(): sample_rate: float = 24000 frame_size: int = 1920 - ## ERIK TODO FOR TOMORROW - # this client is broken. we want to stream opus to the server as bytes - # it should echo them back to the client as bytes - + # Initialize OpusStreamWriter opus_writer = sphn.OpusStreamWriter(sample_rate) - opus_reader = sphn.OpusStreamReader(sample_rate) - with open("./test-audio/user_input_chunk1.opus", "rb") as f: - opus_reader.append_bytes(f.read()) - - pcm = opus_reader.read_pcm() - opus_writer.append_pcm(pcm) - - async with websockets.connect("wss://erik-dunteman--src-prototype-moshi-app-dev.modal.run/ws") as websocket: - - async def send_loop(): - while True: - await asyncio.sleep(0.001) - msg = opus_writer.read_bytes() - await websocket.send(msg) - async def recv_loop(): - while True: - data = await websocket.recv() - print("got data back") + # Read audio file using sphn.read + audio_path = "./test-audio/user_input_chunk1.wav" # Replace with your audio file path + pcm_data, file_sample_rate = sphn.read(audio_path) + + # Resample if necessary + if file_sample_rate != sample_rate: + pcm_data = sphn.resample(pcm_data, src_sample_rate=file_sample_rate, dst_sample_rate=sample_rate) + + # Ensure the PCM data is in the correct shape (mono) + if len(pcm_data.shape) > 1: + pcm_data = pcm_data[:, 0] # Take the first channel if stereo + + # Convert to float32 if not already + pcm_data = pcm_data.astype(np.float32) + + # Append PCM data to OpusStreamWriter in chunks + for i in range(0, len(pcm_data), frame_size): + chunk = pcm_data[i:i+frame_size] + if len(chunk) < frame_size: + chunk = np.pad(chunk, (0, frame_size - len(chunk)), 'constant') + opus_writer.append_pcm(chunk) + + try: + async with websockets.connect("wss://erik-dunteman--src-prototype-moshi-app-dev.modal.run/ws") as ws: + async def send_loop(): + while True: + await asyncio.sleep(0.001) + msg = opus_writer.read_bytes() + if len(msg) > 0: + print("sending", len(msg)) + await ws.send(msg) + + async def recv_loop(): + i = 0 + while True: + data = await ws.recv() + print(i, "got data back", len(data)) + i += 1 + + await asyncio.gather(send_loop(), recv_loop()) + except websockets.exceptions.ConnectionClosedError: + print("WebSocket connection closed") + exit(0) - asyncio.gather(send_loop(), recv_loop()) - asyncio.run(main()) \ No newline at end of file diff --git a/tests/test-audio/user_input_chunk1.opus b/tests/test-audio/user_input_chunk1.opus deleted file mode 100644 index 75b486fe7b51bfca446f3d54bc90fef587ea27cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72805 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%0A_)2}EA0 z_32Db>~P3&q7F+%^Ru25^SX{}qW6zXNtRkz!N&M&d;a9*Np&!7DeM$d4oIsLs z2IPpfc$(5|j*MFsHKm+Gb@qa)?V(yLAc9C1PXax*72ys}QmKXX2x>NVAVg?k z(rsBK?l-_%U-lsU>cz7!$kl&FJhG;Ec+?voV%$la4wRvD=RLUCzdFi=AiiD4;Pl1u z{{rPDvqn3mkBGh&IREFoikJ*8HURZP%a9S|t92IPEG97s#7sGQ!rkc-`J|i!)Z3+9lkd(;d;P_dt>ezZNrI4soAZxzKgpG-{L6<2 z{KT|cloGk-cjJCV6_r75$O?!XOSQENBIiwkhrag1@3%2w#kGS*XcLdHl5sx3@)iIe zGn`_?r7(8ZMncvSW0?9#0e&mY!Wy!_w}vC$MafuOtWRL#?dgTDG&#(W4Xu&MnNC{XFMDbz47@v?7EzHV_oI-kuYSaV z&4{VBQl*A6R@7vtbcNDQ6d+^q*YwFQ5`gv;X$VOYM??rZ@cTe}v9L9#0gP zzsQS9IHV|4%eCfR+&6u{a)As-x`ZA6GY>4cJN|0c-{mkn8btcfNbl5{3Wm_I{Ypw9 zzfR@IVZWsMHx6O_&3&lE!{9aCPQ&Wv7(xPf7zY_L*q6nMC&{+VIzAqFi+VFB9=KN$&d7m0dPbJxj~wZQdhfr83Br&<8Nl4Xg6o ztR@_nYS@W;qRXtOP1-jJIwn426`xPsP}yjn+V0Yyv+2*^%w6P6}cZ$sa;J$5xXBu zbRFsD2oRSY!s`^!HgK6XI?y#!@F*tNu@}p(t<1?T#1uAY&T=%q@^-ls(KcgbWpn6! zjIe9&UG_ff+j0GMr53mo%6}i7;Un{ITv`E_!U>iz6-VxO?AG5dT{Nzg-y;a69GBy2 z^;!tzs{C*)ivb%BQf8^|<`!74hpgrw5RGIh3s=!76`!3@_dhFW^RA#}JhT0-d7LPn zi<9K)9#4Xa+H4%yZCCpJ?gBBZb7N%=u;gGU{K1}>f7>W>C*{3!C;1#0mMBMr3&M7z zOehw8E}5re(s$eN02)Ky?dBE(09K@SYXua4%S|L_Za)v1s@2mFxlnw2Z0g5^_0qFm zb%p<#xRoyN5L<V!f6SuYS6nS%J@PLJCgQr23eLU+^$V7y8c1EMr^r2pj3 zE)XUxn_{%`t>dJ!n11{J?Mg}lYP>U#>ilzav3mHC1Bing`q!3#5HB$rw9H@oMOvH0 zdmYwpB#svp9DP&CsGJ4*8$qzFw3lt^z>@OT;g)vzw>N8~I!~a!FU|{dd{cBoAa#P7 zf^<{>$3!up4*#DgWi)`D@&VnPs67}SF)!0;WWqliEe+{8KWwpjI52HOK_;*abuVo& zvL_rIuOB4JN|u3xDr$uP1Zu;63JbvP+RK3+4FTm=df|Ux`I5wP$Ybv#l!{D5?dz~~k8qa_Ziz5nK&_IW>6y?%?^}@X3T8Cp*KtnH3NBu3N0^4b6 zPzSY+{Cut(!E$^8kerxL**VCyZR0wh^WapG3loGy9%I{Bih?N+8UfjMGY-%x61+`G zu{gtSZF$ijNII(YdF3O``NBWCITac#H!v-wSRqWiGhOPX^LhPLSUtVC90&?@2i>?Y ziN5HY;1n+XhySUUDl~18KdDcZh+@k27F8v=M4G&0eQj;JW_yYv(^(%yB10XkJqy0F z0CV#n9=<&69U7ek%A<3b_`tX9hcx z{OBnSj^Z?i46a+3``cb6l~ACu$c#_2biRRfhK?iA-fZR%la|mtHnXIH(QDY&K@jAv z5bke}_hX)y>e73JK_+muRQwB~MB8$-)ocIjqt(OeQ$8fWWVVsE$+bx&0YTlU1^jRT zgBxw7G3D@Jp*#m`>k%J3-V8*o#8_nYqJ}ffLceobI1X0v$9>N9a6Gw7m^y=lPLmO) zqOUB3m6|ie3B(+s)fGB+Y6&htG0#-lgfK(hb-ZdOGIW)ypeHhI4x7xM{3((SJ+(D& zBY#t#%6WFPR||-4L@}LhwTu72lbvF}mxOQePPxg8Ogs#62jIaCIcCdIL#BTGcLdGN zDJ)W>I4QC(KXK4w$C?Iw(gDZV;AOk(?tg1t?_+XBQ$giMBUAS~lRXxg@CdV*AX(3i zjrT**@xn_khY^^~xg@+HlJ4;ph2iTNJ&8_$Fob~`1eJ#UqXmxF6qe&J$HvBhBs=Hl zbNBDgBPcDC?QtP5oM?>doB?z9+aQn~RBMS&No`A002AhGz?%H*rY00>fTU80?j$K( zn~tv#JxA&Sp11B>Ji%|!M2|f#)0b@bt z-=K0<*JUQDDo0K4IT(@|K||TSMwDG(IgW&jfOw?!?y3-?z!|fp65{R1RA{>d_{ZGP z)~BNJTgEI_N*V``_$Tk!y~o8{oQhXiu+425Lo8(nl+@kh%Vh@ zk|OSwfbt*t|FNPST>gj+Kk)X8bSQ@0Cj4n9H+$8 z(L~`Q@(sYYl?P-9890xwPw)tUkh#3Pd^i%2?G;{y6Xrt&cSU=v(RQnVG!X_v?ZaUU z|96io3HpbR^WhWzl1wJHD%Wy!3)Bj{X?`Z4w_Z?tD14UfwAHdfnKHzp3=}0`#_+(1L%E!sr~6uDa2#`E&QsmY+W0$&!p_;a8J|Re za62wq^6#9b+)L~e^g6tGiRWzQr7?wEh#aSUTVO;nCS0e;<&kj~N!MtDta-R^yfd_x zNpXU@H8>}(JHg1KLKO>>V&bdxJ#8aOazA}+mOQ02ckWnJeBW}p2cdWP-xEDjL$&hz z`4T)kyJiaDI2;j}$mZaB8NPjDErbJJhHmL`lcI_OCn?2d12%p(b2Vw)LO=<-(PULE zU$}Fsh?9{MEvvTig~1vle(s{@I+M@jg2(9sTBD%S>Wz2H4>oXekcZ#U1Iv+a2^$NU z2Lb@&wVEHf*47FP>)PA2k7!B!a9f@VtJdjQj4@%ODw;EX~Z76N4?p!rHQ z?Mb9|*9!76T=%k?=vzjbflIXb?c$GH$L z>z%nEBgqD%(gDnQ4GTEjyGfxRu@f9KkVUSWfsSk#E-{vU9_}pnxB^osr&iJw%0Fr* zG$PFZ^|DWUpTy?J=yE)LKhJsmGnGPKp8=F@S$CNy2#ZvKYA)hf%xK2M72;aJFWBpQ zjch&)J2?vNCrYyO(`ldHl`G~U%8hUxQ>pNSQL${ik5qqgt?FxvWro8I=CtJLy1)=Q zKj&1N%_k(JN5&u>%&#h#%cqWeg`1G3f{jJqla87qE2(a5fP13xx1X@#AJo9eO!6k&lS4;BujZ@|5({ z;{4$${N6mBae$9SZUO;!rl2=9PVob>$rK0^u;MEs6XKj1PCh%V6XQJZ=L#Vt>RY%c*`esw-Vr-N{8vo8_E^%r z@Cw#Sg^2=fTzm_ zPD!1=yWrx|kc+=*dgk4FzEBRRXePg1Ypi^Zj>Sow_%&N0&UkEI1~q*AR$O!0tY9frhRgR^aw`xTUEduM*I{OnoRx+$J(^L z8Ly1RvX*~6i#>^vx|K(81gpIPRd5ztq;BSYAPVHYH||o}w*n>rcc)nl_W~&*ryDM>P3g^|QMiY>9~b5wetxF6n0-$h1v@Pyn^vv>6xQ z6oF5N$;38vsc!8E+Gx{Sk0>NBptl5L_z{J)W6w^c2Ryj>5tZ zL2Tw2AKt{Y9dk3RvlYzHCS(UcD?))5W9t@M7JUg`oq&occkvSbFi58Ly z&4~_hRRvp!wzFeg_PtGuLL(E~ElUb};Ka7&;gb?tirAQ=Ce9$?nsiT8w?-O?=Up1d zfrjoANSY3dj_wQ}@Uj+@R2{Yt4&q)j+8XX&PUUD`16$U)RZ%;46+P-5N4^{}_7e4B zmrec8=Bll#wZyc#tg)^0?$7T3IOhKh!v9UR zzuDsM?d$E^|GNKZ>;EwS0{=w+b^kWX?ELfuHn0;;uw@d;K7oF1a)IM0I>@-=!nE9e zA(hw>O3Af#IPCUI#26mDK=o?>G0h!ZAr!9v+^0Gf^g&iFWNpNup`hT}xg4IC(;MgC z{e60UT>FZc$Np$2&Y{6)b{&5)go9gR=m*~k>r!AvKk6(KLU6Q;AiW0V;w#AFx~SxE z7HWDL$kO+{5mjp}rW2cQMItAIFwjSP<_|cA(?Qwd-ror}Zq?--q9dzybr_3NxlGdk zF?<9VHPY@M=ZG4;qQEy%@ch zjTM0x8>j%R;wcg`$gLF2wq60NnOuWlAkHgH%mZM=Qsn7Wo?&3x&I0Z6QN72fY#W)^ zH$#GLcvGHwxONth;|T;>od9Xtz3S*;Zmr^E|>}JC=`02rfP@5l3l{RWDsoh z+2{5HF9xNS)M8DurfntV)Cu33JQowNUoWrv+fFUq2_TlE7%ot#Y(-_tn0~r-o(z+9 zg1Mqh4Wwj0i#_jrZn>bp;&`hUp47~^^i6P2;Rksgu5bKRQuVw`Pq)G@JtWDqhGoj= zAvLLUJ^)Fy+$Pkm4=3+BDzi3A{1y%=!LnfioWJqSf;jrXw8;-b8=f@f9aS6z|Ms3= z9$-gth$x8-_Jg)hVR7BQ-?XMM!IS;x{sNWO=IUWx!>h#GR`M(1%a|xd7Agx*Y4iTN zX=Qf+?BTB*ym)ZH@glEdmCgqPuMgI;M5}7orifeoZ6)hTsm}fRB5F;#0;1IlKDX{# z{S4gH+VfV)Xq|N=a0Yh+C+BNV>rL^U+XJ z1d2_f8EL|wk=(K$H47r11f}zj{xQ7HdL<3?X|y$9OAXbZlzD3&&(;U@NyLs5n+{ZN zo+F2pP{~KG9~w8=`52aCGTzT`GtV5!geuy`cQyJyzZ0U>lDOKz6=(Vh&_SFW#g7B+ zU_c*-4x7jsp!Tv>0H%Pz+y6NhtZ$NT=Sz8S%b=KGAB%<-I|@w3TRaaKqgqyw6Jd#46u8iKkC&am(smci8t;kXu zoItfw;ZcNUcI0bN>#5Zluf|&5*Wg0cBN<&P9zmYkeWYZXkA5Vv*hR`Qc~djH91zNo zD+qDlN!N+yZ*0Ysc+gU_08uNsk!SmXU9M;I+Y0l1Ul|kC94Yt@Mw77fZ2AzpVrUfS z*%_yJ0?y+c38di46p%DZOg56FgZz5)i6jrlzideGzz-xkAxm=dF^(6t;g^17%$sO_ zxfFQwBV5kc;)2UeGy&HQ0;0cOEC?VUH0}Q}TzSZ{X9U8X^Ntdv3y&Ymz-3lN!o`^`e1VNrwr8izDdo7l3a%R7sEToW^8?IqmmJlR2RJS9}(gj=VVm8?*60juad z;O*Z_%LcjhK~krWfznDtCR}Wpk0CV0ktqLCkusOYj1)e<(2UaUB+@{rP~mZ!VMBTL z7f0DdBQdzwJ6o`v1ml)i&5}U;cL9M;gddGuEN^c^P41n&9830YN5q{v|Cf07z447k zcgIM`uLp*7rCOyAYoP}$g4|pVge+)Nma-O{axn1aE$f1V`z3%}u=_Qku)mNwf)+UR zZ|#j*R+OWiYlUZl+Dj))ck75m8^q1_%y8cerdcW1qi8VgKo5#~-6^`K%@& zIYpciv3hWCY4Cm`w6G&Apvb_pwo3iVdEZiyUkE%%xUc9;kqr{UAscC!VEehUMySS0 z3262ng150Rl!9au7jIcG7+T+b_?UjTUISWjRx=Sx@LS(%U&-z2r@lY@-mg2e{Hbl( zuIHc{Pp`q8pX%>J&Bn)0hEdZfLDpW66r}5M}kYz?B^_MDEl9-8eQzhDKvXO;p~w0SVvN|KQebP9{4 zE%9L0Iq*cuzSEM#F#pkZF^!oO1DYc{7oXjG8b-l;4pPEM@&f;Rr%X zyjB22RC~rzeC4$aC%(@aH~a-f!Pn9Z$QBPN=M(6x9V?>AYi7eC_h%cwt)#Y3_SvwC z*?+a%fVtAYrVsq|1=Ty*aIxTjZh~;*XbjEvJ9|^-AQS7Z1uG*dqHE5_HYdaeQgnH> z3T`RE%r{{9&O#SJrXQBA&0&BMB%<$`LZj{?!LO`}0opYAt$xMy4M_9lYSyn$p`{=d zl!2oc%?_|2w1MdnZl@_utJaWRqw8-i_gSC(pUH%epeauA&DRd7FV}kHH98HuxKN*{ zJ`s9&Ly6FV@#w1wBw=vj@Q)?UmQK2FkbM8qj>c16K*aQePg& z{wK!6BE+v0s25JGS4lY=;0zy^rFVLGMgzb#_B%;PO+8l!SoA!9BO@mOtV)=|)lYH> zWBKk%Bzo=RJZzcauQ1OeFZ9fBJiRkR__b&&*+vWXppqUmxMVuKl|FH=GduZ8w3g#F zAXPcvZ6qp?^hx{|QB&L+6F}8*bfs~1zlr9JIE598!5!_THg(#ecqCz!{eGokZmhdI zB>f6=5`iirU*so!{cLBT65aU77*|f#)<*(Z6|PHpPQ)E}f8WzWW_jffOU|5~5We&) z?=tK})otoOhkTTZ)eoXuntKDxP(+);JxyOZ#BPpXk+WDgnX8<9Ng(x3?BfR3qt5Bi zFfw|t&F}Uq6bS+wI8{xhxw5k8UjP8<$UyH|6olgz=4o7^TPW+H$Q^k9s(2jrgk3_LDo z{iauM$COgOIt?}WqGhNu-O)wLLhYSDViZQjFvTFSMBnAA1bK*SlO=~@*4x>lZK|T? zq_wL2cM?gz^-G$iC(QwRvm}Me88Po%E%~F*OTE8KQD=R<=>^vq(rj>(UE zfash1-%{8xDoVK!d0hjDjFfn6BY?|@L}chwlLs<}9;U$2Fora1^#kA)ha?Y3TF_pi zVsb#Gkc_yXp{ZSp4@MoIQkLiLdYPl5FY0%^1E)j`#|3`8Q~V_(V=605v8Tgz0L|z3 zIH3HsTi|NK7&0ydl*ihbWjtl3jc5(x%>??0YTY`tUJy?;KaV-RPwj{giW`F@z4;FS=&UVL&!cuXu(mKXkzo^qxQ}pE>BJEu@J`}*K&Bu?f+B=>uQ1eS z-Xb=lFMh>1A1>TkuH7_=pVXophw8z6LmcJ43G`M2^$LeeZ(*@r&twTx@QK@S0)eD% zm~~ z=p+;H{1iWgff;%7E9Mdt9J^<=(OcWoytl{(PXB_X02Tx{A7Kq+r1(3*P*8t_`*bM=aVu>IZwh?I!kPvmDA+3(;jFm-!N zw1p6Xz6GIH0!w7K)B=~t9|inUp1s!Vg?GPHp~pc-;_I~Pj-^}{ORko8LvDsm(~6IC z6vup?o{;cT2ct-)5a@YMwxgSvx=pbM95(l0N|k%`k!4;HlIlS@SKIXF zY#Gih+({Q=M?hTbpGf}GP^`_^c+6+8d9GY&47k2n77ZY>|-tM z4thqcqrBN%q>9=nWs(Rs`!GCzhog;-?nJsE^LO}ALDFFr-8d(ojwA~c-n)tEu$N4r zEX$-Yu~%##>9#VRK@0*G8t4qjZtetS*{diR(u!j1$;8ay-?lx_aon=?J6WXX_d-~Y zz}t8*?;88#Dg(u%1?iXlmP|=f(tk_vR>FZtZnP=~1Dd!D}WS zD8pdlb6~dLL|!l|njp0m z^8CX1$It2-tuHn>ad7$~i~@J2yRTQbn~ZlqVMA}BGj0W;YWb7ilDncd_#FU7tq|g% zqegrXuTu<3ZZK3=Eja*JVpJ5MZGj|=MDr->i&T-qNixXqRdwH;2Fj>Kk+hrJ@Sy)% z0`*G#QkOP#3flnrCz^}s)56)&z{ye3=n(&SUlN(#M!%*tITRL3zQ4FL%C1~h&a!*T zKU1%*wrvB#=qO2-<6`SC{-jdjgf%<^woWA6>T+vK3RuL=&i5tY%uHcG6MeP@_u{ab z*Qr3~E`4Wbs51MpcWS?}ca!{U%tM_E(H6+T&I?o4ogxxJ-=Z^;g00XkcvN-qpJwhM zpqwN2I-&6UNDM>`8`+1{XKOtnoksv{1d;&oC)dDaBK$GDzoD@pQp1LZSLCcedobwb zX5$_UT!1&c+t2-~J~$?CZSB$vIkH1F*kg-Y<3Q8>v*dp|_uDn z`w7woLVZ~{SV#_AIHO3vNQiOv_-#)tIxC=!o<7ot?m0u=gSpu7NmRdswFNts@=t^( z7aJvs=k${|n;BjrUD+J-+044`%0l-|JWb^g(5p0N@R2e3-3Rdwjz@CWeOe465I6Zm z>396$JPQtQ-FcLV#&Dr_5q9I>b-=GP4sqg&TMx83PEm02h2* z`zcOf&vrOWX0TM08zY4fl)w-@n5)(ls2L`I(Pi0Z;)&L^zjg&b;+@hG{`}@AXzmz> zDb6;W8J{PiB~(T3e=z?Y=X&w7j!gJk@~^uc`)SM83@4&+c5~O4iW@sSZ21FJ*Sf=I zh6J#RY6)B!GE6h0bY3t;X{su|C+BJw45LPhp>U#k_y_BWw{4`6vVAYt+BB+P{1dNX z9kU5=-pf=pg|i8pQxsWY>EW4cHqzO}y{wI=UMJ!;%X)XTI*2}_FlFa*Oh~OvyDVv$ zp=N26NTzAtNP$5&{)CPwsfq(f>kCzPzAYW8Q~F%2U%c-oZpH~t3#mQghweuFMi)c< z)UmaYIj@i-d2w}#pnMl-^Qi3vJn!Dd3l?%7{W2ZjAFe*N_1%m2F z?)oj^pMf(&=$KnSL77tYk_$GKqtqcH z@!hlhOYxQ5n80S=g9PO1q2aAZO@>PQQonlUY{cvt6e}~iW5{uI0NCZhBV9`~SFC)# zUl4N>cso|0NI@TkpF++KPq&NyoYU}gKw%TwHR=;MQJM?U5`Y@4iu`8wX1RF?BXuC7 zMgo1%sQboNM;fb)d|T79JNCc2yI2|+pLV^BC!G;;bQZs{z;9$&bHCGptMqy#61}fn zC@5B2eBVmzNYQdP+ifr8OKChjDz?_EW&C>vt~7G)uSnF+nINo!_aor6j>THZ0HZ)$ zzk!OI;ahxwo%sBrK$6C@6OOEq9bh%}|J(DV)yk2A4l)%dU#bHo}*EYZ@KeUtZ3!5*5(Zop; zvG;4Q3*xDH68Ulz4}M3H?#J6^-@>f&>E-XYu>j;CU(-ABYD%TUtI<`U-XA)ADT#F? zUKK=Q@!ufXZY~pBzO=r5tb+ub%wYLKu^L--n&AKO{Vm*KyQuLKRY-{XO|`(2%#RE#x-k&dQ`FGU8C7 zG48opwedkgRN5(XV51}d(vs3rrov01@8JAJQv5-Q-^?gv8d=!tgOwd(?qpxc&J!l9 z6`mz?#FFBy?M)!+;ZoxyU#L%&V)Ma@n(vD|oE=x+RjY6$oRT8=f#Au)LG|X-egVQ6>fmE|Ju*v7Ql17s?-@GVm7;`( z%e0rleOurD%a))Iis4F*(Kw2;bp>k0HO!DtGi`W5(awY%-V~MhP?|(DV=y4o&D)eo z!AIeY2w(>psz8t>X}o*K=^nDzE4syBgd!Br39$dSUs+WRdab}Mw*UQ>oBv<`wQmai za7aGg{@4`V8+%j{VzBZ=ksFf1{>U5(Ds+6Er`YAfBe|qku65zF1O3pVB74GDStlx zY#6!-)clJ}nt!%A0P##sfVFOB+Pzbi2w2B5`>(;R5fYbXoizFx9n2g#`ws8+-L}9` z`y`tG{;m8$?C(j(y!K~|F&yI!S5O^ypjXI9g7z?-7zi6 z`DBa(5(@UUiaiwQF9=tw%Hxu|!m7_vA3Pl#>cqNwyzdk&WmzD8V-@bHHmne#4G_5x zqU04w0xcGW0+8{8v~_6@z+qO^3>?EHpw>}+BE+h%tO7vvJO%*%y^8!){GQ=Ihy(FU zQZ&@ous21WIy|+2*zHEb1K=SV<&`45wZjBe8!U37Bhh}R>unheFVFL~guO&Q{`sR! zq?IqEYDv|~W%=OY@s`n~ZW|KuMp>u}qTaa232L-9~ z@G1UfQG0c*F#k(13Sy977Cb=Z8&X2aL~gR($SSOwlq$_j51Z5GEI&*&549uHu)Y+w zIzI$4B-�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 O95@HC)36RCGWideM&F14 From 7f1737f8bc453c96c089d094748c7f6b5dd17e06 Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Fri, 20 Sep 2024 17:26:54 -0700 Subject: [PATCH 03/35] working streaming response --- src/moshi.py | 154 ++++++++++++++++++++++++++++++++++++++---- src/prototype.py | 44 ++++++------ tests/moshi_client.py | 68 +++++++++++++------ 3 files changed, 214 insertions(+), 52 deletions(-) diff --git a/src/moshi.py b/src/moshi.py index ef3b5bb..6c53307 100644 --- a/src/moshi.py +++ b/src/moshi.py @@ -1,4 +1,5 @@ import modal +import asyncio import time from .common import app @@ -10,6 +11,7 @@ "moshi", "huggingface_hub", "hf_transfer", + "sphn", ) .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"}) ) @@ -19,12 +21,15 @@ import torch from moshi.models import loaders, LMGen import sentencepiece + import sphn + import numpy as np @app.cls( image=image, gpu="A10G", container_idle_timeout=60, - timeout=60, + timeout=600, + allow_concurrent_inputs=1, # websocket connection must be unique to avoid GPU conflicts ) class Moshi: @modal.build() @@ -35,16 +40,15 @@ def download_model(self): @modal.enter() def enter(self): - device = "cuda" if torch.cuda.is_available() else "cpu" + self.device = "cuda" if torch.cuda.is_available() else "cpu" mimi_weight = hf_hub_download(loaders.DEFAULT_REPO, loaders.MIMI_NAME) - self.mimi = loaders.get_mimi(mimi_weight, device=device) + self.mimi = loaders.get_mimi(mimi_weight, device=self.device) self.mimi.set_num_codebooks(8) self.frame_size = int(self.mimi.sample_rate / self.mimi.frame_rate) - print("Sample rate", self.mimi.sample_rate) moshi_weight = hf_hub_download(loaders.DEFAULT_REPO, loaders.MOSHI_NAME) - self.moshi = loaders.get_moshi_lm(moshi_weight, device=device) + self.moshi = loaders.get_moshi_lm(moshi_weight, device=self.device) self.lm_gen = LMGen(self.moshi) # can add temp here self.mimi.streaming_forever(1) @@ -55,7 +59,7 @@ def enter(self): # Warmup them GPUs for chunk in range(4): - chunk = torch.zeros(1, 1, self.frame_size, dtype=torch.float32, device=device) + chunk = torch.zeros(1, 1, self.frame_size, dtype=torch.float32, device=self.device) codes = self.mimi.encode(chunk) for c in range(codes.shape[-1]): tokens = self.lm_gen.step(codes[:, :, c: c + 1]) @@ -64,12 +68,134 @@ def enter(self): _ = self.mimi.decode(tokens[:, 1:]) torch.cuda.synchronize() - @modal.method() - def generate(self, prompt): - return prompt - + self.reset_state() -@app.local_entrypoint() -def test_moshi(prompt: str = "What is the capital of France?"): - moshi = Moshi() - print(moshi.generate.remote(prompt)) \ No newline at end of file + def reset_state(self): + # we use Opus format for audio across the websocket, as it can be safely streamed and decoded in real-time + self.opus_stream_outbound = sphn.OpusStreamWriter(self.mimi.sample_rate) + self.opus_stream_inbound = sphn.OpusStreamReader(self.mimi.sample_rate) + + @modal.asgi_app() + def app(self): + from fastapi import FastAPI, Response, WebSocket, WebSocketDisconnect + + web_app = FastAPI() + + @web_app.websocket("/ws") + async def websocket(ws: WebSocket): + with torch.no_grad(): + await ws.accept() + tasks = [] + + # We use asyncio to run multiple loops concurrently, within the context of this single websocket connection + async def recv_loop(): + ''' + Receives Opus stream across websocket, appends into opus_stream_inboun + ''' + while True: + data = await ws.receive_bytes() + + if not isinstance(data, bytes): + print("received non-bytes message") + continue + if len(data) == 0: + print("received empty message") + continue + + # print(f"received {len(data)} bytes") + self.opus_stream_inbound.append_bytes(data) + + async def inference_loop(): + ''' + Runs streaming inference on inbound data, and if any response audio is created, appends it to the outbound stream + ''' + all_pcm_data = None + while True: + await asyncio.sleep(0.001) + pcm = self.opus_stream_inbound.read_pcm() + if pcm is None: + continue + if len(pcm) == 0: + continue + + if pcm.shape[-1] == 0: + continue + if all_pcm_data is None: + all_pcm_data = pcm + else: + all_pcm_data = np.concatenate((all_pcm_data, pcm)) + + # infer on each frame + while all_pcm_data.shape[-1] >= self.frame_size: + t0 = time.time() + + chunk = all_pcm_data[: self.frame_size] + all_pcm_data = all_pcm_data[self.frame_size:] + + chunk = torch.from_numpy(chunk) + chunk = chunk.to(device=self.device)[None, None] + + # inference on audio chunk + codes = self.mimi.encode(chunk) + + # language model inference against encoded audio + for c in range(codes.shape[-1]): + tokens = self.lm_gen.step(codes[:, :, c: c + 1]) + + if tokens is None: + # model is silent + continue + + assert tokens.shape[1] == self.lm_gen.lm_model.dep_q + 1 + main_pcm = self.mimi.decode(tokens[:, 1:]) + main_pcm = main_pcm.cpu() + self.opus_stream_outbound.append_pcm(main_pcm[0, 0].numpy()) + + text_token = tokens[0, 0, 0].item() + # print("text token", text_token) + if text_token not in (0, 3): + _text = self.text_tokenizer.id_to_piece(text_token) # type: ignore + _text = _text.replace("▁", " ") + print(f"text token '{_text}'") + # msg = b"\x02" + bytes(_text, encoding="utf8") # uses "\x02" as a tag to indicate text + # log("info", f"text token '{_text}'") + # await ws.send_bytes(msg) + + # print(f"frame inference took {time.time() - t0:.2}s") + + async def send_loop(): + ''' + Reads outbound data, and sends it across websocket + ''' + while True: + await asyncio.sleep(0.001) + msg = self.opus_stream_outbound.read_bytes() + if msg is None: + continue + if len(msg) == 0: + continue + + await ws.send_bytes(msg) + # print(f"sent {len(msg)} bytes") + + # This runs all the loops concurrently + try: + tasks = [ + asyncio.create_task(recv_loop()), + asyncio.create_task(inference_loop()), + asyncio.create_task(send_loop()) + ] + await asyncio.gather(*tasks) + + except WebSocketDisconnect: + print("WebSocket disconnected") + except Exception as e: + print("Exception:", e) + finally: + for task in tasks: + task.cancel() + await asyncio.gather(*tasks, return_exceptions=True) + self.opus_stream_inbound.close() + self.reset_state() + + return web_app \ No newline at end of file diff --git a/src/prototype.py b/src/prototype.py index 4bd0253..9403af2 100644 --- a/src/prototype.py +++ b/src/prototype.py @@ -24,8 +24,9 @@ def enter(self): self.reset_state() def reset_state(self): - self.opus_writer = sphn.OpusStreamWriter(self.tmp_sample_rate) - self.opus_reader = sphn.OpusStreamReader(self.tmp_sample_rate) + # we use Opus format for audio across the websocket, as it can be safely streamed and decoded in real-time + self.opus_stream_outbound = sphn.OpusStreamWriter(self.tmp_sample_rate) + self.opus_stream_inbound = sphn.OpusStreamReader(self.tmp_sample_rate) @modal.asgi_app() def app(self): @@ -39,9 +40,10 @@ async def websocket(ws: WebSocket): tasks = [] # We use asyncio to run multiple loops concurrently, within the context of this single websocket connection - - # Receive Opus data, as chunks of bytes, and append to the opus_reader intake stream async def recv_loop(): + ''' + Receives Opus stream across websocket, appends into opus_stream_inboun + ''' while True: data = await ws.receive_bytes() @@ -52,32 +54,41 @@ async def recv_loop(): print("received empty message") continue - self.opus_reader.append_bytes(data) - + print(f"received {len(data)} bytes") + self.opus_stream_inbound.append_bytes(data) async def inference_loop(): + ''' + Runs streaming inference on inbound data, and if any response audio is created, appends it to the outbound stream + ''' while True: await asyncio.sleep(0.001) - pcm = self.opus_reader.read_pcm() + pcm = self.opus_stream_inbound.read_pcm() if pcm is None: continue if len(pcm) == 0: continue print("Inferencing on pcm chunk of size", len(pcm)) - # todo: do inference with pcm - self.opus_writer.append_pcm(pcm) + # todo: + # this is where we would run inference + # but for now, just echo audio back + self.opus_stream_outbound.append_pcm(pcm) async def send_loop(): + ''' + Reads outbound data, and sends it across websocket + ''' while True: await asyncio.sleep(0.001) - msg = self.opus_writer.read_bytes() + msg = self.opus_stream_outbound.read_bytes() if msg is None: continue if len(msg) == 0: continue + await ws.send_bytes(msg) - + print(f"sent {len(msg)} bytes") # This runs all the loops concurrently try: @@ -90,18 +101,13 @@ async def send_loop(): except WebSocketDisconnect: print("WebSocket disconnected") - self.opus_reader.close() - - # reset the state - self.opus_writer = sphn.OpusStreamWriter(self.tmp_sample_rate) - self.opus_reader = sphn.OpusStreamReader(self.tmp_sample_rate) - + except Exception as e: + print("Exception:", e) finally: for task in tasks: task.cancel() await asyncio.gather(*tasks, return_exceptions=True) - self.opus_reader.close() + self.opus_stream_inbound.close() self.reset_state() - return web_app \ No newline at end of file diff --git a/tests/moshi_client.py b/tests/moshi_client.py index 17c1fa0..8c66e39 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -1,18 +1,13 @@ import asyncio +from curses import nonl +from io import BytesIO +import time import websockets import sphn import numpy as np -async def main(): - sample_rate: float = 24000 - frame_size: int = 1920 - - # Initialize OpusStreamWriter - opus_writer = sphn.OpusStreamWriter(sample_rate) - - # Read audio file using sphn.read - audio_path = "./test-audio/user_input_chunk1.wav" # Replace with your audio file path - pcm_data, file_sample_rate = sphn.read(audio_path) +def wav_to_pcm(wav_path: str, sample_rate: int = 24000, frame_size: int = 1920): + pcm_data, file_sample_rate = sphn.read(wav_path) # Resample if necessary if file_sample_rate != sample_rate: @@ -20,11 +15,22 @@ async def main(): # Ensure the PCM data is in the correct shape (mono) if len(pcm_data.shape) > 1: - pcm_data = pcm_data[:, 0] # Take the first channel if stereo + pcm_data = np.mean(pcm_data, axis=0) # Convert stereo to mono by averaging channels # Convert to float32 if not already pcm_data = pcm_data.astype(np.float32) + return pcm_data + +async def main(): + sample_rate: float = 24000 + frame_size: int = 1920 + + # Initialize OpusStreamWriter + opus_writer = sphn.OpusStreamWriter(sample_rate) + + pcm_data = wav_to_pcm("./test-audio/user_input_chunk1.wav") + # Append PCM data to OpusStreamWriter in chunks for i in range(0, len(pcm_data), frame_size): chunk = pcm_data[i:i+frame_size] @@ -32,26 +38,50 @@ async def main(): chunk = np.pad(chunk, (0, frame_size - len(chunk)), 'constant') opus_writer.append_pcm(chunk) + all_opus_data = [] + try: - async with websockets.connect("wss://erik-dunteman--src-prototype-moshi-app-dev.modal.run/ws") as ws: + async with websockets.connect( + "wss://erik-dunteman--quillman-moshi-app-dev.modal.run/ws", + open_timeout=600, + ) as ws: async def send_loop(): while True: await asyncio.sleep(0.001) msg = opus_writer.read_bytes() if len(msg) > 0: - print("sending", len(msg)) await ws.send(msg) + print(f"sent {len(msg)} bytes") async def recv_loop(): - i = 0 while True: + # note that opus_writer, on both client and server, send 47 + 53 bytes worth of header immediately + # so the first two recvs we receive are headers and not actual audio data. Useful headers, + # but just keep that in mind when it comes to debugging syncronization issues data = await ws.recv() - print(i, "got data back", len(data)) - i += 1 + print(f"got {len(data)} bytes") + for b in data: + all_opus_data.append(b) + + async def save_loop(): + i = 0 + nonlocal all_opus_data + while True: + await asyncio.sleep(5) + if len(all_opus_data) > 0: + print("saving") + + with open(f"./user_output_chunk{i}.opus", "wb") as f: + f.write(bytearray(all_opus_data)) + + all_opus_data = [] + + i += 1 + + - await asyncio.gather(send_loop(), recv_loop()) + await asyncio.gather(send_loop(), recv_loop(), save_loop()) except websockets.exceptions.ConnectionClosedError: print("WebSocket connection closed") - exit(0) -asyncio.run(main()) \ No newline at end of file +asyncio.run(main())# \ No newline at end of file From ff09db6e52cc412776e4780566d8df2db2ccdc3a Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Fri, 20 Sep 2024 18:40:34 -0700 Subject: [PATCH 04/35] conversion to wav --- tests/moshi_client.py | 71 ++++++++++++++++++++++++----------------- tests/moshi_out.wav | Bin 0 -> 268844 bytes tests/requirements.txt | 3 +- 3 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 tests/moshi_out.wav diff --git a/tests/moshi_client.py b/tests/moshi_client.py index 8c66e39..a9de6fd 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -1,10 +1,13 @@ import asyncio -from curses import nonl -from io import BytesIO import time -import websockets -import sphn -import numpy as np +import os + +try: + import websockets + import sphn + import numpy as np +except ImportError: + print("you need to pip install websockets, sphn, and numpy") def wav_to_pcm(wav_path: str, sample_rate: int = 24000, frame_size: int = 1920): pcm_data, file_sample_rate = sphn.read(wav_path) @@ -26,8 +29,8 @@ async def main(): sample_rate: float = 24000 frame_size: int = 1920 - # Initialize OpusStreamWriter opus_writer = sphn.OpusStreamWriter(sample_rate) + opus_reader = sphn.OpusStreamReader(sample_rate) pcm_data = wav_to_pcm("./test-audio/user_input_chunk1.wav") @@ -38,7 +41,9 @@ async def main(): chunk = np.pad(chunk, (0, frame_size - len(chunk)), 'constant') opus_writer.append_pcm(chunk) - all_opus_data = [] + last_recv = time.time() + received_data = False + silence_cutoff = 3 # seconds try: async with websockets.connect( @@ -51,37 +56,43 @@ async def send_loop(): msg = opus_writer.read_bytes() if len(msg) > 0: await ws.send(msg) - print(f"sent {len(msg)} bytes") + print("Sent", len(msg), "bytes") async def recv_loop(): + nonlocal last_recv, received_data, opus_reader while True: # note that opus_writer, on both client and server, send 47 + 53 bytes worth of header immediately # so the first two recvs we receive are headers and not actual audio data. Useful headers, # but just keep that in mind when it comes to debugging syncronization issues data = await ws.recv() - print(f"got {len(data)} bytes") - for b in data: - all_opus_data.append(b) - - async def save_loop(): - i = 0 - nonlocal all_opus_data - while True: - await asyncio.sleep(5) - if len(all_opus_data) > 0: - print("saving") - - with open(f"./user_output_chunk{i}.opus", "wb") as f: - f.write(bytearray(all_opus_data)) - - all_opus_data = [] + print("Received", len(data), "bytes") + opus_reader.append_bytes(data) + last_recv = time.time() + received_data = True - i += 1 - - - await asyncio.gather(send_loop(), recv_loop(), save_loop()) - except websockets.exceptions.ConnectionClosedError: + async def timeout_loop(): + while True: + await asyncio.sleep(0.1) + if received_data and time.time() - last_recv > silence_cutoff: + print(f"Server silent for {silence_cutoff}s, closing connection") + + # will cause a ConnectionClosedError, caught below + await ws.close() + + await asyncio.gather(send_loop(), recv_loop(), timeout_loop()) + + except (websockets.exceptions.ConnectionClosedError, websockets.exceptions.ConnectionClosedOK): print("WebSocket connection closed") + + print("Saving output") + pcm_data = np.array([]) + while True: + pcm = opus_reader.read_pcm() + if pcm.shape[0] == 0: + break + pcm_data = np.concatenate((pcm_data, pcm), axis=0) + pcm_data = pcm_data.astype(np.float32) + sphn.write_wav("./moshi_out.wav", pcm_data, sample_rate) -asyncio.run(main())# \ No newline at end of file +asyncio.run(main()) \ No newline at end of file diff --git a/tests/moshi_out.wav b/tests/moshi_out.wav new file mode 100644 index 0000000000000000000000000000000000000000..ff6195a4b7c1fd464e6c5e8aaa5748d1e968a4d5 GIT binary patch literal 268844 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

N% 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

0(HGopSgSOfM`}GC1^&j-` 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

{Pu9u!l4nS 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 F{{R=kW6S^m literal 0 HcmV?d00001 diff --git a/tests/requirements.txt b/tests/requirements.txt index f7afbbe..76e7903 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,4 +1,5 @@ -r requirements.txt requests websockets -sphn \ No newline at end of file +sphn +numpy \ No newline at end of file From 483d14795b2426b3102525cc1de3cd88d4b7d96f Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Fri, 20 Sep 2024 18:42:02 -0700 Subject: [PATCH 05/35] cleanup --- src/moshi.py | 12 +++-- src/prototype.py | 113 ------------------------------------------ tests/moshi_client.py | 5 +- tests/moshi_out.wav | Bin 268844 -> 0 bytes 4 files changed, 10 insertions(+), 120 deletions(-) delete mode 100644 src/prototype.py delete mode 100644 tests/moshi_out.wav diff --git a/src/moshi.py b/src/moshi.py index 6c53307..b2514f8 100644 --- a/src/moshi.py +++ b/src/moshi.py @@ -4,7 +4,6 @@ from .common import app - image = ( modal.Image.debian_slim(python_version="3.11") .pip_install( @@ -81,6 +80,10 @@ def app(self): web_app = FastAPI() + @web_app.get("/status") + async def status(): + return Response(status_code=200) + @web_app.websocket("/ws") async def websocket(ws: WebSocket): with torch.no_grad(): @@ -156,12 +159,10 @@ async def inference_loop(): if text_token not in (0, 3): _text = self.text_tokenizer.id_to_piece(text_token) # type: ignore _text = _text.replace("▁", " ") - print(f"text token '{_text}'") + print(f"output token: '{_text}'") # msg = b"\x02" + bytes(_text, encoding="utf8") # uses "\x02" as a tag to indicate text # log("info", f"text token '{_text}'") # await ws.send_bytes(msg) - - # print(f"frame inference took {time.time() - t0:.2}s") async def send_loop(): ''' @@ -198,4 +199,5 @@ async def send_loop(): self.opus_stream_inbound.close() self.reset_state() - return web_app \ No newline at end of file + return web_app + \ No newline at end of file diff --git a/src/prototype.py b/src/prototype.py deleted file mode 100644 index 9403af2..0000000 --- a/src/prototype.py +++ /dev/null @@ -1,113 +0,0 @@ -import modal -import asyncio - -app = modal.App() - -image = ( - modal.Image.debian_slim(python_version="3.11") - .pip_install( - "sphn", - "fastapi", - ) -) - -with image.imports(): - import sphn - -@app.cls( - image=image -) -class Moshi: - @modal.enter() - def enter(self): - self.tmp_sample_rate = 24000 - self.reset_state() - - def reset_state(self): - # we use Opus format for audio across the websocket, as it can be safely streamed and decoded in real-time - self.opus_stream_outbound = sphn.OpusStreamWriter(self.tmp_sample_rate) - self.opus_stream_inbound = sphn.OpusStreamReader(self.tmp_sample_rate) - - @modal.asgi_app() - def app(self): - from fastapi import FastAPI, Response, WebSocket, WebSocketDisconnect - - web_app = FastAPI() - - @web_app.websocket("/ws") - async def websocket(ws: WebSocket): - await ws.accept() - tasks = [] - - # We use asyncio to run multiple loops concurrently, within the context of this single websocket connection - async def recv_loop(): - ''' - Receives Opus stream across websocket, appends into opus_stream_inboun - ''' - while True: - data = await ws.receive_bytes() - - if not isinstance(data, bytes): - print("received non-bytes message") - continue - if len(data) == 0: - print("received empty message") - continue - - print(f"received {len(data)} bytes") - self.opus_stream_inbound.append_bytes(data) - - async def inference_loop(): - ''' - Runs streaming inference on inbound data, and if any response audio is created, appends it to the outbound stream - ''' - while True: - await asyncio.sleep(0.001) - pcm = self.opus_stream_inbound.read_pcm() - if pcm is None: - continue - if len(pcm) == 0: - continue - print("Inferencing on pcm chunk of size", len(pcm)) - # todo: - # this is where we would run inference - # but for now, just echo audio back - self.opus_stream_outbound.append_pcm(pcm) - - - async def send_loop(): - ''' - Reads outbound data, and sends it across websocket - ''' - while True: - await asyncio.sleep(0.001) - msg = self.opus_stream_outbound.read_bytes() - if msg is None: - continue - if len(msg) == 0: - continue - - await ws.send_bytes(msg) - print(f"sent {len(msg)} bytes") - - # This runs all the loops concurrently - try: - tasks = [ - asyncio.create_task(recv_loop()), - asyncio.create_task(inference_loop()), - asyncio.create_task(send_loop()) - ] - await asyncio.gather(*tasks) - - except WebSocketDisconnect: - print("WebSocket disconnected") - except Exception as e: - print("Exception:", e) - finally: - for task in tasks: - task.cancel() - await asyncio.gather(*tasks, return_exceptions=True) - self.opus_stream_inbound.close() - self.reset_state() - - return web_app \ No newline at end of file diff --git a/tests/moshi_client.py b/tests/moshi_client.py index a9de6fd..a66b632 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -7,7 +7,7 @@ import sphn import numpy as np except ImportError: - print("you need to pip install websockets, sphn, and numpy") + print("you need to run `pip install websockets sphn numpy`") def wav_to_pcm(wav_path: str, sample_rate: int = 24000, frame_size: int = 1920): pcm_data, file_sample_rate = sphn.read(wav_path) @@ -93,6 +93,7 @@ async def timeout_loop(): break pcm_data = np.concatenate((pcm_data, pcm), axis=0) pcm_data = pcm_data.astype(np.float32) - sphn.write_wav("./moshi_out.wav", pcm_data, sample_rate) + sphn.write_wav("/tmp/moshi_out.wav", pcm_data, sample_rate) + print("Saved output to /tmp/moshi_out.wav") asyncio.run(main()) \ No newline at end of file diff --git a/tests/moshi_out.wav b/tests/moshi_out.wav deleted file mode 100644 index ff6195a4b7c1fd464e6c5e8aaa5748d1e968a4d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268844 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

N% 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

0(HGopSgSOfM`}GC1^&j-` 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

{Pu9u!l4nS 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 F{{R=kW6S^m From 6860d6e4d01cf1161617477b805e81ead3262b58 Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Fri, 20 Sep 2024 19:29:30 -0700 Subject: [PATCH 06/35] refactor, add interractive --- tests/moshi_client.py | 125 +++++++++++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 39 deletions(-) diff --git a/tests/moshi_client.py b/tests/moshi_client.py index a66b632..f36129d 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -1,53 +1,26 @@ import asyncio +import sys import time -import os try: + import sounddevice as sd import websockets import sphn import numpy as np except ImportError: - print("you need to run `pip install websockets sphn numpy`") + print("you need to run `pip install websockets sphn numpy sounddevice`") -def wav_to_pcm(wav_path: str, sample_rate: int = 24000, frame_size: int = 1920): - pcm_data, file_sample_rate = sphn.read(wav_path) - - # Resample if necessary - if file_sample_rate != sample_rate: - pcm_data = sphn.resample(pcm_data, src_sample_rate=file_sample_rate, dst_sample_rate=sample_rate) - - # Ensure the PCM data is in the correct shape (mono) - if len(pcm_data.shape) > 1: - pcm_data = np.mean(pcm_data, axis=0) # Convert stereo to mono by averaging channels - - # Convert to float32 if not already - pcm_data = pcm_data.astype(np.float32) - - return pcm_data - -async def main(): - sample_rate: float = 24000 - frame_size: int = 1920 - - opus_writer = sphn.OpusStreamWriter(sample_rate) - opus_reader = sphn.OpusStreamReader(sample_rate) - - pcm_data = wav_to_pcm("./test-audio/user_input_chunk1.wav") - - # Append PCM data to OpusStreamWriter in chunks - for i in range(0, len(pcm_data), frame_size): - chunk = pcm_data[i:i+frame_size] - if len(chunk) < frame_size: - chunk = np.pad(chunk, (0, frame_size - len(chunk)), 'constant') - opus_writer.append_pcm(chunk) +# Update this +endpoint = "wss://erik-dunteman--quillman-moshi-app-dev.modal.run/ws" +async def run_pipeline(opus_writer, opus_reader): last_recv = time.time() received_data = False silence_cutoff = 3 # seconds try: async with websockets.connect( - "wss://erik-dunteman--quillman-moshi-app-dev.modal.run/ws", + endpoint, open_timeout=600, ) as ws: async def send_loop(): @@ -81,11 +54,21 @@ async def timeout_loop(): await ws.close() await asyncio.gather(send_loop(), recv_loop(), timeout_loop()) - + except (websockets.exceptions.ConnectionClosedError, websockets.exceptions.ConnectionClosedOK): print("WebSocket connection closed") - - print("Saving output") + +# helper functions +def wav_to_pcm(wav_path: str, sample_rate: int = 24000, frame_size: int = 1920): + pcm_data, file_sample_rate = sphn.read(wav_path) + if file_sample_rate != sample_rate: + pcm_data = sphn.resample(pcm_data, src_sample_rate=file_sample_rate, dst_sample_rate=sample_rate) + if len(pcm_data.shape) > 1: + pcm_data = np.mean(pcm_data, axis=0) + pcm_data = pcm_data.astype(np.float32) + return pcm_data + +def pcm_from_opus_reader(opus_reader): pcm_data = np.array([]) while True: pcm = opus_reader.read_pcm() @@ -93,7 +76,71 @@ async def timeout_loop(): break pcm_data = np.concatenate((pcm_data, pcm), axis=0) pcm_data = pcm_data.astype(np.float32) - sphn.write_wav("/tmp/moshi_out.wav", pcm_data, sample_rate) - print("Saved output to /tmp/moshi_out.wav") + return pcm_data + +def get_user_mic_input(opus_writer, sample_rate, frame_size): + import sounddevice as sd + channels = 1 + def on_audio_input(in_data, frames, time, status): + assert in_data.shape == (frame_size, channels), in_data.shape + opus_writer.append_pcm(in_data[:, 0]) + in_stream = sd.InputStream( + samplerate=sample_rate, + channels=channels, + blocksize=frame_size, + callback=on_audio_input, + ) + # record for 10 seconds + with in_stream: + in_stream.start() + for i in range(5): + print(f"Recording for {5-i}s") + time.sleep(1) + in_stream.stop() + print("Recording complete. Awaiting model response.") + +def play_audio(pcm_data, sample_rate): + import sounddevice as sd + sd.play(pcm_data, sample_rate) + sd.wait() + +def get_demo_audio(opus_writer, sample_rate, frame_size): + demo_path = "./test-audio/user_input_chunk1.wav" + pcm_data = wav_to_pcm(demo_path) + for i in range(0, len(pcm_data), frame_size): + chunk = pcm_data[i:i+frame_size] + if len(chunk) < frame_size: + chunk = np.pad(chunk, (0, frame_size - len(chunk)), 'constant') + opus_writer.append_pcm(chunk) + +async def main(): + args = sys.argv[1:] + + sample_rate: float = 24000 + frame_size: int = 1920 + + interractive = False + if len(args) > 0: + if args[0] == "interractive": + interractive = True + + opus_writer = sphn.OpusStreamWriter(sample_rate) + opus_reader = sphn.OpusStreamReader(sample_rate) + + # Load up opus_writer with audio data + if interractive: + print("Running in interractive mode.") + get_user_mic_input(opus_writer, sample_rate, frame_size) + await run_pipeline(opus_writer, opus_reader) + pcm_data = pcm_from_opus_reader(opus_reader) + play_audio(pcm_data, sample_rate) + else: + print("Using demo audio.") + print("Run `python moshi_client.py interractive` to use interractive mode instead.") + get_demo_audio(opus_writer, sample_rate, frame_size) + print("Saving output") + pcm_data = pcm_from_opus_reader(opus_reader) + sphn.write_wav("/tmp/moshi_out.wav", pcm_data, sample_rate) + print("Saved output to /tmp/moshi_out.wav") asyncio.run(main()) \ No newline at end of file From 253d97d47e0ec953f0cf30e167f2331375eb9769 Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Fri, 20 Sep 2024 19:35:10 -0700 Subject: [PATCH 07/35] test both interractive and default --- tests/moshi_client.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/moshi_client.py b/tests/moshi_client.py index f36129d..05d8137 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -17,7 +17,7 @@ async def run_pipeline(opus_writer, opus_reader): last_recv = time.time() received_data = False silence_cutoff = 3 # seconds - + print("Starting single response pipeline...") try: async with websockets.connect( endpoint, @@ -29,7 +29,6 @@ async def send_loop(): msg = opus_writer.read_bytes() if len(msg) > 0: await ws.send(msg) - print("Sent", len(msg), "bytes") async def recv_loop(): nonlocal last_recv, received_data, opus_reader @@ -38,7 +37,6 @@ async def recv_loop(): # so the first two recvs we receive are headers and not actual audio data. Useful headers, # but just keep that in mind when it comes to debugging syncronization issues data = await ws.recv() - print("Received", len(data), "bytes") opus_reader.append_bytes(data) last_recv = time.time() received_data = True @@ -92,17 +90,20 @@ def on_audio_input(in_data, frames, time, status): ) # record for 10 seconds with in_stream: + print("Starting recording...") in_stream.start() - for i in range(5): - print(f"Recording for {5-i}s") + for i in range(10): + print(f"Recording for {10-i}s") time.sleep(1) in_stream.stop() print("Recording complete. Awaiting model response.") def play_audio(pcm_data, sample_rate): import sounddevice as sd + print("Starting playback...") sd.play(pcm_data, sample_rate) sd.wait() + print("Playback complete.") def get_demo_audio(opus_writer, sample_rate, frame_size): demo_path = "./test-audio/user_input_chunk1.wav" @@ -138,6 +139,7 @@ async def main(): print("Using demo audio.") print("Run `python moshi_client.py interractive` to use interractive mode instead.") get_demo_audio(opus_writer, sample_rate, frame_size) + await run_pipeline(opus_writer, opus_reader) print("Saving output") pcm_data = pcm_from_opus_reader(opus_reader) sphn.write_wav("/tmp/moshi_out.wav", pcm_data, sample_rate) From 78b8c662dc0412a8d1873e307199cd0e8b72d2e0 Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Sun, 22 Sep 2024 18:09:05 -0700 Subject: [PATCH 08/35] fix interactive typo --- tests/moshi_client.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/moshi_client.py b/tests/moshi_client.py index 05d8137..e7506f0 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -120,24 +120,24 @@ async def main(): sample_rate: float = 24000 frame_size: int = 1920 - interractive = False + interactive = False if len(args) > 0: - if args[0] == "interractive": - interractive = True + if args[0] == "interactive": + interactive = True opus_writer = sphn.OpusStreamWriter(sample_rate) opus_reader = sphn.OpusStreamReader(sample_rate) # Load up opus_writer with audio data - if interractive: - print("Running in interractive mode.") + if interactive: + print("Running in interactive mode.") get_user_mic_input(opus_writer, sample_rate, frame_size) await run_pipeline(opus_writer, opus_reader) pcm_data = pcm_from_opus_reader(opus_reader) play_audio(pcm_data, sample_rate) else: print("Using demo audio.") - print("Run `python moshi_client.py interractive` to use interractive mode instead.") + print("Run `python moshi_client.py interactive` to use interactive mode instead.") get_demo_audio(opus_writer, sample_rate, frame_size) await run_pipeline(opus_writer, opus_reader) print("Saving output") From 0a0168de2a5636f25277e137e32d7971962df49a Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Tue, 24 Sep 2024 14:31:55 -0700 Subject: [PATCH 09/35] gut frontend, add moshi --- src/app.py | 183 +--------------- src/fillers.py | 218 ------------------- src/frontend/app.jsx | 390 ++-------------------------------- src/frontend/converter.js | 37 ---- src/frontend/processor.js | 33 +-- src/frontend/recorder-node.js | 31 +-- src/llama.py | 148 ------------- src/moshi.py | 47 ++-- src/whisper.py | 100 --------- tests/moshi_client.py | 317 ++++++++++++++------------- 10 files changed, 243 insertions(+), 1261 deletions(-) delete mode 100644 src/fillers.py delete mode 100644 src/frontend/converter.js delete mode 100644 src/llama.py delete mode 100644 src/whisper.py diff --git a/src/app.py b/src/app.py index 8f4f1a8..be6ae87 100644 --- a/src/app.py +++ b/src/app.py @@ -1,16 +1,16 @@ """ Main web application service. Serves the static frontend as well as -API routes for transcription, language model generation and text-to-speech. +proxying websocket connection to the deployed moshi model. """ from pathlib import Path import modal -import base64 +# import base64 -from .xtts import XTTS -from .whisper import Whisper -from .llama import Llama -from .fillers import Fillers -import time +# from .xtts import XTTS +# from .whisper import Whisper +# from .llama import Llama +# from .fillers import Fillers +# import time from .common import app @@ -24,11 +24,9 @@ ) @modal.asgi_app() def web(): - from fastapi import FastAPI, Response, WebSocket + from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware - from fastapi.responses import Response from fastapi.staticfiles import StaticFiles - import json # disable caching on static files StaticFiles.is_not_modified = lambda self, *args, **kwargs: False @@ -43,171 +41,6 @@ def web(): allow_headers=["*"], ) - # Instantiate the inference modules - whisper = Whisper() - llama = Llama() - xtts = XTTS() - fillers = Fillers() - - @web_app.get("/status") - async def status(): - """Return the status of each inference module, to provide feedback to the user about the app's readiness.""" - whisper_stats = whisper.prewarm.get_current_stats() - llama_stats = llama.prewarm.get_current_stats() - xtts_stats = xtts.prewarm.get_current_stats() - return { - "whisper": whisper_stats.num_total_runners > 0 - and whisper_stats.backlog == 0, - "llama": llama_stats.num_total_runners > 0 and llama_stats.backlog == 0, - "xtts": xtts_stats.num_total_runners > 0 and xtts_stats.backlog == 0, - } - - @web_app.get("/prewarm") - async def prewarm(): - """Prewarm the inference modules, to ensure they're ready to receive requests.""" - prewarm_futures = [ - whisper.prewarm.spawn(), - llama.prewarm.spawn(), - xtts.prewarm.spawn(), - fillers.prewarm.spawn(), - ] - for i in prewarm_futures: - i.get() - - return Response(status_code=200) - - @web_app.websocket("/pipeline") - async def websocket_endpoint(websocket: WebSocket): - """A websocket endpoint to generate a single response from a user's input. - - Receive Stages: - 1: User streams their input in via WebSocket. Transcription begins immediately. Multiple transcription chunks may be sent in. - recv: { "type": "wav", "value": } -> Wav bytes - 2: User optionally sends in a history of previous messages from the chat session. - recv: { "type": "history", "value": } -> is a list of OpenAI format chat message history - 3: User sends in the end signal. LLM response generation begins once all transcription chunks are complete. - recv: { "type": "end" } - - Response Stages: - 4: Pre-synthesized filler audio is selected and sent to the client, to shorten the initial silence. - 5: LLM response generation yields completed sentences. Each sentence is sent to TTS. - 6: TTS yields a sentence at a time. Each sentence is sent back to the client. - send: { "type": "text", "value": } -> is a text sentence from the LLM - send: { "type": "wav", "value": } -> Wav bytes - 7: Once all TTS chunks are sent, the websocket is closed. - """ - await websocket.accept() - - history = [] - - # Receive message stream from client - async def user_input_stream_gen(): - while True: - msg_bytes = await websocket.receive_bytes() - msg = json.loads(msg_bytes.decode()) - if msg["type"] == "end": - critical_stage_start_time = time.time() - # Request stage complete - break - elif msg["type"] == "history": - # we're receiving a history chunk - for history_entry in msg["value"]: - history.append(history_entry) - continue - elif msg["type"] == "wav": - wav_bytes = base64.b64decode(msg["value"]) - yield wav_bytes - else: - print( - f"websocket.receive_bytes received unknown message type: {msg['type']}" - ) - continue - - # Transcribe user input wavs the moment they become available - transcribe_futures = [] - async for chunk in user_input_stream_gen(): - transcribe_futures.append(whisper.transcribe.spawn(chunk)) - - # Await all transcription chunks, since reponse generation - # requires the full transcript before it can begin - transcript_chunks = [] - for id in transcribe_futures: - transcript_chunk = id.get() - transcript_chunks.append(transcript_chunk) - - # Send the completed transcript back to the client - transcript = " ".join(transcript_chunks) - await websocket.send_bytes( - json.dumps({"type": "transcript", "value": transcript}).encode() - ) - - # While we think, send back filler audio - sentences = fillers.neighbors.remote(transcript, n=1) - for sentence in sentences: - wav_bytesio = fillers.fetch_wav.remote(sentence) - if wav_bytesio is not None: - await websocket.send_bytes( - json.dumps( - { - "type": "wav", - "value": base64.b64encode(wav_bytesio.getvalue()).decode( - "utf-8" - ), - } - ).encode() - ) - await websocket.send_bytes( - json.dumps({"type": "text", "value": sentence}).encode() - ) - - # Send the transcript to the LLM - llm_response_stream_gen = llama.generate.remote_gen(transcript, history) - - # Accumulate the LLM response stream into sentences - # for more natural-sounding TTS. - punctuation = [".", "?", "!", ":", ";", "*"] - - def tts_input_stream_acccumulator(text_stream): - current_chunk = "" - for word in text_stream: - current_chunk += word + " " - for p in punctuation: - if p in word: - # yields sentences to TTS - yield current_chunk - current_chunk = "" - break - # send last chunk - if current_chunk != "": - yield current_chunk - - tts_input_stream_gen = tts_input_stream_acccumulator(llm_response_stream_gen) - - # We pass the generator into xtts.speak.map, which returns a generator - # This allows us to get access to the XTTS futures as they resolve, even if text is still being generated - tts_output_stream_gen = xtts.speak.map(tts_input_stream_gen) - - async for text, wav_bytesio in tts_output_stream_gen: - # Send the text string to the client for the chat UI to display - await websocket.send_bytes( - json.dumps({"type": "text", "value": text}).encode() - ) - - # Send the wav in two messages: first the json signal, then the actual bytes - await websocket.send_bytes( - json.dumps( - { - "type": "wav", - "value": base64.b64encode(wav_bytesio.getvalue()).decode( - "utf-8" - ), - } - ).encode() - ) - - # All done! Close the websocket. - await websocket.close() - # Serve static files, for the frontend web_app.mount("/", StaticFiles(directory="/assets", html=True)) return web_app diff --git a/src/fillers.py b/src/fillers.py deleted file mode 100644 index 3a3ecbe..0000000 --- a/src/fillers.py +++ /dev/null @@ -1,218 +0,0 @@ -from re import TEMPLATE -import modal -import time - -from .common import app -from .xtts import XTTS - -FILLER_PROMPT_TEMPLATE = ''' -In a conversation between a human and an AI assistant, the AI is empethetic. -To fill time while thinking, it says a contextually relevant filler response: -"{filler}" -''' - -TRANSCRIPT_PROMPT_TEMPLATE = ''' -In a conversation between a human and an AI assistant, the AI is empethetic. -The user says: -"{user_input}" -Meanwhile, the AI assistant is thinking about a contextually relevant response. -''' - - -cache = modal.Dict.from_name("filler-cache", create_if_missing=True) - -filler_img = ( - modal.Image.debian_slim(python_version="3.10") - .pip_install( - "sentence-transformers", - "torch" - ) -) - -with filler_img.imports(): - from sentence_transformers import SentenceTransformer - import torch - -@app.cls( - image=filler_img, - gpu="T4", # can be cheap - container_idle_timeout=120, - timeout=300, -) -class Fillers: - def __init__(self): - pass - - @modal.build() - def download_model(self): - SentenceTransformer("all-MiniLM-L6-v2") - - @modal.enter() - def enter(self): - device = "cuda" if torch.cuda.is_available() else "cpu" - model = SentenceTransformer("all-MiniLM-L6-v2").to(device) - self.model = model - - # precompute and cache embeddings - t0 = time.time() - formatted = [FILLER_PROMPT_TEMPLATE.format(filler=filler) for filler in filler_sentences] - self.embeddings = self.model.encode(formatted, convert_to_tensor=True) - print(f"Precomputing embeddings took {time.time() - t0:.2f}s") - - - @modal.method() - def prefill(self): - # presynthesize filler sentences using XTTS module - self.xtts = XTTS() - t0 = time.time() - count = 0 - for filler in filler_sentences: - if filler not in cache: - _, wav_bytesio = self.xtts.speak.remote(filler) - cache[filler] = wav_bytesio - count += 1 - print("Synthesized and cached filler:", filler) - print(f"Synthesizing and caching {count} fillers took {time.time() - t0:.2f}s") - - @modal.method() - def prewarm(self): - # no-op to prewarm model instance - pass - - @modal.method() - def neighbors(self, text, n=1): - ''' - Use cosine similarity to find the top n most similar sentences - ''' - - # Since we have a relatively small number of fillers, we can just do a brute-force cosine similarity search - # But for larger sets of fillers, we'd use ANNOY, an excellent library for finding approximate nearest neighbors (oh yeah) - text_embedding = self.model.encode(TRANSCRIPT_PROMPT_TEMPLATE.format(user_input=text), convert_to_tensor=True) - similarities = torch.nn.functional.cosine_similarity(text_embedding, self.embeddings) - top_n_similarities, top_n_indices = torch.topk(similarities, n) - - return [filler_sentences[i] for i in top_n_indices] - - @modal.method() - def fetch_wav(self, sentence): - if sentence in cache: - return cache[sentence] - else: - print("Not in cache:", sentence) - return None - - -filler_sentences = [ - # Vocalizations - "Ooof!", - "Aaah!", - "Wow!", - "Tada!", - "Ohhh!", - "Oooh...", - "Hmmm...", - "Eeee!", - "Huh?", - "Whoa!", - "Yikes!", - "Sheesh!", - "Phew!", - "Aha!", - "Oh my!", - "Gosh!", - "Ahem!", - "Bam!", - "Oops!", - "Aww!", - - # Quick Talk - "Pardon me?", - "Hey!", - "I see.", - "Totally!", - "Sure.", - "Okay.", - "Alright.", - "Yes!", - "That's right.", - "I agree.", - "I'm with you.", - "I think so.", - "Got it.", - "Fair enough.", - "Makes sense.", - "Interesting.", - "No way!", - "You don't say!", - "Go on.", - "Really?", - "Is that so?", - "Tell me more.", - "Say what?", - "Come again?", - "How about that?", - "Well, well, well.", - "Oh, I see.", - "Indeed!", - "Naturally.", - "Of course!", - "Absolutely!", - "Good point.", - "Well said.", - "True that.", - "Right on!", - "For real?", - "You bet!", - "No kidding!", - "As if!", - "Get out!", - "Seriously?", - "That's crazy!", - "Who knew?", - "Fancy that!", - "How so?", - "Do tell.", - "Oh really?", - "Is it?", - "Why so?", - "What gives?", - - # Responses to direct questions - "Let me think...", - "Good question.", - "That's tricky.", - "Well now...", - "Hmm, let's see.", - "Give me a sec.", - "I'm not sure.", - "It depends.", - "Possibly?", - "Maybe so.", - "Could be.", - "Hard to say.", - "That's debatable.", - "In what way?", - "Interesting question.", - "I wonder...", - "That's complex.", - "Not necessarily.", - "Yes and no.", - "To some extent.", - "In a sense.", - "More or less.", - "Up to a point.", - "That's subjective.", - "It varies.", - "Case by case.", -] - -@app.local_entrypoint() -def test_filler(): - fillers = Fillers() - sentences = fillers.neighbors.remote("What's the best approximate nearest neighbor algorithm?", n=1) - for i, sentence in enumerate(sentences): - wav_bytesio = fillers.fetch_wav.remote(sentence) - if wav_bytesio is not None: - with open(f"/tmp/filler_{i}.wav", "wb") as f: - f.write(wav_bytesio.getvalue()) - print(f"Output audio for filler sentence `{sentence}` saved to /tmp/filler_{i}.wav") \ No newline at end of file diff --git a/src/frontend/app.jsx b/src/frontend/app.jsx index ecec6bf..b35c6db 100644 --- a/src/frontend/app.jsx +++ b/src/frontend/app.jsx @@ -1,293 +1,42 @@ -const { createMachine} = XState; -const { useMachine } = XStateReact; const { useRef, useEffect, useState } = React; import RecorderNode from "./recorder-node.js"; -import {float32ArrayToWav} from "./converter.js"; const baseURL = "" // points to whatever is serving this app (eg your -dev.modal.run for modal serve, or .modal.run for modal deploy) -// We use XState to manage the state of the app, transitioning between states: -// - SETUP: warming up models, setting up audio context, etc. -// - IDLE: waiting for user to speak loud enough to trigger the recording -// - RECORDING: recording audio until user has been silent for a certain amount of time. Audio begins streaming to the server. -// - GENERATING: /pipeline GENERATEs a response and streams it back to the client. Ends once final audio is played. -const voiceChatMachine = createMachine({ - id: 'voiceChat', - initial: 'SETUP', - context: { - websocket: null, - recorderNode: null, - audioContext: null, - }, - states: { - SETUP: { - on: { - SETUP_COMPLETE: 'IDLE' - }, - invoke: { - src: 'doSetup', - onDone: { - actions: ['unmuteMic'], - target: 'IDLE', - }, - } - }, - IDLE: { - on: { - START_RECORDING: 'RECORDING' - } - }, - RECORDING: { - on: { - STOP_RECORDING: { - target: 'GENERATING', - actions: ['muteMic'] - } - } - }, - GENERATING: { - on: { - GENERATION_COMPLETE: 'SETUP', - } - } - } -}); - const App = () => { - const [chatHistory, setChatHistory] = useState([{ - role: "assistant", - content: "Hi! I'm a language model running on Modal. Talk to me using your microphone, and remember to turn your speaker volume up!" - }]); - const [micAmplitude, setMicAmplitude] = useState(0); - const [micThreshold, setMicThreshold] = useState(0.05); + const [amplitude, setAmplitude] = useState(0); - // Due to how the recorder node callback closures work, we need to use Refs to ensure the callbacks use the latest values - const sendRef = useRef(); - const stateRef = useRef(); - const chatHistoryRef = useRef(chatHistory); - const playQueueRef = useRef([]); - const isPlayingRef = useRef(false); - - const updateMicThreshold = (value) => { - // update both in the recorder node and UI state - stateRef.current.context.recorderNode.updateThreshold(value); - setMicThreshold(value); - }; + const onAmplitude = (amplitude) => { + setAmplitude(amplitude); + } - // Called in SETUP state const setupAudio = async () => { const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); const audioContext = new AudioContext(); const source = audioContext.createMediaStreamSource(stream); - - const onBufferReceived = async (buffer) => { - if (!stateRef.current.matches('RECORDING')) { - return; - } - - const wav_blob = float32ArrayToWav(buffer, 48000); - const array_buffer = await wav_blob.arrayBuffer(); - const wav_base64 = btoa( - new Uint8Array(array_buffer) - .reduce((data, byte) => data + String.fromCharCode(byte), '') - ); - stateRef.current.context.websocket.send(new TextEncoder().encode(`{"type": "wav", "value": "${wav_base64}"}`)); - console.log("Sent wav segment to server"); - } - - // Callback for when the user mic exceeds the threshold - const onTalking = () => { - // state transition only valid in IDLE state, so only relevant in first onTalking - sendRef.current("START_RECORDING"); - } - - // Callback for when the user has been below threshold for the silence period - const onSilence = () => { - if (!stateRef.current.matches('RECORDING')) { - return; - } - - // Prepare to transition to the GENERATING state - - // Send the chat history to the server and end signal to the server. Truncate the history to the last 10 messages. - const historyMessage = `{"type": "history", "value": ${JSON.stringify(chatHistoryRef.current.slice(-10))}}`; - stateRef.current.context.websocket.send(new TextEncoder().encode(historyMessage)); - stateRef.current.context.websocket.send(new TextEncoder().encode(`{"type": "end"}`)); - - // Transition to the GENERATING state - sendRef.current("STOP_RECORDING"); - } - - // Callback for sending amplitude from recorder node to the UI - const onAmplitude = (amplitude) => { - setMicAmplitude(amplitude); - } - - // Recorder node expects the callbacks: onBufferReceived, onTalking, onSilence, onAmplitude await audioContext.audioWorklet.addModule("processor.js"); const recorderNode = new RecorderNode( audioContext, - onBufferReceived, - onTalking, - onSilence, onAmplitude, ); - source.connect(recorderNode); recorderNode.connect(audioContext.destination); console.log("Audio setup complete"); - return { recorderNode, audioContext }; - } - - // Called in SETUP state - const openWebsocket = async (onWebsocketMessage) => { - return new Promise((resolve, reject) => { - const socket = new WebSocket(`${baseURL}/pipeline`); - socket.onopen = () => { - console.log('WebSocket connection established'); - resolve(socket); - }; - socket.onclose = () => { - console.log('WebSocket connection closed'); - }; - socket.onerror = (error) => { - console.error('WebSocket error:', error); - reject(error); - }; - socket.onmessage = onWebsocketMessage; - return socket; - }); } - // Called in GENERATING state, when we're waiting for the server to send us a response - const onWebsocketMessage = async (event) => { - if (!stateRef.current.matches('GENERATING')) { - return; - } - - if (event.data instanceof Blob){ - const arrayBuffer = await event.data.arrayBuffer(); - - // else parse json - const data = JSON.parse(new TextDecoder().decode(arrayBuffer)); - if (data.type === "wav") { - const wavBase64 = data.value; - const wavBinary = atob(wavBase64); - const wavBytes = new Uint8Array(wavBinary.length); - for (let i = 0; i < wavBinary.length; i++) { - wavBytes[i] = wavBinary.charCodeAt(i); - } - playQueueRef.current.push(wavBytes.buffer); - - // // // Create a Blob from the Uint8Array - // const wavBlob = new Blob([wavBytes], { type: 'audio/wav' }); - // playQueueRef.current.push(wavBlob); - return; - } else if (data.type === "text") { - console.log("Received bot reply:", data.value); - // Append bot reply to chat history - setChatHistory(prevHistory => { - let lastMessage = prevHistory[prevHistory.length - 1]; - if (lastMessage.role === "user") { - return [...prevHistory, { role: "assistant", content: data.value }]; - } else { - const updatedHistory = [...prevHistory]; - updatedHistory[updatedHistory.length - 1] = { - ...lastMessage, - content: lastMessage.content + "\n" + data.value - }; - return updatedHistory; - } - }); - } else if (data.type === "transcript") { - // Append user transcript to chat history - console.log("Received user transcript:", data.value); - setChatHistory(prevHistory => [...prevHistory, {role: "user", content: data.value}]); - } - }; - } - - // Audio player always runs in the background during GENERATING state - // It plays the wavs sent by the server. useEffect(() => { - const intervalId = setInterval(async () => { - if (stateRef.current.matches('GENERATING') && !isPlayingRef.current && playQueueRef.current.length > 0) { - isPlayingRef.current = true; - const arrayBuffer = playQueueRef.current.shift(); - if (arrayBuffer) { - try { - const audioBuffer = await stateRef.current.context.audioContext.decodeAudioData(arrayBuffer); - const source = stateRef.current.context.audioContext.createBufferSource(); - source.buffer = audioBuffer; - source.connect(stateRef.current.context.audioContext.destination); - source.onended = () => { - isPlayingRef.current = false; - if (playQueueRef.current.length === 0 && stateRef.current.context.websocket.readyState === WebSocket.CLOSED) { - // on empty queue and websocket closed, transition to the SETUP state to start a new websocket connection - sendRef.current("GENERATION_COMPLETE"); - return; - } - }; - source.start(); - } catch (error) { - console.error("Error decoding audio data:", error); - } - } - } - }, 200); - return () => clearInterval(intervalId); + setupAudio(); }, []); - - const [state, send] = useMachine(voiceChatMachine, { - actions: { - unmuteMic: (context, event) => { - console.log("Unmuting mic"); - context.recorderNode.unmute(); - }, - muteMic: (context, event) => { - console.log("Muting mic"); - context.recorderNode.mute(); - }, - }, - services: { - doSetup: async (context) => { - console.log('Setting up services'); - - // Setup audio if not already setup - if (!context.recorderNode) { - const { recorderNode, audioContext } = await setupAudio(); - context.audioContext = audioContext; - context.recorderNode = recorderNode; - } - - // Ensure warmup - await fetch(`${baseURL}/prewarm`); - - // Each new bot response is a new websocket session, so prep the connection for the upcoming session. - const socket = await openWebsocket(onWebsocketMessage); - context.websocket = socket; - - return Promise.resolve(context); - }, - } - }); - - sendRef.current = send; - stateRef.current = state; - chatHistoryRef.current = chatHistory; - + return (
- +

Chat

- {chatHistory.map(({ role, content }) => ( - - ))} - +
@@ -316,110 +65,19 @@ const ChatMessage = ({ content, role }) => { ); } -const UserHint = ({ state }) => { - const [firstSetup, setFirstSetup] = useState(true); - - useEffect(() => { - if (state.matches('IDLE') && firstSetup) { - setFirstSetup(false); - } - }, [state, firstSetup]); - - if (state.matches('SETUP') && !firstSetup) { - return null; - } - - if (state.matches("GENERATING")) { - return null; - } - - let hintText = ""; - if (state.matches('SETUP') && firstSetup) { - hintText = "Waking up models..."; - } else if (state.matches('IDLE')) { - hintText = "Ready to talk!"; - } else if (state.matches('RECORDING')) { - hintText = "Listening"; - } - - if (!hintText) { - return null; - } - - return ( -
-
-
-
- {hintText} -
-
-
-
- ); -} - -const Sidebar = ({ stateRef, micAmplitude, micThreshold, updateMicThreshold }) => { - const [whisperStatus, setWhisperStatus] = useState(false); - const [llamaStatus, setLlamaStatus] = useState(false); - const [xttsStatus, setXttsStatus] = useState(false); - - // Backend status monitor that always runs in the background - useEffect(() => { - const intervalId = setInterval(async () => { - try { - const response = await fetch(`${baseURL}/status`); - if (!response.ok) { - throw new Error("Error occurred during status check: " + response.status); - } - const data = await response.json(); - setWhisperStatus(data.whisper); - setLlamaStatus(data.llama); - setXttsStatus(data.xtts); - - // stop once all services are up - if (data.whisper && data.llama && data.xtts) { - clearInterval(intervalId); - } - } catch (error) { - console.error(error); - } - }, 1000); - return () => clearInterval(intervalId); - }, []); - +const Sidebar = ({amplitude}) => { return (

QuiLLMan

Service Status

-

Whisper

- {whisperStatus ? ( -
👂
- ) : ( -
- )} -
-
-

Llama

- {llamaStatus ? ( -
🧠
- ) : ( -
- )} -
-
-

XTTS

- {xttsStatus ? ( -
👄
- ) : ( -
- )} +

Moshi

+
- +
{ +const MicLevels = ({ micAmplitude }) => { const maxAmplitude = 0.2; // for scaling return (

Mic Settings

-
+
-
-
- -
- - updateMicThreshold(Number(e.target.value))} - className="w-full h-2 bg-zinc-600 rounded-lg appearance-none cursor-pointer" - />
); diff --git a/src/frontend/converter.js b/src/frontend/converter.js deleted file mode 100644 index 4fa42ca..0000000 --- a/src/frontend/converter.js +++ /dev/null @@ -1,37 +0,0 @@ -export function float32ArrayToWav(float32Array, sampleRate) { - const wavBuffer = new ArrayBuffer(44 + float32Array.length * 2); - const view = new DataView(wavBuffer); - - // Write the WAV file header - writeString(view, 0, 'RIFF'); - view.setUint32(4, 36 + float32Array.length * 2, true); - writeString(view, 8, 'WAVE'); - writeString(view, 12, 'fmt '); - view.setUint32(16, 16, true); - view.setUint16(20, 1, true); - view.setUint16(22, 1, true); - view.setUint32(24, sampleRate, true); - view.setUint32(28, sampleRate * 2, true); - view.setUint16(32, 2, true); - view.setUint16(34, 16, true); - writeString(view, 36, 'data'); - view.setUint32(40, float32Array.length * 2, true); - - // Write the audio data - floatTo16BitPCM(view, 44, float32Array); - - return new Blob([wavBuffer], { type: 'audio/wav' }); -} - -export function writeString(view, offset, string) { - for (let i = 0; i < string.length; i++) { - view.setUint8(offset + i, string.charCodeAt(i)); - } -} - -export function floatTo16BitPCM(output, offset, input) { - for (let i = 0; i < input.length; i++, offset += 2) { - const s = Math.max(-1, Math.min(1, input[i])); - output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); - } -} \ No newline at end of file diff --git a/src/frontend/processor.js b/src/frontend/processor.js index 745c898..26f0809 100644 --- a/src/frontend/processor.js +++ b/src/frontend/processor.js @@ -1,38 +1,26 @@ -const PAUSE_DURATION = 0.5; // seconds of silence before sending a chunk -const END_DURATION = 3; // seconds of silence before ending recording - class WorkletProcessor extends AudioWorkletProcessor { constructor(options) { super(); // Configuration const processorOptions = options.processorOptions || {}; - this.PAUSE_DURATION = PAUSE_DURATION; - this.END_DURATION = END_DURATION; - this.isMuted = true; - - this.talkingThreshold = 0.05; // initial value + // this.is_muted = false; // todo erik: just future ref that you can set internal state // State - this._buffer = []; - this._isTalking = false; - this._isRecordingSession = false; - this._silenceCounter = 0; + // this._buffer = []; // todo erik future ref // Add message event listener this.port.onmessage = this.handleMessage.bind(this); } handleMessage(event) { - if (event.data.type === 'updateThreshold') { - this.talkingThreshold = event.data.value; - } - if (event.data.type === 'mute') { - this.isMuted = true; - } - if (event.data.type === 'unmute') { - this.isMuted = false; - } + // todo erik future ref + // if (event.data.type === 'mute') { + // this.isMuted = true; + // } + // if (event.data.type === 'unmute') { + // this.isMuted = false; + // } } process(inputs, outputs, parameters) { @@ -40,9 +28,10 @@ class WorkletProcessor extends AudioWorkletProcessor { if (!input) return true; // Early return if no input const amplitude = this._calculateAmplitude(input); + // console.log("amplitude from worker", amplitude); this.port.postMessage({ type: 'amplitude', value: amplitude }); - if (this.isMuted) return true; + return true; // every time user goes above threshold, we start recording // staying above that threshold maintains the recording state diff --git a/src/frontend/recorder-node.js b/src/frontend/recorder-node.js index 853db6f..b7d5e26 100644 --- a/src/frontend/recorder-node.js +++ b/src/frontend/recorder-node.js @@ -1,36 +1,25 @@ class RecorderNode extends AudioWorkletNode { - constructor(context, onBufferReceived, onTalking, onSilence, onAmplitude, options = {}) { + constructor(context, onAmplitude) { super(context, "worklet-processor"); this.port.onmessage = (event) => { switch(event.data.type) { - case 'buffer': // buffers are sent on brief pauses - onBufferReceived(event.data.buffer); - break; - case 'talking': - onTalking(); - break; - case 'silence': - onSilence(); - break; + // case 'buffer': // buffers are sent on brief pauses + // onBufferReceived(event.data.buffer); + // break; case 'amplitude': onAmplitude(event.data.value); - break; } }; } - updateThreshold(value) { - this.port.postMessage({ type: 'updateThreshold', value }); - } - - mute() { - this.port.postMessage({ type: 'mute' }); - } + // mute() { + // this.port.postMessage({ type: 'mute' }); + // } - unmute() { - this.port.postMessage({ type: 'unmute' }); - } + // unmute() { + // this.port.postMessage({ type: 'unmute' }); + // } } export default RecorderNode; \ No newline at end of file diff --git a/src/llama.py b/src/llama.py deleted file mode 100644 index d4320c5..0000000 --- a/src/llama.py +++ /dev/null @@ -1,148 +0,0 @@ -""" -Text generation service based on the Llama 3.1 8B Instruct model by Meta. - -The model is an [FP8 quantized version by Neural Magic](https://huggingface.co/neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8), which is licensed under the Llama3.1 license. - -We use the [VLLM](https://github.com/vllm-project/vllm) library to run the model. -""" -import time -import os - -import modal - -from .common import app - -MODEL_DIR = "/model" -MODEL_NAME = "neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8" -GPU_CONFIG = modal.gpu.A100(size="40GB", count=1) - -llama_image = ( - modal.Image.debian_slim(python_version="3.10") - .pip_install( - "transformers==4.44.2", - "vllm==0.6.0", - "torch==2.4.0", - "hf_transfer==0.1.8", - "huggingface_hub==0.24.6", - ) - .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"}) -) - - -@app.cls( - gpu=GPU_CONFIG, - timeout=60 * 10, - container_idle_timeout=60 * 10, - allow_concurrent_inputs=10, - image=llama_image, -) -class Llama: - @modal.build() - def download_model(self): - from huggingface_hub import snapshot_download - from transformers.utils import move_cache - - print("Downloading model, this may take a few minutes...") - os.makedirs(MODEL_DIR, exist_ok=True) - snapshot_download( - MODEL_NAME, - local_dir=MODEL_DIR, - ignore_patterns=["*.pt", "*.bin"], # Using safetensors - ) - move_cache() - - @modal.enter() - def start_engine(self): - from vllm.engine.arg_utils import AsyncEngineArgs - from vllm.engine.async_llm_engine import AsyncLLMEngine - from transformers import AutoTokenizer - - t0 = time.time() - - engine_args = AsyncEngineArgs( - model=MODEL_DIR, - tensor_parallel_size=GPU_CONFIG.count, - gpu_memory_utilization=0.90, - enforce_eager=False, # capture the graph for faster inference, but slower cold starts - disable_log_stats=True, # disable logging so we can stream tokens - disable_log_requests=True, - ) - - self.tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - - # this can take some time! - self.engine = AsyncLLMEngine.from_engine_args(engine_args) - print(f"VLLM engine started in {time.time() - t0:.2f}s") - - @modal.method() - def prewarm(self): - # no-op to prewarm model instance - pass - - @modal.method(is_generator=True) - async def generate(self, prompt, history=[]): - from vllm import SamplingParams - from vllm.utils import random_uuid - - messages = [ - { - "role": "system", - "content": "You are a helpful AI assistant. Respond to the human to the best of your ability. Keep it brief.", - }, - ] - - for history_entry in history: - # history follows "role" + "content" format so can be used directly - messages.append(history_entry) - - messages.append({"role": "user", "content": prompt}) - - prompts = self.tokenizer.apply_chat_template(messages, tokenize=False) - sampling_params = SamplingParams( - temperature=0.75, top_p=0.9, max_tokens=256, repetition_penalty=1.1 - ) - request_id = random_uuid() - print(f"Request {request_id} generating with prompt:\n{prompts}") - result_stream = self.engine.generate(prompts, sampling_params, request_id) - index = 0 - buffer = "" - header_complete = False - async for output in result_stream: - if output.outputs[0].text and "\ufffd" == output.outputs[0].text[-1]: - # Skip incomplete unicode characters - continue - - new_text = output.outputs[0].text[index:] - index = len(output.outputs[0].text) - - # ignore leading <|start_header_id|>assistant<|end_header_id|> - if not header_complete: - if new_text == "<|end_header_id|>": - header_complete = True - continue - - buffer += new_text - - # Yield any complete words in the buffer - while buffer: - space_index = buffer.find(" ") - if space_index == -1: - break - - word = buffer[: space_index + 1] - yield word.strip() - - buffer = buffer[space_index + 1 :] - - # Yield any remaining content in the buffer - if buffer.strip(): - yield buffer.strip() - - -@app.local_entrypoint() -def main( - prompt: str = "Who was Emperor Norton I, and what was his significance in San Francisco's history?", -): - model = Llama() - for token in model.generate.remote_gen(prompt): - print(token, end=" ") diff --git a/src/moshi.py b/src/moshi.py index b2514f8..860c547 100644 --- a/src/moshi.py +++ b/src/moshi.py @@ -2,15 +2,15 @@ import asyncio import time -from .common import app +app = modal.App("moshi") image = ( modal.Image.debian_slim(python_version="3.11") .pip_install( - "moshi", - "huggingface_hub", - "hf_transfer", - "sphn", + "moshi==0.1.0", + "huggingface_hub==0.24.7", + "hf_transfer==0.1.8", + "sphn==0.1.4", ) .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"}) ) @@ -26,7 +26,7 @@ @app.cls( image=image, gpu="A10G", - container_idle_timeout=60, + container_idle_timeout=300, timeout=600, allow_concurrent_inputs=1, # websocket connection must be unique to avoid GPU conflicts ) @@ -48,7 +48,14 @@ def enter(self): moshi_weight = hf_hub_download(loaders.DEFAULT_REPO, loaders.MOSHI_NAME) self.moshi = loaders.get_moshi_lm(moshi_weight, device=self.device) - self.lm_gen = LMGen(self.moshi) # can add temp here + self.lm_gen = LMGen( + self.moshi, + # Sampling params + temp = 0.8, + temp_text = 0.8, + top_k = 250, + top_k_text = 25, + ) self.mimi.streaming_forever(1) self.lm_gen.streaming_forever(1) @@ -67,13 +74,15 @@ def enter(self): _ = self.mimi.decode(tokens[:, 1:]) torch.cuda.synchronize() - self.reset_state() - def reset_state(self): # we use Opus format for audio across the websocket, as it can be safely streamed and decoded in real-time self.opus_stream_outbound = sphn.OpusStreamWriter(self.mimi.sample_rate) self.opus_stream_inbound = sphn.OpusStreamReader(self.mimi.sample_rate) + # LLM is stateful, maintaining chat history, so reset it on each connection + self.mimi.reset_streaming() + self.lm_gen.reset_streaming() + @modal.asgi_app() def app(self): from fastapi import FastAPI, Response, WebSocket, WebSocketDisconnect @@ -88,6 +97,11 @@ async def status(): async def websocket(ws: WebSocket): with torch.no_grad(): await ws.accept() + + # Clear model chat history and any buffered audio + self.reset_state() + + print("Session started") tasks = [] # We use asyncio to run multiple loops concurrently, within the context of this single websocket connection @@ -105,7 +119,6 @@ async def recv_loop(): print("received empty message") continue - # print(f"received {len(data)} bytes") self.opus_stream_inbound.append_bytes(data) async def inference_loop(): @@ -155,14 +168,11 @@ async def inference_loop(): self.opus_stream_outbound.append_pcm(main_pcm[0, 0].numpy()) text_token = tokens[0, 0, 0].item() - # print("text token", text_token) if text_token not in (0, 3): - _text = self.text_tokenizer.id_to_piece(text_token) # type: ignore - _text = _text.replace("▁", " ") - print(f"output token: '{_text}'") - # msg = b"\x02" + bytes(_text, encoding="utf8") # uses "\x02" as a tag to indicate text - # log("info", f"text token '{_text}'") - # await ws.send_bytes(msg) + text = self.text_tokenizer.id_to_piece(text_token) + text = text.replace("▁", " ") + msg = b"\x02" + bytes(text, encoding="utf8") # prepend "\x02" as a tag to indicate text + await ws.send_bytes(msg) async def send_loop(): ''' @@ -175,9 +185,8 @@ async def send_loop(): continue if len(msg) == 0: continue - + msg = b"\x01" + msg # prepend "\x01" as a tag to indicate audio await ws.send_bytes(msg) - # print(f"sent {len(msg)} bytes") # This runs all the loops concurrently try: diff --git a/src/whisper.py b/src/whisper.py deleted file mode 100644 index b0cb3bd..0000000 --- a/src/whisper.py +++ /dev/null @@ -1,100 +0,0 @@ -""" -Speech-to-text transcriptiong service based on OpenAI Whisper V3 large. - -We use the [Transformers](https://github.com/huggingface/transformers) library to transcribe audio in real-time. - -The model is based on the [OpenAI Whisper V3](https://huggingface.co/openai/whisper-large-v3) model, which is licensed under the Apache 2.0 license. -""" - -import time -import modal - -from .common import app - -cuda_version = "12.4.0" # should be no greater than host CUDA version -flavor = "devel" # includes full CUDA toolkit -os = "ubuntu22.04" -tag = f"{cuda_version}-{flavor}-{os}" - -# We need flash-attn to speed up inference so we use a custom CUDA image with nvcc installed -whisper_image = ( - modal.Image.from_registry(f"nvidia/cuda:{tag}", add_python="3.11") - .apt_install("git", "ffmpeg") - .pip_install( - "transformers", "accelerate", "wheel", "ninja", "torch" - ) - .pip_install( - "flash-attn", extra_options="--no-build-isolation", - ) -) - -with whisper_image.imports(): - import torch - from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline - -@app.cls( - gpu="A10G", - image=whisper_image, - container_idle_timeout=600, - timeout=300, -) -class Whisper: - def __init__(self): - print("Initializing whisper transcriber") - pass - - @modal.build() - @modal.enter() - def load_model(self): - device = "cuda:0" if torch.cuda.is_available() else "cpu" - torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32 - model_id = "openai/whisper-large-v3" - model = AutoModelForSpeechSeq2Seq.from_pretrained( - model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True, attn_implementation="flash_attention_2" - ) - - model.to(device) - processor = AutoProcessor.from_pretrained(model_id) - - # store our whisper pipeline for later use - self.pipe = pipeline( - "automatic-speech-recognition", - model=model, - tokenizer=processor.tokenizer, - feature_extractor=processor.feature_extractor, - torch_dtype=torch_dtype, - device=device, - ) - - @modal.method() - def prewarm(self): - # no-op to prewarm whisper model instance - pass - - @modal.method() - def transcribe( - self, - audio_data: bytes, - ): - t0 = time.time() - result = self.pipe(audio_data) - print(f"Transcribed in {time.time() - t0:.2f}s") - return result["text"] - - -# For local testing, run `modal run -q src.whisper -@app.local_entrypoint() -def test_whisper(): - import os - from pathlib import Path - whisper = Whisper() - - # We have three sample audio files in the test-audio folder that we'll transcribe - files = os.listdir("tests/test-audio") - files.sort() - for file in files: - file = "tests/test-audio" / Path(file) - with open(file, "rb") as f: - audio_data = f.read() - result = whisper.transcribe.remote(audio_data) - print(result) \ No newline at end of file diff --git a/tests/moshi_client.py b/tests/moshi_client.py index e7506f0..0e9a88e 100644 --- a/tests/moshi_client.py +++ b/tests/moshi_client.py @@ -1,148 +1,175 @@ import asyncio +import queue import sys -import time - -try: - import sounddevice as sd - import websockets - import sphn - import numpy as np -except ImportError: - print("you need to run `pip install websockets sphn numpy sounddevice`") - -# Update this -endpoint = "wss://erik-dunteman--quillman-moshi-app-dev.modal.run/ws" - -async def run_pipeline(opus_writer, opus_reader): - last_recv = time.time() - received_data = False - silence_cutoff = 3 # seconds - print("Starting single response pipeline...") +import signal +import subprocess + +# External dependencies +import sphn +import aiohttp +import sounddevice as sd +import numpy as np + +profile = subprocess.run( + ["modal", "profile", "current"], check=True, capture_output=True, text=True +).stdout.splitlines()[0] + +app_name = "moshi" +class_name = "moshi" + +endpoint = f"wss://{profile}--{app_name}-{class_name}-app-dev.modal.run/ws" + +# Global flag for shutdown +shutdown_flag = asyncio.Event() + +# ANSI escape codes for colored text +GREEN = '\033[92m' +RESET = '\033[0m' + +# Connection manager +class Connection: + def __init__(self, ws): + self.ws = ws + self.sample_rate = 24000 + self.frame_size = 1920 + self.channels = 1 + + # The Opus audio codec is used for streaming audio to the websocket + # For spoken voice, it can compress as much as 10x, and can be decoded in real-time + self.opus_writer = sphn.OpusStreamWriter(self.sample_rate) + self.opus_reader = sphn.OpusStreamReader(self.sample_rate) + + self.audio_in_stream = sd.InputStream( + samplerate=self.sample_rate, + channels=self.channels, + blocksize=self.frame_size, + callback=self.audio_in_callback, + ) + + self.audio_out_stream = sd.OutputStream( + samplerate=self.sample_rate, + channels=self.channels, + blocksize=self.frame_size, + callback=self.audio_out_callback, + ) + self.out_queue = queue.Queue() + + # Sounddevice callbacks for handling raw audio to/from the speaker and mic + def audio_in_callback(self, data, frames, time, status): + self.opus_writer.append_pcm(data[:, 0]) + + def audio_out_callback(self, data, frames, time, status): + try: + pcm_data = self.out_queue.get(block=False) + assert pcm_data.shape == (self.frame_size,), pcm_data.shape + data[:, 0] = pcm_data + except queue.Empty: + data.fill(0) + + + + # Async loops for bidirectional audio streaming: + + async def send_loop(self): + ''' + Async loop for sending opus stream to the websocket + ''' + while not shutdown_flag.is_set(): + await asyncio.sleep(0.001) + msg = self.opus_writer.read_bytes() + if len(msg) > 0: + try: + await self.ws.send_bytes(msg) + except Exception as e: + print(f"Error in send_loop: {e}") + return + + async def receive_loop(self): + ''' + Async loop for receiving messages from the websocket, including text and opus stream + ''' + sentence = "" + try: + async for msg in self.ws: + if shutdown_flag.is_set(): + break + msg_bytes = msg.data + if not isinstance(msg_bytes, bytes) or len(msg_bytes) == 0: + continue + + # First byte in message is a tag, indicating audio or text. + tag = msg_bytes[0] + payload = msg_bytes[1:] + + if tag == 1: + # payload is opus audio + self.opus_reader.append_bytes(payload) + + elif tag == 2: + # payload is text output from the model, print it to the console + token = payload.decode("utf8") + sentence += token + sys.stdout.write(f"\r{GREEN}{sentence.lstrip()}{RESET}") + sys.stdout.flush() + if sentence.strip()[-1] in [".", "!", "?"]: + sys.stdout.write("\n") + sentence = "" + + except Exception as e: + print(f"Error in receive_loop: {e}") + + async def decoder_loop(self): + ''' + Async loop for decoding audio from the websocket into raw pcm audio, and queueing it for playback + ''' + + all_pcm_data = None + while not shutdown_flag.is_set(): + await asyncio.sleep(0.001) + pcm = self.opus_reader.read_pcm() + if all_pcm_data is None: + all_pcm_data = pcm + else: + all_pcm_data = np.concatenate((all_pcm_data, pcm)) + while all_pcm_data.shape[-1] >= self.frame_size: + self.out_queue.put(all_pcm_data[: self.frame_size]) + all_pcm_data = np.array(all_pcm_data[self.frame_size :]) + + + async def run(self): + try: + with self.audio_in_stream, self.audio_out_stream: + self.futures = asyncio.gather( + self.send_loop(), self.receive_loop(), self.decoder_loop() + ) + await self.futures + except asyncio.CancelledError: + print("Connection tasks cancelled") + +# Handle keyboard interrupts +def sigint_handler(signum, frame): + print("\n\nEnding conversation...") + shutdown_flag.set() + +async def run(): + signal.signal(signal.SIGINT, sigint_handler) + + print("Connecting to", endpoint) + print("This may trigger a cold boot of the model...\n") + async with aiohttp.ClientSession() as session: + try: + async with session.ws_connect(endpoint) as ws: + connection = Connection(ws) + print("Connection established.") + print("Conversation started. Press Ctrl+C to exit.\n") + await connection.run() + except aiohttp.ClientError as e: + print(f"Connection error: {e}") + +if __name__ == "__main__": try: - async with websockets.connect( - endpoint, - open_timeout=600, - ) as ws: - async def send_loop(): - while True: - await asyncio.sleep(0.001) - msg = opus_writer.read_bytes() - if len(msg) > 0: - await ws.send(msg) - - async def recv_loop(): - nonlocal last_recv, received_data, opus_reader - while True: - # note that opus_writer, on both client and server, send 47 + 53 bytes worth of header immediately - # so the first two recvs we receive are headers and not actual audio data. Useful headers, - # but just keep that in mind when it comes to debugging syncronization issues - data = await ws.recv() - opus_reader.append_bytes(data) - last_recv = time.time() - received_data = True - - - async def timeout_loop(): - while True: - await asyncio.sleep(0.1) - if received_data and time.time() - last_recv > silence_cutoff: - print(f"Server silent for {silence_cutoff}s, closing connection") - - # will cause a ConnectionClosedError, caught below - await ws.close() - - await asyncio.gather(send_loop(), recv_loop(), timeout_loop()) - - except (websockets.exceptions.ConnectionClosedError, websockets.exceptions.ConnectionClosedOK): - print("WebSocket connection closed") - -# helper functions -def wav_to_pcm(wav_path: str, sample_rate: int = 24000, frame_size: int = 1920): - pcm_data, file_sample_rate = sphn.read(wav_path) - if file_sample_rate != sample_rate: - pcm_data = sphn.resample(pcm_data, src_sample_rate=file_sample_rate, dst_sample_rate=sample_rate) - if len(pcm_data.shape) > 1: - pcm_data = np.mean(pcm_data, axis=0) - pcm_data = pcm_data.astype(np.float32) - return pcm_data - -def pcm_from_opus_reader(opus_reader): - pcm_data = np.array([]) - while True: - pcm = opus_reader.read_pcm() - if pcm.shape[0] == 0: - break - pcm_data = np.concatenate((pcm_data, pcm), axis=0) - pcm_data = pcm_data.astype(np.float32) - return pcm_data - -def get_user_mic_input(opus_writer, sample_rate, frame_size): - import sounddevice as sd - channels = 1 - def on_audio_input(in_data, frames, time, status): - assert in_data.shape == (frame_size, channels), in_data.shape - opus_writer.append_pcm(in_data[:, 0]) - in_stream = sd.InputStream( - samplerate=sample_rate, - channels=channels, - blocksize=frame_size, - callback=on_audio_input, - ) - # record for 10 seconds - with in_stream: - print("Starting recording...") - in_stream.start() - for i in range(10): - print(f"Recording for {10-i}s") - time.sleep(1) - in_stream.stop() - print("Recording complete. Awaiting model response.") - -def play_audio(pcm_data, sample_rate): - import sounddevice as sd - print("Starting playback...") - sd.play(pcm_data, sample_rate) - sd.wait() - print("Playback complete.") - -def get_demo_audio(opus_writer, sample_rate, frame_size): - demo_path = "./test-audio/user_input_chunk1.wav" - pcm_data = wav_to_pcm(demo_path) - for i in range(0, len(pcm_data), frame_size): - chunk = pcm_data[i:i+frame_size] - if len(chunk) < frame_size: - chunk = np.pad(chunk, (0, frame_size - len(chunk)), 'constant') - opus_writer.append_pcm(chunk) - -async def main(): - args = sys.argv[1:] - - sample_rate: float = 24000 - frame_size: int = 1920 - - interactive = False - if len(args) > 0: - if args[0] == "interactive": - interactive = True - - opus_writer = sphn.OpusStreamWriter(sample_rate) - opus_reader = sphn.OpusStreamReader(sample_rate) - - # Load up opus_writer with audio data - if interactive: - print("Running in interactive mode.") - get_user_mic_input(opus_writer, sample_rate, frame_size) - await run_pipeline(opus_writer, opus_reader) - pcm_data = pcm_from_opus_reader(opus_reader) - play_audio(pcm_data, sample_rate) - else: - print("Using demo audio.") - print("Run `python moshi_client.py interactive` to use interactive mode instead.") - get_demo_audio(opus_writer, sample_rate, frame_size) - await run_pipeline(opus_writer, opus_reader) - print("Saving output") - pcm_data = pcm_from_opus_reader(opus_reader) - sphn.write_wav("/tmp/moshi_out.wav", pcm_data, sample_rate) - print("Saved output to /tmp/moshi_out.wav") - -asyncio.run(main()) \ No newline at end of file + asyncio.run(run()) + except KeyboardInterrupt: + print("\nProgram interrupted") + finally: + print("Conversation complete") \ No newline at end of file From dd07cbfe78695e72a1a72fd0f22ab1166bdba86a Mon Sep 17 00:00:00 2001 From: erik-dunteman Date: Wed, 25 Sep 2024 20:14:04 -0700 Subject: [PATCH 10/35] frontend websocket finally integrated --- src/frontend/app.jsx | 100 +++++++++++++++++++++++++-------- src/frontend/index.html | 6 +- src/frontend/processor.js | 83 --------------------------- src/frontend/recorder-node.js | 25 --------- src/moshi.py | 7 ++- src/xtts.py | 102 ---------------------------------- tests/moshi_client.py | 2 +- tests/requirements.txt | 7 +-- 8 files changed, 90 insertions(+), 242 deletions(-) delete mode 100644 src/frontend/processor.js delete mode 100644 src/frontend/recorder-node.js delete mode 100644 src/xtts.py diff --git a/src/frontend/app.jsx b/src/frontend/app.jsx index b35c6db..5d2ac8c 100644 --- a/src/frontend/app.jsx +++ b/src/frontend/app.jsx @@ -1,38 +1,92 @@ const { useRef, useEffect, useState } = React; -import RecorderNode from "./recorder-node.js"; const baseURL = "" // points to whatever is serving this app (eg your -dev.modal.run for modal serve, or .modal.run for modal deploy) const App = () => { - const [amplitude, setAmplitude] = useState(0); - - const onAmplitude = (amplitude) => { - setAmplitude(amplitude); - } - - const setupAudio = async () => { - const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); - const audioContext = new AudioContext(); - const source = audioContext.createMediaStreamSource(stream); - await audioContext.audioWorklet.addModule("processor.js"); - const recorderNode = new RecorderNode( - audioContext, - onAmplitude, - ); - source.connect(recorderNode); - recorderNode.connect(audioContext.destination); - console.log("Audio setup complete"); - } + const socketRef = useRef(null); + // get permission to use microphone + const [hasPermission, setHasPermission] = useState(false); useEffect(() => { - setupAudio(); + (async () => { + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + setHasPermission(true); + })(); }, []); - + + // start recording + const startRecording = () => { + const recorder = new Recorder({ + encoderPath: "https://cdn.jsdelivr.net/npm/opus-recorder@latest/dist/encoderWorker.min.js", + streamPages: true, + encoderApplication: 2049, // todo investigate if needed + encoderFrameSize: 80, // milliseconds, equal to 1920 samples at 24000 Hz + encoderSampleRate: 24000, // 24000 on server + maxFramesPerPage: 1, // reduce to decrease chunk size, at cost of higher processing overhead + numberOfChannels: 1, + }); + + recorder.ondataavailable = async (arrayBuffer) => { + // Handle encoded audio data + // console.log("Received Opus data", arrayBuffer); + if (socketRef.current) { + if (socketRef.current.readyState !== WebSocket.OPEN) { + console.log("Socket not open, dropping audio"); + return; + } + console.log("stream up") + await socketRef.current.send(arrayBuffer); + } + }; + + // Start recording when needed + recorder.start().then(() => console.log("Recording started")); + }; + + // open websocket connection + useEffect(() => { + const endpoint = "wss://erik-dunteman--quillman-moshi-app-dev.modal.run/ws"; // todo make dynamic + console.log("Connecting to", endpoint); + const socket = new WebSocket(endpoint); + socketRef.current = socket; + + socket.onopen = () => { + startRecording(); + }; + + socket.onmessage = async (event) => { + // data is a blob, convert to array buffer + const arrayBuffer = await event.data.arrayBuffer(); + const view = new Uint8Array(arrayBuffer); + const tag = view[0]; + const payload = arrayBuffer.slice(1); + if (tag === 1) { + // audio data + // console.log("Received audio data", payload.byteLength, "bytes"); + } + if (tag === 2) { + // text data + const decoder = new TextDecoder(); + const text = decoder.decode(payload); + console.log("Received text data", text); + } + }; + + + socket.onclose = () => { + console.log("WebSocket connection closed"); + }; + + return () => { + socket.close(); + }; + }, []); + return (
- +

Chat

diff --git a/src/frontend/index.html b/src/frontend/index.html index 48b6ac2..5219842 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -12,9 +12,11 @@ - - + + + + - + + + +