diff --git a/package.json b/package.json index aeb7c5eb..7b30e697 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "tauri": "tauri", "buildsite": "vite build --outDir dist", "updatePlugin": "tsc public/pluginApi.ts", - "runserver": "node server/node/server.cjs" + "runserver": "node server/node/server.cjs", + "sync": "node electron/sync", + "electron": "node electron/dist/electron" }, "dependencies": { "@adobe/css-tools": "4.3.2", diff --git a/src/ts/util.ts b/src/ts/util.ts index cda35077..4b364539 100644 --- a/src/ts/util.ts +++ b/src/ts/util.ts @@ -1,4 +1,4 @@ -import { get } from "svelte/store" +import { get, writable, type Writable } from "svelte/store" import type { Database, Message } from "./storage/database" import { DataBase } from "./storage/database" import { selectedCharID } from "./stores" @@ -371,4 +371,8 @@ export function getCurrentCharacter(){ const db = get(DataBase) const selectedChar = get(selectedCharID) return db.characters[selectedChar] +} + +export function toState(t:T):Writable{ + return writable(t) } \ No newline at end of file diff --git a/src/ts/voice.ts b/src/ts/voice.ts new file mode 100644 index 00000000..1a70653a --- /dev/null +++ b/src/ts/voice.ts @@ -0,0 +1,47 @@ +import { sleep } from "./util"; + +class voiceDetector{ + + private userMedia: MediaStream; + private audioContext: AudioContext; + private analyser: AnalyserNode; + private mediaRecorder: MediaRecorder; + private intervalID: number; + private audioChunks: { + data:Blob, + time: number + }[]; + + + async init() { + this.userMedia = await navigator.mediaDevices.getUserMedia({ audio: true }); + this.audioContext = new AudioContext(); + this.mediaRecorder = new MediaRecorder(this.userMedia); + this.analyser = this.audioContext.createAnalyser(); + const source = this.audioContext.createMediaStreamSource(this.userMedia); + source.connect(this.analyser); + this.audioChunks = []; + this.mediaRecorder.ondataavailable = (event) => { + this.audioChunks.push({ + data: event.data, + time: Date.now() + }); + }; + this.mediaRecorder.start(); + //analyze the audio volume every 100ms + let start = Date.now(); + this.analyser.fftSize = 2048; + this.intervalID = setInterval(() => { + const dataArray = new Uint8Array(this.analyser.frequencyBinCount); + this.analyser.getByteTimeDomainData(dataArray); + const volume = dataArray.reduce((acc, val) => acc + val, 0) / dataArray.length; + console.log(volume); + if (Date.now() - start > 10000) { + this.mediaRecorder.stop(); + clearInterval(this.intervalID); + } + }, 100) as any as number; + + } + +} \ No newline at end of file