{"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 for about two seconds. (We will give you a key word to identify the vowel, but you should produce only the vowel sound, not the whole word.) Try to produce the vowel in a way that feels natural and comfortable to you – we will use our measurements from this production as a baseline for any changes in resonance. \n    Everyone’s vowels will be a bit different depending on their dialect or language background. That’s OK!\n    When you are ready to produce the vowel, click “start” and sustain the vowel for about two seconds, then click “stop.”`, \"Follow the steps to record your voice.\", `You’re done with calibration! Now you can start practicing matching a target resonance. You will be asked what type of target you would like to match, such as slightly darker or moderately brighter.`];\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: 116,\n            columnNumber: 23\n          }, this),\n          onClick: () => handlePlayback(currentRecording),\n          children: \"Play\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 115,\n          columnNumber: 13\n        }, this), /*#__PURE__*/_jsxDEV(Button, {\n          icon: /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 123,\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: 122,\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: 139,\n          columnNumber: 33\n        }, this) : /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 139,\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: 138,\n        columnNumber: 11\n      }, this)\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 111,\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: 157,\n            columnNumber: 15\n          }, this))\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 155,\n          columnNumber: 11\n        }, this)\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 154,\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: 163,\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: 177,\n          columnNumber: 22\n        }, this)\n      }, {\n        title: 'Calibration'\n      }]\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 173,\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: 185,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Divider, {}, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 186,\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: 190,\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: 191,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 189,\n      columnNumber: 7\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 171,\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 for about two seconds. (We will give you a key word to identify the vowel, but you should produce only the vowel sound, not the whole word.) Try to produce the vowel in a way that feels natural and comfortable to you – we will use our measurements from this production as a baseline for any changes in resonance. \r\n    Everyone’s vowels will be a bit different depending on their dialect or language background. That’s OK!\r\n    When you are ready to produce the vowel, click “start” and sustain the vowel for about two seconds, then click “stop.”`,\r\n    \"Follow the steps to record your voice.\",\r\n    `You’re done with calibration! Now you can start practicing matching a target resonance. You will be asked what type of target you would like to match, such as slightly darker or moderately brighter.`\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":[]}