WOHOOOOOOOO
This commit is contained in:
		
							parent
							
								
									1e05319266
								
							
						
					
					
						commit
						1fd916a3eb
					
				
					 3 changed files with 66 additions and 61 deletions
				
			
		| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
import React, { use, useEffect, useRef, useState } from "react";
 | 
			
		||||
import ConversationFrontend from "../components/ConversationFrontend";
 | 
			
		||||
import InputFrontend from "../components/InputFrontend";
 | 
			
		||||
import VoiceSend from "./voice_backend"
 | 
			
		||||
import { sendToVoiceRecognition } from "./voice_backend"
 | 
			
		||||
import { AudioRecorder } from "./AudioRecorder";
 | 
			
		||||
import axios from "axios";
 | 
			
		||||
import { resolve } from "path";
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,8 @@ const InputOutputBackend: React.FC = () => {
 | 
			
		|||
  const [accessToken, setAccessToken] = useState("")
 | 
			
		||||
  const postWorkerRef = useRef<Worker | null>(null)
 | 
			
		||||
  const getWorkerRef = useRef<Worker | null>(null)
 | 
			
		||||
  const [messages, setMessages] = useState<Message[]>([{ role: "system", 
 | 
			
		||||
  const [messages, setMessages] = useState<Message[]>([{
 | 
			
		||||
    role: "system",
 | 
			
		||||
    content: `You are in the timezone: ${timeZone}. 
 | 
			
		||||
    You use the time format ${timeFormat}. 
 | 
			
		||||
    You use the date format ${dateFormat} for all references of dates. 
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +47,7 @@ const InputOutputBackend: React.FC = () => {
 | 
			
		|||
    You will only answer in the language (you will receive the country code) ${preferredLanguage}. 
 | 
			
		||||
    But in the case the user specifically states to answer in an other language do that speaking in a
 | 
			
		||||
    nother language is not stating you should answer in that language. Additionally do not translate your answer into multiple languages`
 | 
			
		||||
  },{ role: "assistant", content: "Hello! How can I help you?" }])
 | 
			
		||||
  }, { role: "assistant", content: "Hello! How can I help you?" }])
 | 
			
		||||
  const [liveMessage, setLiveMessage] = useState("")
 | 
			
		||||
  const [inputMessage, setInputMessage] = useState<string>("")
 | 
			
		||||
  const [inputDisabled, setInputDisabled] = useState(false)
 | 
			
		||||
| 
						 | 
				
			
			@ -169,40 +170,46 @@ const InputOutputBackend: React.FC = () => {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const startRecording = async () => {
 | 
			
		||||
    const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
 | 
			
		||||
    const mediaRecorder = new MediaRecorder(stream)
 | 
			
		||||
    mediaRecorderRef.current = mediaRecorder
 | 
			
		||||
  const startRecording = async (): Promise<string> => {
 | 
			
		||||
    const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
 | 
			
		||||
    const mediaRecorder = new MediaRecorder(stream);
 | 
			
		||||
    mediaRecorderRef.current = mediaRecorder;
 | 
			
		||||
 | 
			
		||||
    audioChunks.current = []; // Initialize audio chunks
 | 
			
		||||
 | 
			
		||||
    // Create a promise that resolves when the onstop event is done
 | 
			
		||||
    const stopRecordingPromise = new Promise<string>((resolve) => {
 | 
			
		||||
      mediaRecorder.ondataavailable = (event) => {
 | 
			
		||||
      audioChunks.current.push(event.data)
 | 
			
		||||
    }
 | 
			
		||||
        audioChunks.current.push(event.data);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      mediaRecorder.onstop = async () => {
 | 
			
		||||
      const audioBlob = new Blob(audioChunks.current, { type: "audio/ogg" })
 | 
			
		||||
      audioChunks.current = []
 | 
			
		||||
      // console.log(audioBlob);
 | 
			
		||||
      // const url = URL.createObjectURL(audioBlob)
 | 
			
		||||
      // const audio = new Audio(url);
 | 
			
		||||
      // audio.play().catch(error => console.error("Error playing audio:", error));
 | 
			
		||||
        const audioBlob = new Blob(audioChunks.current, { type: "audio/ogg" });
 | 
			
		||||
        audioChunks.current = [];
 | 
			
		||||
 | 
			
		||||
      const remote = new VoiceSend()
 | 
			
		||||
      remote.sendToVoiceRecognition(audioBlob)
 | 
			
		||||
    }
 | 
			
		||||
        const text_voice = await sendToVoiceRecognition(audioBlob);
 | 
			
		||||
        console.log(text_voice);
 | 
			
		||||
        resolve(text_voice); // Resolve the promise with the recognized text
 | 
			
		||||
      };
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    mediaRecorder.start()
 | 
			
		||||
    setIsRecording(true)
 | 
			
		||||
  }
 | 
			
		||||
    mediaRecorder.start();
 | 
			
		||||
    setIsRecording(true);
 | 
			
		||||
 | 
			
		||||
    // Wait for the recording to stop and get the recognized text
 | 
			
		||||
    return stopRecordingPromise;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const stopRecording = () => {
 | 
			
		||||
    mediaRecorderRef.current?.stop()
 | 
			
		||||
    setIsRecording(false)
 | 
			
		||||
  }
 | 
			
		||||
    mediaRecorderRef.current?.stop();
 | 
			
		||||
    setIsRecording(false);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  const handleMicClick = () => {
 | 
			
		||||
  const handleMicClick = async () => {
 | 
			
		||||
    if (!isRecording) {
 | 
			
		||||
      startRecording();
 | 
			
		||||
      const recognizedText = await startRecording();
 | 
			
		||||
      setInputMessage(recognizedText); // Set the recognized text after recording
 | 
			
		||||
      console.log("Set!")
 | 
			
		||||
    } else {
 | 
			
		||||
      stopRecording();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,13 @@
 | 
			
		|||
import axios from "axios";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VoiceSend {
 | 
			
		||||
    sendToVoiceRecognition(audio_data: Blob) {
 | 
			
		||||
export const sendToVoiceRecognition = (audio_data: Blob): Promise<string> => {
 | 
			
		||||
    console.log("sending recording...");
 | 
			
		||||
 | 
			
		||||
    const formdata = new FormData()
 | 
			
		||||
    formdata.append("audio", audio_data)
 | 
			
		||||
 | 
			
		||||
        const dataSend = { option:"offline", type:"basic",audio:audio_data }
 | 
			
		||||
        axios.post("http://localhost:5000/interstellar_ai/api/voice_recognition", formdata)
 | 
			
		||||
    const dataSend = { option: "offline", type: "basic", audio: audio_data }
 | 
			
		||||
    return axios.post("http://localhost:5000/interstellar_ai/api/voice_recognition", formdata)
 | 
			
		||||
        .then((response) => {
 | 
			
		||||
            console.log(response.data)
 | 
			
		||||
            return response.data.response
 | 
			
		||||
| 
						 | 
				
			
			@ -17,10 +15,6 @@ class VoiceSend {
 | 
			
		|||
        .catch(error => {
 | 
			
		||||
            console.log("Error calling API:", error)
 | 
			
		||||
            postMessage({ status: 500 })
 | 
			
		||||
            return "Error"
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default VoiceSend;
 | 
			
		||||
| 
						 | 
				
			
			@ -6,13 +6,17 @@ interface InputProps {
 | 
			
		|||
  onSendClick: (message: string, override: boolean) => void;
 | 
			
		||||
  onMicClick: () => void;
 | 
			
		||||
  inputDisabled: boolean;
 | 
			
		||||
  isRecording:boolean
 | 
			
		||||
  isRecording: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const InputFrontend = React.forwardRef<HTMLDivElement, InputProps>(
 | 
			
		||||
  ({ message, onSendClick, onMicClick, inputDisabled, isRecording}, ref: ForwardedRef<HTMLDivElement>) => {
 | 
			
		||||
  ({ message, onSendClick, onMicClick, inputDisabled, isRecording }, ref: ForwardedRef<HTMLDivElement>) => {
 | 
			
		||||
    const [inputValue, setInputValue] = useState('');
 | 
			
		||||
 | 
			
		||||
    useEffect(() => {
 | 
			
		||||
      setInputValue(message);
 | 
			
		||||
    }, [message]);
 | 
			
		||||
 | 
			
		||||
    const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
 | 
			
		||||
      setInputValue(e.target.value);
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +44,7 @@ const InputFrontend = React.forwardRef<HTMLDivElement, InputProps>(
 | 
			
		|||
        <button type="button" onClick={() => onSendClick(inputValue, false)} disabled={inputDisabled ? true : false}>
 | 
			
		||||
          <img src="/img/send.svg" alt="send" />
 | 
			
		||||
        </button>
 | 
			
		||||
        <button className={`microphone-button ${isRecording ? "red": "var(--input-button-color)"}`} type="button" onClick={onMicClick}>
 | 
			
		||||
        <button className={`microphone-button ${isRecording ? "red" : "var(--input-button-color)"}`} type="button" onClick={onMicClick}>
 | 
			
		||||
          <img src="/img/microphone.svg" alt="microphone" />
 | 
			
		||||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue