react-transcribe
Version:
React component for speech-to-text transcription with silence detection
3 lines (2 loc) • 3.19 kB
JavaScript
import*as n from"react";import{useState as r,useRef as t,useEffect as e}from"react";import i,{useSpeechRecognition as c}from"react-speech-recognition";function o(n,r){(null==r||r>n.length)&&(r=n.length);for(var t=0,e=Array(r);t<r;t++)e[t]=n[t];return e}function u(n,r){return function(n){if(Array.isArray(n))return n}(n)||function(n,r){var t=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null!=t){var e,i,c,o,u=[],l=!0,a=!1;try{if(c=(t=t.call(n)).next,0===r){if(Object(t)!==t)return;l=!1}else for(;!(l=(e=c.call(t)).done)&&(u.push(e.value),u.length!==r);l=!0);}catch(n){a=!0,i=n}finally{try{if(!l&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(a)throw i}}return u}}(n,r)||function(n,r){if(n){if("string"==typeof n)return o(n,r);var t={}.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(n,r):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var l=function(o){var l=o.onSpeech,a=o.onSpeechToggle,s=o.children,f=o.silenceDuration,p=void 0===f?1e3:f,g=o.maxSilenceDuration,m=void 0===g?6e4:g,h=o.countdownThreshold,v=void 0===h?1e4:h,d=o.language,y=void 0===d?"en-US":d,b=c({transcribing:!0,clearTranscriptOnListen:!1}),S=b.transcript,T=b.listening,w=b.resetTranscript,L=b.browserSupportsSpeechRecognition,A=b.interimTranscript,C=u(r(!1),2),k=C[0],I=C[1],j=u(r(null),2),D=j[0],E=j[1],O=t(null),x=t(!1),M=t(null),R=t(null),U=n.useCallback((function(){i.stopListening().then((function(){null==a||a({isListening:!1,type:"device"})})).catch((function(n){console.error("Error stopping speech recognition:",n)}))}),[a]),F=n.useCallback((function(){if(x.current&&(x.current=!1,I(!1),!M.current)){var n=Date.now();M.current=setTimeout((function(){U()}),m),R.current=setInterval((function(){var r=Date.now()-n,t=Math.ceil((m-r)/1e3);t<=v/1e3&&E(t),r>=m&&(R.current&&clearInterval(R.current),E(null))}),1e3)}}),[v,m,U]),$=n.useCallback((function(){O.current&&clearTimeout(O.current),O.current=setTimeout(F,p),M.current&&(clearTimeout(M.current),M.current=null),R.current&&(clearInterval(R.current),R.current=null,E(null))}),[p,F]),q=n.useCallback((function(){i.startListening({continuous:!0,language:y}).then((function(){null==a||a({isListening:!0,type:"device"})})).catch((function(n){console.error("Error starting speech recognition:",n)}))}),[y,a]),z=n.useCallback((function(){T?U():q()}),[T,q,U]);if(e((function(){S&&!x.current?(x.current=!0,I(!0),$()):S&&$(),(A||S)&&(null==l||l({transcript:S,interimTranscript:A,resetTranscript:w}))}),[S,A,w,l,$]),e((function(){return function(){U()}}),[U]),!L)return null;var B={listening:T,isActivelySpeaking:k,silenceCountdown:D,transcript:S,interimTranscript:A,browserSupportsSpeechRecognition:L,resetTranscript:w,startListening:q,stopListening:U,toggleListening:z};return s?n.createElement(n.Fragment,null,"function"==typeof s?s(B):s):null};export{l as SpeechToText,l as default};
//# sourceMappingURL=index.esm.js.map