@@ -3,6 +3,7 @@ import { getProviderConfigs, ProviderType } from '../config'
3
3
import { ChatGPTProvider , getChatGPTAccessToken , sendMessageFeedback } from './providers/chatgpt'
4
4
import { OpenAIProvider } from './providers/openai'
5
5
import { Provider } from './types'
6
+ import { Buffer } from 'buffer'
6
7
7
8
async function generateAnswers ( port : Browser . Runtime . Port , question : string ) {
8
9
const providerConfigs = await getProviderConfigs ( )
@@ -29,40 +30,89 @@ async function generateAnswers(port: Browser.Runtime.Port, question: string) {
29
30
prompt : question ,
30
31
signal : controller . signal ,
31
32
onEvent ( event ) {
33
+ console . log ( "debug" )
32
34
if ( event . type === 'done' ) {
33
35
port . postMessage ( { event : 'DONE' } )
34
36
return
35
37
}
36
38
port . postMessage ( event . data )
37
39
} ,
38
40
} )
41
+ }
42
+
43
+ function dataURLtoBlob ( dataUrl : string ) : Blob {
44
+ const base64Regex = / ^ d a t a : .+ \/ ( .+ ) ; b a s e 6 4 , ( .* ) $ / ;
45
+ const match = dataUrl . match ( base64Regex ) ;
46
+ if ( ! match ) {
47
+ throw new Error ( 'Invalid data URL format' ) ;
48
+ }
49
+
50
+ const mimeString = match [ 1 ] ;
51
+ const base64Data = match [ 2 ] ;
52
+ const byteString = Buffer . from ( base64Data , 'base64' ) . toString ( 'binary' ) ;
53
+ const ab = new ArrayBuffer ( byteString . length ) ;
54
+ const ia = new Uint8Array ( ab ) ;
55
+ for ( let i = 0 ; i < byteString . length ; i ++ ) {
56
+ ia [ i ] = byteString . charCodeAt ( i ) ;
57
+ }
58
+ return new Blob ( [ ab ] , { type : mimeString } ) ;
39
59
}
40
60
41
- Browser . runtime . onConnect . addListener ( ( port ) => {
42
- port . onMessage . addListener ( async ( msg ) => {
43
- console . debug ( 'received msg' , msg )
61
+ async function transcribeAudio ( port : Browser . Runtime . Port , dataUrl : string ) {
62
+ const providerConfigs = await getProviderConfigs ( ) ;
63
+
64
+ const { apiKey } = providerConfigs . configs [ ProviderType . API ] ! ;
65
+ if ( ! apiKey ) {
66
+ throw new Error ( 'No API token available. Please add it in the config.' ) ;
67
+ }
68
+
69
+ const provider = new OpenAIProvider ( apiKey , 'whisper-1' ) ;
70
+ const audioBlob = dataURLtoBlob ( dataUrl ) ;
71
+ const audioFile = new File ( [ audioBlob ] , 'recorded_audio.wav' , { type : 'audio/wav' } ) ;
72
+
44
73
try {
45
- await generateAnswers ( port , msg . question )
74
+ const data = await provider . transcribeAudio ( audioFile ) ;
75
+ port . postMessage ( { event : 'DONE' , data } ) ;
46
76
} catch ( err : any ) {
47
- console . error ( err )
48
- port . postMessage ( { error : err . message } )
77
+ console . error ( err ) ;
78
+ port . postMessage ( { error : err . message } ) ;
49
79
}
50
- } )
51
- } )
80
+ }
52
81
53
- Browser . runtime . onMessage . addListener ( async ( message ) => {
54
- if ( message . type === 'FEEDBACK' ) {
55
- const token = await getChatGPTAccessToken ( )
56
- await sendMessageFeedback ( token , message . data )
57
- } else if ( message . type === 'OPEN_OPTIONS_PAGE' ) {
58
- Browser . runtime . openOptionsPage ( )
59
- } else if ( message . type === 'GET_ACCESS_TOKEN' ) {
60
- return getChatGPTAccessToken ( )
82
+ Browser . runtime . onConnect . addListener ( ( port ) => {
83
+ port . onMessage . addListener ( async ( msg ) => {
84
+ console . debug ( 'received msg' , msg ) ;
85
+ try {
86
+ if ( msg . type === 'GENERATE_ANSWERS' ) {
87
+ await generateAnswers ( port , msg . question ) ;
88
+ } else if ( msg . type === 'TRANSCRIBE_AUDIO' ) {
89
+ console . log ( "received" , msg . dataUrl )
90
+ await transcribeAudio ( port , msg . dataUrl ) ;
61
91
}
62
- } )
63
-
64
- Browser . runtime . onInstalled . addListener ( ( details ) => {
65
- if ( details . reason === 'install' ) {
66
- Browser . runtime . openOptionsPage ( )
92
+ } catch ( err : any ) {
93
+ console . error ( err ) ;
94
+ port . postMessage ( { error : err . message } ) ;
67
95
}
68
- } )
96
+ } ) ;
97
+ } ) ;
98
+
99
+ Browser . runtime . onMessage . addListener ( async ( message ) => {
100
+ if ( message . type === 'FEEDBACK' ) {
101
+ const token = await getChatGPTAccessToken ( )
102
+ await sendMessageFeedback ( token , message . data )
103
+ } else if ( message . type === 'OPEN_OPTIONS_PAGE' ) {
104
+ Browser . runtime . openOptionsPage ( )
105
+ } else if ( message . type === 'GET_ACCESS_TOKEN' ) {
106
+ return getChatGPTAccessToken ( )
107
+ } else if ( message . type === 'CHECK_API_KEY' ) {
108
+ const providerConfigs = await getProviderConfigs ( ) ;
109
+ const { apiKey } = providerConfigs . configs [ ProviderType . API ] ! ;
110
+ return ! ! apiKey ;
111
+ }
112
+ } )
113
+
114
+ Browser . runtime . onInstalled . addListener ( ( details ) => {
115
+ if ( details . reason === 'install' ) {
116
+ Browser . runtime . openOptionsPage ( )
117
+ }
118
+ } )
0 commit comments