notes; hook to LLM,
This commit is contained in:
parent
627b5badb2
commit
947956a37b
@ -2,7 +2,9 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { View, Text, Button } from 'react-native';
|
import { View, Text, Button } from 'react-native';
|
||||||
import Voice from '@react-native-voice/voice';
|
import Voice from '@react-native-voice/voice';
|
||||||
|
|
||||||
import Config from 'react-native-config';
|
import Config from 'react-native-config';
|
||||||
|
process.env.TTS_BACKEND_URL = Config.TTS_BACKEND_URL;
|
||||||
|
|
||||||
class VoiceHandler extends Component {
|
class VoiceHandler extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
@ -12,6 +14,7 @@ class VoiceHandler extends Component {
|
|||||||
started: '',
|
started: '',
|
||||||
results: [],
|
results: [],
|
||||||
isRecording: false,
|
isRecording: false,
|
||||||
|
isProcessing: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
Voice.onSpeechStart = this.onSpeechStart.bind(this);
|
Voice.onSpeechStart = this.onSpeechStart.bind(this);
|
||||||
@ -54,7 +57,7 @@ class VoiceHandler extends Component {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('There was an error starting voice recognition:', error);
|
console.error('There was an error starting voice recognition:', error);
|
||||||
this.setState({
|
this.setState({
|
||||||
isRecording: false,
|
isRecording: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -63,18 +66,68 @@ class VoiceHandler extends Component {
|
|||||||
await Voice.stop();
|
await Voice.stop();
|
||||||
this.setState({
|
this.setState({
|
||||||
isRecording: false,
|
isRecording: false,
|
||||||
|
isProcessing:true
|
||||||
});
|
});
|
||||||
// Assuming you have the audio data, send it to your backend
|
// Assuming you have the audio data, send it to your backend
|
||||||
this._sendAudioToBackend(this.state.results);
|
this._sendTranscribedTextToLLM(this.state.results.join(' '));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
async _sendTranscribedTextToLLM(transcribedText) {
|
||||||
|
|
||||||
|
const LLM_ENDPOINT = "http://192.168.0.11:11434/api/chat";
|
||||||
|
const model = "openhermes:latest";
|
||||||
|
const data = {
|
||||||
|
model: model,
|
||||||
|
messages: [{ role: "user", content: "I have a request: " + transcribedText }],
|
||||||
|
stream: false,
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
|
||||||
|
console.log('sending text to LLM at ', LLM_ENDPOINT, ": '", transcribedText, "'");
|
||||||
|
const response = await fetch(LLM_ENDPOINT, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const responseJson = await response.json();
|
||||||
|
if (responseJson.error) {
|
||||||
|
console.error("LLM Error:", responseJson.error);
|
||||||
|
// Handle error appropriately in your app
|
||||||
|
} else {
|
||||||
|
// Handle successful response
|
||||||
|
console.log('LLM Response:', responseJson.message);
|
||||||
|
// Update your app state or UI based on LLM response
|
||||||
|
this.setState(prevState => ({
|
||||||
|
results: [...prevState.results, responseJson.message.content], // Append the response to the existing results
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Handle HTTP errors
|
||||||
|
console.error("HTTP Error:", response.status);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Request failed:', error);
|
||||||
|
// Handle request error
|
||||||
|
}
|
||||||
|
|
||||||
|
finally{
|
||||||
|
this.setState({
|
||||||
|
isProcessing:false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
_sendAudioToBackend(results) {
|
_sendAudioToBackend(results) {
|
||||||
// Placeholder: Convert `results` or actual audio data to a format acceptable by your backend
|
// Placeholder: Convert `results` or actual audio data to a format acceptable by your backend
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
// formData.append('audio', {uri: 'path_to_audio_file', type: 'audio/x-m4a', name: 'audio.m4a'});
|
//formData.append('audio', {uri: 'path_to_audio_file', type: 'audio/x-m4a', name: 'audio.m4a'});
|
||||||
|
|
||||||
fetch(process.env.TTS_BACKEND_URL, {
|
fetch(process.env.TTS_BACKEND_URL, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: formData,
|
body: formData,
|
||||||
@ -82,13 +135,16 @@ class VoiceHandler extends Component {
|
|||||||
'Content-Type': 'multipart/form-data',
|
'Content-Type': 'multipart/form-data',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.then(response => response.text())
|
.then(response => response.text())
|
||||||
.then(body => {
|
.then(body => {
|
||||||
console.log('Audio sent to backend, response:', body);
|
console.log('Audio sent to backend, response:', body);
|
||||||
})
|
this.setState(prevState => ({
|
||||||
.catch(error => {
|
results: [...prevState.results, body], // Append the response to the existing results
|
||||||
console.error('Failed to send audio:', error);
|
}));
|
||||||
});
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Failed to send audio:', error);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
@ -97,6 +153,7 @@ class VoiceHandler extends Component {
|
|||||||
<Button
|
<Button
|
||||||
onPress={() => this.state.isRecording ? this._stopRecognizing() : this._startRecognizing()}
|
onPress={() => this.state.isRecording ? this._stopRecognizing() : this._startRecognizing()}
|
||||||
title={this.state.isRecording ? "Stop Recognizing" : "Start Recognizing"}
|
title={this.state.isRecording ? "Stop Recognizing" : "Start Recognizing"}
|
||||||
|
color={this.state.isRecording ? "red" : this.state.isProcessing ? "orange" : "blue"} // Change color based on state
|
||||||
/>
|
/>
|
||||||
<Text>Recognized: {this.state.recognized}</Text>
|
<Text>Recognized: {this.state.recognized}</Text>
|
||||||
<Text>Started: {this.state.started}</Text>
|
<Text>Started: {this.state.started}</Text>
|
||||||
|
@ -1 +1 @@
|
|||||||
7
|
9
|
||||||
|
@ -45,13 +45,16 @@ cd /home/androidusr/download && tar -xzf openjdk-21.0.2_linux-x64_bin.tar.gz -C
|
|||||||
export JAVA_HOME=/home/androidusr/jdk/jdk-21.0.2
|
export JAVA_HOME=/home/androidusr/jdk/jdk-21.0.2
|
||||||
export PATH=$JAVA_HOME/bin:$PATH
|
export PATH=$JAVA_HOME/bin:$PATH
|
||||||
source ~/.bashrc
|
source ~/.bashrc
|
||||||
# 17
|
# 17 once
|
||||||
tar -xzf jdk-17.0.8_linux-x64_bin.tar.gz -C /home/androidusr/jdk
|
cd ~/download
|
||||||
export JAVA_HOME=/home/androidusr/jdk/jdk-17.0.8
|
tar -xzf jdk-17.0.8_linux-x64_bin.tar.gz -C /home/androidusr/download
|
||||||
|
|
||||||
|
# run
|
||||||
|
export JAVA_HOME=/home/androidusr/download/jdk-17.0.8
|
||||||
export PATH=$JAVA_HOME/bin:$PATH
|
export PATH=$JAVA_HOME/bin:$PATH
|
||||||
source ~/.bashrc
|
source ~/.bashrc
|
||||||
|
cd /opt/android/tools/bin
|
||||||
|
yes | ./sdkmanager --licenses
|
||||||
|
|
||||||
cd /home/androidusr/tmp
|
cd /home/androidusr/tmp
|
||||||
npx react-native run-android
|
npx react-native run-android
|
||||||
@ -63,6 +66,10 @@ npm install @react-native-voice/voice
|
|||||||
react-native link @react-native-voice/voice
|
react-native link @react-native-voice/voice
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
# release
|
The SDK directory is not writable (/opt/android) >> sudo chown -R androidusr:androidusr /opt/android
|
||||||
cd android && ./gradlew assembleRelease
|
|
||||||
|
# release build
|
||||||
|
cd android
|
||||||
|
./gradlew assembleRelease
|
||||||
|
Loading…
x
Reference in New Issue
Block a user