{"ast":null,"code":"var _jsxFileName = \"D:\\\\Project\\\\UC_Trains_Voice\\\\react-demo\\\\src\\\\gavt\\\\GavtCali.tsx\",\n  _s = $RefreshSig$();\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Divider, Steps, Breadcrumb, Button, message } from 'antd';\nimport { Link } from 'react-router-dom';\nimport { AudioOutlined, PlayCircleOutlined, PauseCircleOutlined } from '@ant-design/icons';\nimport { jsxDEV as _jsxDEV, Fragment as _Fragment } from \"react/jsx-dev-runtime\";\nconst stepsTitles = ['Instruction', 'Before You Start', 'Record Your Voice', 'Complete'];\nconst stepsDescriptions = [`This module will record your production of different vowel sounds so we can provide resonance targets customized to your voice. \n    If you do not want to complete this procedure right now, or if you experience any technical difficulty, you can use resonance targets derived from a published reference sample of cis women or men (under the “Reference Targets” tab). \n    It should take around five minutes to complete the customization process.`, \"To measure your resonance for a vowel, we want you to sustain JUST the vowel sound...\", \"Follow the steps to record your voice.\", \"Review and complete the calibration.\"];\nconst recordingSteps = [{\n  key: '/i/',\n  title: '“ee” like in “seed”'\n}, {\n  key: '/ɪ/',\n  title: '“ih” like in “hid”'\n}, {\n  key: '/ɛ/',\n  title: '“eh” like in “head”'\n}, {\n  key: '/æ/',\n  title: '“ae” like in “sad”  '\n}, {\n  key: '/ɑ/',\n  title: '“ah” like in “god”'\n}, {\n  key: '/ɔ/',\n  title: '“aw” like in “lawn”'\n}, {\n  key: '/ʌ/',\n  title: '“uh” like in “bud”'\n}, {\n  key: '/u/',\n  title: ' “ooh” like in “spoon” '\n}, {\n  key: '/ʊ/',\n  title: ' “oo” like in “good” '\n}];\nconst GavtCali = () => {\n  _s();\n  const [currentStep, setCurrentStep] = useState(0);\n  const [audioURLs, setAudioURLs] = useState({});\n  const [mediaRecorder, setMediaRecorder] = useState(null);\n  const [recordingStates, setRecordingStates] = useState({});\n  const activeRecordingStepKeyRef = useRef(null);\n  useEffect(() => {\n    async function setupRecorder() {\n      try {\n        const stream = await navigator.mediaDevices.getUserMedia({\n          audio: true\n        });\n        const recorder = new MediaRecorder(stream);\n        setMediaRecorder(recorder);\n        let audioChunks = []; // 初始化一个数组来收集音频数据块\n\n        recorder.ondataavailable = event => {\n          audioChunks.push(event.data); // 收集数据块\n        };\n        recorder.onstop = () => {\n          const audioBlob = new Blob(audioChunks, {\n            type: 'audio/mp4'\n          });\n          const newAudioURL = URL.createObjectURL(audioBlob);\n          console.log('Audio Blob:', audioBlob, 'Audio URL:', newAudioURL); // Debug output\n          const key = activeRecordingStepKeyRef.current;\n          if (key) {\n            setAudioURLs(prev => ({\n              ...prev,\n              [key]: newAudioURL\n            }));\n            console.log(`Recording for ${key} complete!`);\n          }\n          activeRecordingStepKeyRef.current = null;\n          audioChunks = []; // 清空数据块数组以备下次录音\n        };\n      } catch (error) {\n        console.error('Error setting up the media recorder:', error);\n      }\n    }\n    setupRecorder();\n    return () => {\n      mediaRecorder === null || mediaRecorder === void 0 ? void 0 : mediaRecorder.stream.getTracks().forEach(track => track.stop());\n    };\n  }, []);\n  const toggleRecording = key => {\n    console.log(`Toggling recording for ${key}...`);\n    const isRecording = recordingStates[key];\n    if (!isRecording && mediaRecorder) {\n      mediaRecorder.start();\n      setRecordingStates(prev => ({\n        ...prev,\n        [key]: true\n      }));\n      activeRecordingStepKeyRef.current = key; // 设置当前录音步骤键\n    } else if (isRecording && mediaRecorder) {\n      mediaRecorder.stop();\n      setRecordingStates(prev => ({\n        ...prev,\n        [key]: false\n      }));\n      message.info('Recording stopped!');\n    }\n  };\n  const handlePlayback = audioUrl => {\n    new Audio(audioUrl).play();\n  };\n  const renderRecordingControls = stepKey => {\n    const isRecording = recordingStates[stepKey];\n    const currentRecording = audioURLs[stepKey];\n    const anyRecordingActive = Object.values(recordingStates).some(state => state); // 检查是否有任何步骤正在录音\n\n    return /*#__PURE__*/_jsxDEV(\"div\", {\n      children: currentRecording ? /*#__PURE__*/_jsxDEV(_Fragment, {\n        children: [/*#__PURE__*/_jsxDEV(Button, {\n          icon: /*#__PURE__*/_jsxDEV(PlayCircleOutlined, {}, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 114,\n            columnNumber: 23\n          }, this),\n          onClick: () => handlePlayback(currentRecording),\n          children: \"Play\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 113,\n          columnNumber: 13\n        }, this), /*#__PURE__*/_jsxDEV(Button, {\n          icon: /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 121,\n            columnNumber: 23\n          }, this),\n          onClick: () => {\n            console.log(`Deleting recording for ${stepKey}`); // Debug output\n            setAudioURLs(prev => {\n              const newUrls = {\n                ...prev\n              };\n              delete newUrls[stepKey];\n              return newUrls;\n            });\n            setRecordingStates(prev => ({\n              ...prev,\n              [stepKey]: false\n            }));\n          },\n          children: \"Re-record\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 120,\n          columnNumber: 13\n        }, this)]\n      }, void 0, true) : /*#__PURE__*/_jsxDEV(Button, {\n        icon: isRecording ? /*#__PURE__*/_jsxDEV(PauseCircleOutlined, {}, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 137,\n          columnNumber: 33\n        }, this) : /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 137,\n          columnNumber: 59\n        }, this),\n        onClick: () => toggleRecording(stepKey),\n        shape: \"circle\",\n        type: isRecording ? \"default\" : \"primary\",\n        disabled: anyRecordingActive && !isRecording // 如果有其他步骤正在录音并且当前步骤没有录音，则禁用按钮\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 136,\n        columnNumber: 11\n      }, this)\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 109,\n      columnNumber: 9\n    }, this);\n  };\n  const renderStepContent = () => {\n    if (currentStep === 2) {\n      return /*#__PURE__*/_jsxDEV(\"div\", {\n        children: /*#__PURE__*/_jsxDEV(Steps, {\n          current: -1,\n          direction: \"vertical\",\n          children: recordingSteps.map(step => /*#__PURE__*/_jsxDEV(Steps.Step, {\n            title: step.title,\n            description: renderRecordingControls(step.key)\n          }, step.key, false, {\n            fileName: _jsxFileName,\n            lineNumber: 155,\n            columnNumber: 15\n          }, this))\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 153,\n          columnNumber: 11\n        }, this)\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 152,\n        columnNumber: 9\n      }, this);\n    } else {\n      return /*#__PURE__*/_jsxDEV(\"p\", {\n        children: stepsDescriptions[currentStep]\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 161,\n        columnNumber: 14\n      }, this);\n    }\n  };\n  const allRecordingsComplete = recordingSteps.every(step => audioURLs[step.key]);\n  return /*#__PURE__*/_jsxDEV(\"div\", {\n    style: {\n      display: 'flex',\n      flexDirection: 'column',\n      alignItems: 'center',\n      marginTop: '20px',\n      width: '80%'\n    },\n    children: [/*#__PURE__*/_jsxDEV(Breadcrumb, {\n      style: {\n        marginBottom: '20px',\n        alignSelf: 'start'\n      },\n      items: [{\n        title: /*#__PURE__*/_jsxDEV(Link, {\n          to: \"/gavt\",\n          children: \"Gavt Home\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 175,\n          columnNumber: 22\n        }, this)\n      }, {\n        title: 'Calibration'\n      }]\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 171,\n      columnNumber: 5\n    }, this), /*#__PURE__*/_jsxDEV(Steps, {\n      progressDot: true,\n      current: currentStep,\n      items: stepsTitles.map((title, index) => ({\n        key: index.toString(),\n        title\n      }))\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 183,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Divider, {}, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 184,\n      columnNumber: 7\n    }, this), renderStepContent(), /*#__PURE__*/_jsxDEV(\"div\", {\n      style: {\n        marginTop: '20px'\n      },\n      children: [/*#__PURE__*/_jsxDEV(Button, {\n        disabled: currentStep === 0,\n        onClick: () => setCurrentStep(currentStep - 1),\n        children: \"Previous\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 188,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(Button, {\n        type: \"primary\",\n        onClick: () => setCurrentStep(currentStep + 1),\n        disabled: currentStep === stepsTitles.length - 1 || currentStep === 2 && !allRecordingsComplete,\n        children: currentStep === stepsTitles.length - 1 ? 'Finish' : 'Next'\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 189,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 187,\n      columnNumber: 7\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 169,\n    columnNumber: 5\n  }, this);\n};\n_s(GavtCali, \"clcd3zk4Oun9UthA2TrzSkUdue4=\");\n_c = GavtCali;\nexport default GavtCali;\nvar _c;\n$RefreshReg$(_c, \"GavtCali\");","map":{"version":3,"names":["React","useState","useEffect","useRef","Divider","Steps","Breadcrumb","Button","message","Link","AudioOutlined","PlayCircleOutlined","PauseCircleOutlined","jsxDEV","_jsxDEV","Fragment","_Fragment","stepsTitles","stepsDescriptions","recordingSteps","key","title","GavtCali","_s","currentStep","setCurrentStep","audioURLs","setAudioURLs","mediaRecorder","setMediaRecorder","recordingStates","setRecordingStates","activeRecordingStepKeyRef","setupRecorder","stream","navigator","mediaDevices","getUserMedia","audio","recorder","MediaRecorder","audioChunks","ondataavailable","event","push","data","onstop","audioBlob","Blob","type","newAudioURL","URL","createObjectURL","console","log","current","prev","error","getTracks","forEach","track","stop","toggleRecording","isRecording","start","info","handlePlayback","audioUrl","Audio","play","renderRecordingControls","stepKey","currentRecording","anyRecordingActive","Object","values","some","state","children","icon","fileName","_jsxFileName","lineNumber","columnNumber","onClick","newUrls","shape","disabled","renderStepContent","direction","map","step","Step","description","allRecordingsComplete","every","style","display","flexDirection","alignItems","marginTop","width","marginBottom","alignSelf","items","to","progressDot","index","toString","length","_c","$RefreshReg$"],"sources":["D:/Project/UC_Trains_Voice/react-demo/src/gavt/GavtCali.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\r\nimport { Divider, Steps, Breadcrumb, Button, message } from 'antd';\r\nimport { Link } from 'react-router-dom';\r\nimport { AudioOutlined, PlayCircleOutlined, PauseCircleOutlined } from '@ant-design/icons';\r\n\r\nconst stepsTitles = [\r\n  'Instruction',\r\n  'Before You Start',\r\n  'Record Your Voice',\r\n  'Complete'\r\n];\r\n\r\nconst stepsDescriptions = [\r\n    `This module will record your production of different vowel sounds so we can provide resonance targets customized to your voice. \r\n    If you do not want to complete this procedure right now, or if you experience any technical difficulty, you can use resonance targets derived from a published reference sample of cis women or men (under the “Reference Targets” tab). \r\n    It should take around five minutes to complete the customization process.`,\r\n    \"To measure your resonance for a vowel, we want you to sustain JUST the vowel sound...\",\r\n    \"Follow the steps to record your voice.\",\r\n    \"Review and complete the calibration.\"\r\n];\r\n\r\nconst recordingSteps = [\r\n  { key: '/i/', title: '“ee” like in “seed”' },\r\n  { key: '/ɪ/', title: '“ih” like in “hid”' },\r\n  { key: '/ɛ/', title: '“eh” like in “head”' },\r\n  { key: '/æ/', title: '“ae” like in “sad”  ' },\r\n  { key: '/ɑ/', title: '“ah” like in “god”' },\r\n  { key: '/ɔ/', title: '“aw” like in “lawn”' },\r\n  { key: '/ʌ/', title: '“uh” like in “bud”' },\r\n  { key: '/u/', title: ' “ooh” like in “spoon” ' },\r\n  { key: '/ʊ/', title: ' “oo” like in “good” ' }\r\n];\r\n\r\ninterface AudioURLs {\r\n  [key: string]: string;\r\n}\r\n\r\nconst GavtCali: React.FC = () => {\r\n  const [currentStep, setCurrentStep] = useState(0);\r\n  const [audioURLs, setAudioURLs] = useState<AudioURLs>({});\r\n  const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);\r\n  const [recordingStates, setRecordingStates] = useState<Record<string, boolean>>({});\r\n  const activeRecordingStepKeyRef = useRef<string | null>(null);\r\n\r\n\r\n  useEffect(() => {\r\n    async function setupRecorder() {\r\n      try {\r\n        const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\r\n        const recorder = new MediaRecorder(stream);\r\n        setMediaRecorder(recorder);\r\n  \r\n        let audioChunks: BlobPart[] = [];// 初始化一个数组来收集音频数据块\r\n  \r\n        recorder.ondataavailable = (event: BlobEvent) => {\r\n          audioChunks.push(event.data); // 收集数据块\r\n        };\r\n  \r\n        recorder.onstop = () => {\r\n            const audioBlob = new Blob(audioChunks, { type: 'audio/mp4' });\r\n            const newAudioURL = URL.createObjectURL(audioBlob);\r\n            console.log('Audio Blob:', audioBlob, 'Audio URL:', newAudioURL); // Debug output\r\n            const key = activeRecordingStepKeyRef.current;\r\n            if (key) {\r\n              setAudioURLs(prev => ({ ...prev, [key]: newAudioURL }));\r\n              console.log(`Recording for ${key} complete!`);\r\n            }\r\n            activeRecordingStepKeyRef.current = null;\r\n            audioChunks = []; // 清空数据块数组以备下次录音\r\n          };\r\n      } catch (error) {\r\n        console.error('Error setting up the media recorder:', error);\r\n      }\r\n    }\r\n  \r\n    setupRecorder();\r\n  \r\n    return () => {\r\n      mediaRecorder?.stream.getTracks().forEach(track => track.stop());\r\n    };\r\n  }, []); \r\n\r\n  const toggleRecording = (key: string) => {\r\n    console.log(`Toggling recording for ${key}...`)\r\n    const isRecording = recordingStates[key];\r\n\r\n    if (!isRecording && mediaRecorder) {\r\n      mediaRecorder.start();\r\n      setRecordingStates(prev => ({ ...prev, [key]: true }));\r\n      activeRecordingStepKeyRef.current = key; // 设置当前录音步骤键\r\n    } else if (isRecording && mediaRecorder) {\r\n      mediaRecorder.stop();\r\n      setRecordingStates(prev => ({ ...prev, [key]: false }));\r\n      \r\n      message.info('Recording stopped!');\r\n    }\r\n  };\r\n\r\n  const handlePlayback = (audioUrl: string) => {\r\n    new Audio(audioUrl).play();\r\n  };\r\n\r\n  const renderRecordingControls = (stepKey: string) => {\r\n    const isRecording = recordingStates[stepKey];\r\n    const currentRecording = audioURLs[stepKey];\r\n    const anyRecordingActive = Object.values(recordingStates).some(state => state); // 检查是否有任何步骤正在录音\r\n\r\n    return (\r\n        <div>\r\n        {currentRecording ? (\r\n          <>\r\n            {/* 回放按钮 */}\r\n            <Button\r\n                icon={<PlayCircleOutlined />}\r\n                onClick={() => handlePlayback(currentRecording)}\r\n            >\r\n              Play\r\n            </Button>\r\n            {/* 重录按钮 */}\r\n            <Button\r\n                icon={<AudioOutlined />}\r\n                onClick={() => {\r\n                    console.log(`Deleting recording for ${stepKey}`); // Debug output\r\n                    setAudioURLs(prev => {\r\n                        const newUrls = { ...prev };\r\n                        delete newUrls[stepKey];\r\n                        return newUrls;\r\n                    });\r\n                    setRecordingStates(prev => ({ ...prev, [stepKey]: false }));\r\n                }}\r\n            >\r\n              Re-record\r\n            </Button>\r\n          </>\r\n        ) : (\r\n          <Button\r\n            icon={isRecording ? <PauseCircleOutlined /> : <AudioOutlined />}\r\n            onClick={() => toggleRecording(stepKey)}\r\n            shape='circle'\r\n            type={isRecording ? \"default\" : \"primary\"}\r\n            disabled={anyRecordingActive && !isRecording} // 如果有其他步骤正在录音并且当前步骤没有录音，则禁用按钮\r\n          >\r\n          </Button>\r\n        )}\r\n      </div>\r\n    );\r\n  };\r\n\r\n  const renderStepContent = () => {\r\n    if (currentStep === 2) {\r\n      return (\r\n        <div>\r\n          <Steps current={-1} direction=\"vertical\">\r\n            {recordingSteps.map(step => (\r\n              <Steps.Step key={step.key} title={step.title} description={renderRecordingControls(step.key)} />\r\n            ))}\r\n          </Steps>\r\n        </div>\r\n      );\r\n    } else {\r\n      return <p>{stepsDescriptions[currentStep]}</p>;\r\n    }\r\n  };\r\n\r\n  const allRecordingsComplete = recordingSteps.every(step => audioURLs[step.key])\r\n\r\n  return (\r\n\r\n    <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginTop: '20px', width: '80%' }}>\r\n\r\n    <Breadcrumb\r\n        style={{ marginBottom: '20px', alignSelf: 'start' }}\r\n        items={[\r\n            {\r\n              title: <Link to=\"/gavt\">Gavt Home</Link>,\r\n            },\r\n            {\r\n              title:'Calibration',\r\n            }\r\n          ]}\r\n      />\r\n\r\n      <Steps progressDot current={currentStep} items={stepsTitles.map((title, index) => ({ key: index.toString(), title }))} />\r\n      <Divider />\r\n      {renderStepContent()}\r\n\r\n      <div style={{ marginTop: '20px' }}>\r\n        <Button disabled={currentStep === 0} onClick={() => setCurrentStep(currentStep - 1)}>Previous</Button>\r\n        <Button type=\"primary\" onClick={() => setCurrentStep(currentStep + 1)} disabled={currentStep === stepsTitles.length - 1 || (currentStep === 2 && !allRecordingsComplete) }>\r\n          {currentStep === stepsTitles.length - 1 ? 'Finish' : 'Next'}\r\n        </Button>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default GavtCali;\r\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}