bugfix: removed audio output, not volume notify

This commit is contained in:
wataru 2023-03-25 21:36:03 +09:00
parent 61f485756d
commit b413eeea85
34 changed files with 536 additions and 2522 deletions

View File

@ -4,5 +4,6 @@ cd demo_v13 && ncu -u && npm install && npm run build:prod && cd -
cd demo_v15 && ncu -u && npm install && npm run build:prod && cd -
cd demo_so-vits-svc_40 && ncu -u && npm install && npm run build:prod && cd -
cd demo_so-vits-svc_40v2 && ncu -u && npm install && npm run build:prod && cd -
cd demo_so-vits-svc_40v2_tsukuyomi && ncu -u && npm install && npm run build:prod && cd -
cd demo_so-vits-svc_40v2_c && ncu -u && npm install && npm run build:prod && cd -
cd demo_DDSP-SVC && ncu -u && npm install && npm run build:prod && cd -

View File

@ -1,10 +1 @@
<!DOCTYPE html>
<html style="width: 100%; height: 100%; overflow: hidden">
<head>
<meta charset="utf-8" />
<title>Voice Changer Client Demo</title>
<script defer src="index.js"></script></head>
<body style="width: 100%; height: 100%; margin: 0px">
<div id="app" style="width: 100%; height: 100%"></div>
</body>
</html>
<!doctype html><html style="width:100%;height:100%;overflow:hidden"><head><meta charset="utf-8"/><title>Voice Changer Client Demo</title><script defer="defer" src="index.js"></script></head><body style="width:100%;height:100%;margin:0"><div id="app" style="width:100%;height:100%"></div></body></html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,31 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
/**
* @license React
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

View File

@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",
@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,13 +40,13 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
}
@ -3187,9 +3187,9 @@
}
},
"node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -3803,9 +3803,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@ -3826,9 +3826,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -8927,9 +8927,9 @@
}
},
"node_modules/prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@ -9401,9 +9401,9 @@
}
},
"node_modules/rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"dependencies": {
"glob": "^9.2.0"
@ -10655,9 +10655,9 @@
}
},
"node_modules/webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@ -13651,9 +13651,9 @@
}
},
"@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"requires": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -14164,9 +14164,9 @@
"dev": true
},
"@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"@types/prop-types": {
"version": "15.7.5",
@ -14187,9 +14187,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -17966,9 +17966,9 @@
"dev": true
},
"prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true
},
"prettier-linter-helpers": {
@ -18328,9 +18328,9 @@
"dev": true
},
"rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"requires": {
"glob": "^9.2.0"
@ -19254,9 +19254,9 @@
}
},
"webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",

View File

@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,18 +40,18 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",

View File

@ -262,6 +262,9 @@ export const useDeviceSetting = (): DeviceSettingState => {
}, [audioOutputForGUI, outputRecordingStarted, appState.workletNodeSetting.startOutputRecording, appState.workletNodeSetting.stopOutputRecording])
useEffect(() => {
const setAudioOutput = async () => {
const mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices();
[AUDIO_ELEMENT_FOR_PLAY_RESULT, AUDIO_ELEMENT_FOR_TEST_ORIGINAL, AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK].forEach(x => {
const audio = document.getElementById(x) as HTMLAudioElement
if (audio) {
@ -274,8 +277,14 @@ export const useDeviceSetting = (): DeviceSettingState => {
audio.volume = 0
}
} else {
// @ts-ignore
const audioOutputs = mediaDeviceInfos.filter(x => { return x.kind == "audiooutput" })
const found = audioOutputs.some(x => { return x.deviceId == audioOutputForGUI })
if (found) {
// @ts-ignore // 例外キャッチできないので事前にIDチェックが必要らしい。
audio.setSinkId(audioOutputForGUI)
} else {
console.warn("No audio output device. use default")
}
if (x == AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK) {
audio.volume = fileInputEchoback ? 1 : 0
} else {
@ -284,9 +293,12 @@ export const useDeviceSetting = (): DeviceSettingState => {
}
}
})
}
setAudioOutput()
}, [audioOutputForGUI])
useEffect(() => {
const loadCache = async () => {
const key = await getItem(INDEXEDDB_KEY_AUDIO_OUTPUT)

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",
@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,13 +40,13 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
}
@ -3187,9 +3187,9 @@
}
},
"node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -3803,9 +3803,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@ -3826,9 +3826,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -8927,9 +8927,9 @@
}
},
"node_modules/prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@ -9401,9 +9401,9 @@
}
},
"node_modules/rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"dependencies": {
"glob": "^9.2.0"
@ -10655,9 +10655,9 @@
}
},
"node_modules/webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@ -13651,9 +13651,9 @@
}
},
"@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"requires": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -14164,9 +14164,9 @@
"dev": true
},
"@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"@types/prop-types": {
"version": "15.7.5",
@ -14187,9 +14187,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -17966,9 +17966,9 @@
"dev": true
},
"prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true
},
"prettier-linter-helpers": {
@ -18328,9 +18328,9 @@
"dev": true
},
"rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"requires": {
"glob": "^9.2.0"
@ -19254,9 +19254,9 @@
}
},
"webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",

View File

@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,18 +40,18 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",

View File

@ -262,6 +262,9 @@ export const useDeviceSetting = (): DeviceSettingState => {
}, [audioOutputForGUI, outputRecordingStarted, appState.workletNodeSetting.startOutputRecording, appState.workletNodeSetting.stopOutputRecording])
useEffect(() => {
const setAudioOutput = async () => {
const mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices();
[AUDIO_ELEMENT_FOR_PLAY_RESULT, AUDIO_ELEMENT_FOR_TEST_ORIGINAL, AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK].forEach(x => {
const audio = document.getElementById(x) as HTMLAudioElement
if (audio) {
@ -274,8 +277,14 @@ export const useDeviceSetting = (): DeviceSettingState => {
audio.volume = 0
}
} else {
// @ts-ignore
const audioOutputs = mediaDeviceInfos.filter(x => { return x.kind == "audiooutput" })
const found = audioOutputs.some(x => { return x.deviceId == audioOutputForGUI })
if (found) {
// @ts-ignore // 例外キャッチできないので事前にIDチェックが必要らしい。
audio.setSinkId(audioOutputForGUI)
} else {
console.warn("No audio output device. use default")
}
if (x == AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK) {
audio.volume = fileInputEchoback ? 1 : 0
} else {
@ -284,9 +293,12 @@ export const useDeviceSetting = (): DeviceSettingState => {
}
}
})
}
setAudioOutput()
}, [audioOutputForGUI])
useEffect(() => {
const loadCache = async () => {
const key = await getItem(INDEXEDDB_KEY_AUDIO_OUTPUT)

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",
@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,13 +40,13 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
}
@ -3187,9 +3187,9 @@
}
},
"node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -3803,9 +3803,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@ -3826,9 +3826,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -8927,9 +8927,9 @@
}
},
"node_modules/prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@ -9401,9 +9401,9 @@
}
},
"node_modules/rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"dependencies": {
"glob": "^9.2.0"
@ -10655,9 +10655,9 @@
}
},
"node_modules/webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@ -13651,9 +13651,9 @@
}
},
"@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"requires": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -14164,9 +14164,9 @@
"dev": true
},
"@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"@types/prop-types": {
"version": "15.7.5",
@ -14187,9 +14187,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -17966,9 +17966,9 @@
"dev": true
},
"prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true
},
"prettier-linter-helpers": {
@ -18328,9 +18328,9 @@
"dev": true
},
"rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"requires": {
"glob": "^9.2.0"
@ -19254,9 +19254,9 @@
}
},
"webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",

View File

@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,18 +40,18 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",

View File

@ -262,6 +262,9 @@ export const useDeviceSetting = (): DeviceSettingState => {
}, [audioOutputForGUI, outputRecordingStarted, appState.workletNodeSetting.startOutputRecording, appState.workletNodeSetting.stopOutputRecording])
useEffect(() => {
const setAudioOutput = async () => {
const mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices();
[AUDIO_ELEMENT_FOR_PLAY_RESULT, AUDIO_ELEMENT_FOR_TEST_ORIGINAL, AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK].forEach(x => {
const audio = document.getElementById(x) as HTMLAudioElement
if (audio) {
@ -274,8 +277,14 @@ export const useDeviceSetting = (): DeviceSettingState => {
audio.volume = 0
}
} else {
// @ts-ignore
const audioOutputs = mediaDeviceInfos.filter(x => { return x.kind == "audiooutput" })
const found = audioOutputs.some(x => { return x.deviceId == audioOutputForGUI })
if (found) {
// @ts-ignore // 例外キャッチできないので事前にIDチェックが必要らしい。
audio.setSinkId(audioOutputForGUI)
} else {
console.warn("No audio output device. use default")
}
if (x == AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK) {
audio.volume = fileInputEchoback ? 1 : 0
} else {
@ -284,9 +293,12 @@ export const useDeviceSetting = (): DeviceSettingState => {
}
}
})
}
setAudioOutput()
}, [audioOutputForGUI])
useEffect(() => {
const loadCache = async () => {
const key = await getItem(INDEXEDDB_KEY_AUDIO_OUTPUT)

View File

@ -1,10 +1 @@
<!DOCTYPE html>
<html style="width: 100%; height: 100%; overflow: hidden">
<head>
<meta charset="utf-8" />
<title>Voice Changer Client Demo</title>
<script defer src="index.js"></script></head>
<body style="width: 100%; height: 100%; margin: 0px">
<div id="app" style="width: 100%; height: 100%"></div>
</body>
</html>
<!doctype html><html style="width:100%;height:100%;overflow:hidden"><head><meta charset="utf-8"/><title>Voice Changer Client Demo</title><script defer="defer" src="index.js"></script></head><body style="width:100%;height:100%;margin:0"><div id="app" style="width:100%;height:100%"></div></body></html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,31 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
/**
* @license React
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

View File

@ -9,8 +9,8 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@dannadori/psdanimator": "^1.0.16",
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/psdanimator": "^1.0.17",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",
@ -3188,18 +3188,18 @@
}
},
"node_modules/@dannadori/psdanimator": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/@dannadori/psdanimator/-/psdanimator-1.0.16.tgz",
"integrity": "sha512-leA8V8LY009RfpxijE3yCVoD1LVnLfb0O4zRZclOvTa6NitNCIO6Xe/3SfN1Rkq4zhaU3TRL6CMotS/vIFx2MA==",
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/@dannadori/psdanimator/-/psdanimator-1.0.17.tgz",
"integrity": "sha512-tJ6TVNV/7hOX8kCRSON7LJj4Pi5N/P0nY2cQZoOafdS5VQq/9KfS4sY2SvGAn/ses2FLjf7gjC1xq1UECivsOQ==",
"dependencies": {
"@dannadori/worker-manager": "^1.0.11",
"@webtoon/psd": "^0.3.0"
}
},
"node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -13671,18 +13671,18 @@
}
},
"@dannadori/psdanimator": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/@dannadori/psdanimator/-/psdanimator-1.0.16.tgz",
"integrity": "sha512-leA8V8LY009RfpxijE3yCVoD1LVnLfb0O4zRZclOvTa6NitNCIO6Xe/3SfN1Rkq4zhaU3TRL6CMotS/vIFx2MA==",
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/@dannadori/psdanimator/-/psdanimator-1.0.17.tgz",
"integrity": "sha512-tJ6TVNV/7hOX8kCRSON7LJj4Pi5N/P0nY2cQZoOafdS5VQq/9KfS4sY2SvGAn/ses2FLjf7gjC1xq1UECivsOQ==",
"requires": {
"@dannadori/worker-manager": "^1.0.11",
"@webtoon/psd": "^0.3.0"
}
},
"@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"requires": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",

View File

@ -51,8 +51,8 @@
"webpack-dev-server": "^4.13.1"
},
"dependencies": {
"@dannadori/psdanimator": "^1.0.16",
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/psdanimator": "^1.0.17",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",

View File

@ -262,6 +262,9 @@ export const useDeviceSetting = (): DeviceSettingState => {
}, [audioOutputForGUI, outputRecordingStarted, appState.workletNodeSetting.startOutputRecording, appState.workletNodeSetting.stopOutputRecording])
useEffect(() => {
const setAudioOutput = async () => {
const mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices();
[AUDIO_ELEMENT_FOR_PLAY_RESULT, AUDIO_ELEMENT_FOR_TEST_ORIGINAL, AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK].forEach(x => {
const audio = document.getElementById(x) as HTMLAudioElement
if (audio) {
@ -274,8 +277,14 @@ export const useDeviceSetting = (): DeviceSettingState => {
audio.volume = 0
}
} else {
// @ts-ignore
const audioOutputs = mediaDeviceInfos.filter(x => { return x.kind == "audiooutput" })
const found = audioOutputs.some(x => { return x.deviceId == audioOutputForGUI })
if (found) {
// @ts-ignore // 例外キャッチできないので事前にIDチェックが必要らしい。
audio.setSinkId(audioOutputForGUI)
} else {
console.warn("No audio output device. use default")
}
if (x == AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK) {
audio.volume = fileInputEchoback ? 1 : 0
} else {
@ -284,6 +293,8 @@ export const useDeviceSetting = (): DeviceSettingState => {
}
}
})
}
setAudioOutput()
}, [audioOutputForGUI])

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",
@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,13 +40,13 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
}
@ -3187,9 +3187,9 @@
}
},
"node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -3803,9 +3803,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@ -3826,9 +3826,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -8927,9 +8927,9 @@
}
},
"node_modules/prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@ -9401,9 +9401,9 @@
}
},
"node_modules/rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"dependencies": {
"glob": "^9.2.0"
@ -10655,9 +10655,9 @@
}
},
"node_modules/webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@ -13651,9 +13651,9 @@
}
},
"@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"requires": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -14164,9 +14164,9 @@
"dev": true
},
"@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"@types/prop-types": {
"version": "15.7.5",
@ -14187,9 +14187,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -17966,9 +17966,9 @@
"dev": true
},
"prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true
},
"prettier-linter-helpers": {
@ -18328,9 +18328,9 @@
"dev": true
},
"rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"requires": {
"glob": "^9.2.0"
@ -19254,9 +19254,9 @@
}
},
"webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",

View File

@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,18 +40,18 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",

View File

@ -262,6 +262,9 @@ export const useDeviceSetting = (): DeviceSettingState => {
}, [audioOutputForGUI, outputRecordingStarted, appState.workletNodeSetting.startOutputRecording, appState.workletNodeSetting.stopOutputRecording])
useEffect(() => {
const setAudioOutput = async () => {
const mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices();
[AUDIO_ELEMENT_FOR_PLAY_RESULT, AUDIO_ELEMENT_FOR_TEST_ORIGINAL, AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK].forEach(x => {
const audio = document.getElementById(x) as HTMLAudioElement
if (audio) {
@ -274,8 +277,14 @@ export const useDeviceSetting = (): DeviceSettingState => {
audio.volume = 0
}
} else {
// @ts-ignore
const audioOutputs = mediaDeviceInfos.filter(x => { return x.kind == "audiooutput" })
const found = audioOutputs.some(x => { return x.deviceId == audioOutputForGUI })
if (found) {
// @ts-ignore // 例外キャッチできないので事前にIDチェックが必要らしい。
audio.setSinkId(audioOutputForGUI)
} else {
console.warn("No audio output device. use default")
}
if (x == AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK) {
audio.volume = fileInputEchoback ? 1 : 0
} else {
@ -284,9 +293,12 @@ export const useDeviceSetting = (): DeviceSettingState => {
}
}
})
}
setAudioOutput()
}, [audioOutputForGUI])
useEffect(() => {
const loadCache = async () => {
const key = await getItem(INDEXEDDB_KEY_AUDIO_OUTPUT)

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",
@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,13 +40,13 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
}
@ -3187,9 +3187,9 @@
}
},
"node_modules/@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"dependencies": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -3803,9 +3803,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@ -3826,9 +3826,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -8885,9 +8885,9 @@
}
},
"node_modules/prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
@ -9359,9 +9359,9 @@
}
},
"node_modules/rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"dependencies": {
"glob": "^9.2.0"
@ -10655,9 +10655,9 @@
}
},
"node_modules/webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@ -13631,9 +13631,9 @@
}
},
"@dannadori/voice-changer-client-js": {
"version": "1.0.96",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.96.tgz",
"integrity": "sha512-4B8Ms7ojRXfr+547VtqO8WVrNUeadqaVYrhRmzSVlcWErqeytjYl4NivgODyFfZquQ4xrY9PjtQ7b+e46D8zRg==",
"version": "1.0.98",
"resolved": "https://registry.npmjs.org/@dannadori/voice-changer-client-js/-/voice-changer-client-js-1.0.98.tgz",
"integrity": "sha512-IQMmOpDO+Y3hb05OpqLm5HQHNQokiZdNdvwHIDy4luCJtuEhG/h6+nWJPXCkZB8ICqLnW5E+tvqTE2Yje2DUuQ==",
"requires": {
"@types/readable-stream": "^2.3.15",
"amazon-chime-sdk-js": "^3.11.0",
@ -14144,9 +14144,9 @@
"dev": true
},
"@types/node": {
"version": "18.15.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz",
"integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew=="
"version": "18.15.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz",
"integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A=="
},
"@types/prop-types": {
"version": "15.7.5",
@ -14167,9 +14167,9 @@
"dev": true
},
"@types/react": {
"version": "18.0.28",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
"integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
"version": "18.0.29",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.29.tgz",
"integrity": "sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -17914,9 +17914,9 @@
"dev": true
},
"prettier": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz",
"integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==",
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
"integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
"dev": true
},
"prettier-linter-helpers": {
@ -18276,9 +18276,9 @@
"dev": true
},
"rimraf": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
"integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
"integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
"dev": true,
"requires": {
"glob": "^9.2.0"
@ -19234,9 +19234,9 @@
}
},
"webpack": {
"version": "5.76.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
"integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"version": "5.76.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
"integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",

View File

@ -23,8 +23,8 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@types/node": "^18.15.5",
"@types/react": "^18.0.28",
"@types/node": "^18.15.9",
"@types/react": "^18.0.29",
"@types/react-dom": "^18.0.11",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
@ -40,18 +40,18 @@
"npm-run-all": "^4.1.5",
"postcss-loader": "^7.1.0",
"postcss-nested": "^6.0.1",
"prettier": "^2.8.6",
"rimraf": "^4.4.0",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"style-loader": "^3.3.2",
"ts-loader": "^9.4.2",
"tsconfig-paths": "^4.1.2",
"typescript": "^5.0.2",
"webpack": "^5.76.2",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
},
"dependencies": {
"@dannadori/voice-changer-client-js": "^1.0.96",
"@dannadori/voice-changer-client-js": "^1.0.98",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",

View File

@ -262,6 +262,9 @@ export const useDeviceSetting = (): DeviceSettingState => {
}, [audioOutputForGUI, outputRecordingStarted, appState.workletNodeSetting.startOutputRecording, appState.workletNodeSetting.stopOutputRecording])
useEffect(() => {
const setAudioOutput = async () => {
const mediaDeviceInfos = await navigator.mediaDevices.enumerateDevices();
[AUDIO_ELEMENT_FOR_PLAY_RESULT, AUDIO_ELEMENT_FOR_TEST_ORIGINAL, AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK].forEach(x => {
const audio = document.getElementById(x) as HTMLAudioElement
if (audio) {
@ -274,8 +277,14 @@ export const useDeviceSetting = (): DeviceSettingState => {
audio.volume = 0
}
} else {
// @ts-ignore
const audioOutputs = mediaDeviceInfos.filter(x => { return x.kind == "audiooutput" })
const found = audioOutputs.some(x => { return x.deviceId == audioOutputForGUI })
if (found) {
// @ts-ignore // 例外キャッチできないので事前にIDチェックが必要らしい。
audio.setSinkId(audioOutputForGUI)
} else {
console.warn("No audio output device. use default")
}
if (x == AUDIO_ELEMENT_FOR_TEST_CONVERTED_ECHOBACK) {
audio.volume = fileInputEchoback ? 1 : 0
} else {
@ -284,9 +293,12 @@ export const useDeviceSetting = (): DeviceSettingState => {
}
}
})
}
setAudioOutput()
}, [audioOutputForGUI])
useEffect(() => {
const loadCache = async () => {
const key = await getItem(INDEXEDDB_KEY_AUDIO_OUTPUT)

View File

@ -1,12 +1,12 @@
{
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.96",
"version": "1.0.98",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.96",
"version": "1.0.98",
"license": "ISC",
"dependencies": {
"@types/readable-stream": "^2.3.15",

View File

@ -1,6 +1,6 @@
{
"name": "@dannadori/voice-changer-client-js",
"version": "1.0.96",
"version": "1.0.98",
"description": "",
"main": "dist/index.js",
"directories": {

View File

@ -113,6 +113,7 @@ export class VoiceChangerClient {
}
if (typeof this.setting.audioInput == "string") {
try {
this.currentMediaStream = await navigator.mediaDevices.getUserMedia({
audio: {
deviceId: this.setting.audioInput,
@ -124,6 +125,11 @@ export class VoiceChangerClient {
noiseSuppression: this.setting.noiseSuppression
}
})
} catch (e) {
console.warn(e)
throw e
}
// this.currentMediaStream.getAudioTracks().forEach((x) => {
// console.log("MIC Setting(cap)", x.getCapabilities())
// console.log("MIC Setting(const)", x.getConstraints())

View File

@ -159,6 +159,7 @@ class VoiceChangerWorkletProcessor extends AudioWorkletProcessor {
if (voice) {
this.volume = this.calcVol(voice, this.volume)
const volumeResponse: VoiceChangerWorkletProcessorResponse = {
responseType: ResponseType.volume,
volume: this.volume

View File

@ -1,257 +0,0 @@
import sys
import os
if sys.platform.startswith('darwin'):
baseDir = [x for x in sys.path if x.endswith("Contents/MacOS")]
if len(baseDir) != 1:
print("baseDir should be only one ", baseDir)
sys.exit()
modulePath = os.path.join(baseDir[0], "DDSP-SVC")
sys.path.append(modulePath)
else:
sys.path.append("DDSP-SVC")
import io
from dataclasses import dataclass, asdict, field
from functools import reduce
import numpy as np
import torch
import onnxruntime
import pyworld as pw
import ddsp.vocoder as vo
import librosa
providers = ['OpenVINOExecutionProvider', "CUDAExecutionProvider", "DmlExecutionProvider", "CPUExecutionProvider"]
@dataclass
class DDSP_SVCSettings():
gpu: int = 0
dstId: int = 0
f0Detector: str = "dio" # dio or harvest
tran: int = 20
noiceScale: float = 0.3
predictF0: int = 0 # 0:False, 1:True
silentThreshold: float = 0.00001
extraConvertSize: int = 1024 * 32
clusterInferRatio: float = 0.1
framework: str = "PyTorch" # PyTorch or ONNX
pyTorchModelFile: str = ""
onnxModelFile: str = ""
configFile: str = ""
speakers: dict[str, int] = field(
default_factory=lambda: {}
)
# ↓mutableな物だけ列挙
intData = ["gpu", "dstId", "tran", "predictF0", "extraConvertSize"]
floatData = ["noiceScale", "silentThreshold", "clusterInferRatio"]
strData = ["framework", "f0Detector"]
class DDSP_SVC:
def __init__(self, params):
self.settings = DDSP_SVCSettings()
self.net_g = None
self.onnx_session = None
self.raw_path = io.BytesIO()
self.gpu_num = torch.cuda.device_count()
self.prevVol = 0
self.params = params
print("DDSP-SVC initialization:", params)
def loadModel(self, config: str, pyTorch_model_file: str = None, onnx_model_file: str = None, clusterTorchModel: str = None):
self.settings.configFile = config
# model
model, args = vo.load_model(pyTorch_model_file)
# hubert
self.model = model
self.args = args
vec_path = self.params["hubert"]
self.encoder = vo.Units_Encoder(
args.data.encoder,
vec_path,
args.data.encoder_sample_rate,
args.data.encoder_hop_size,
device="cpu")
# f0dec
self.f0_detector = vo.F0_Extractor(
self.settings.f0Detector,
44100,
512,
float(50),
float(1100))
return self.get_info()
def update_setteings(self, key: str, val: any):
if key == "onnxExecutionProvider" and self.onnx_session != None:
if val == "CUDAExecutionProvider":
if self.settings.gpu < 0 or self.settings.gpu >= self.gpu_num:
self.settings.gpu = 0
provider_options = [{'device_id': self.settings.gpu}]
self.onnx_session.set_providers(providers=[val], provider_options=provider_options)
else:
self.onnx_session.set_providers(providers=[val])
elif key in self.settings.intData:
setattr(self.settings, key, int(val))
if key == "gpu" and val >= 0 and val < self.gpu_num and self.onnx_session != None:
providers = self.onnx_session.get_providers()
print("Providers:", providers)
if "CUDAExecutionProvider" in providers:
provider_options = [{'device_id': self.settings.gpu}]
self.onnx_session.set_providers(providers=["CUDAExecutionProvider"], provider_options=provider_options)
elif key in self.settings.floatData:
setattr(self.settings, key, float(val))
elif key in self.settings.strData:
setattr(self.settings, key, str(val))
else:
return False
return True
def get_info(self):
data = asdict(self.settings)
data["onnxExecutionProviders"] = self.onnx_session.get_providers() if self.onnx_session != None else []
files = ["configFile", "pyTorchModelFile", "onnxModelFile"]
for f in files:
if data[f] != None and os.path.exists(data[f]):
data[f] = os.path.basename(data[f])
else:
data[f] = ""
return data
def get_processing_sampling_rate(self):
return 44100
def get_unit_f0(self, audio_buffer, tran):
if (self.settings.gpu < 0 or self.gpu_num == 0) or self.settings.framework == "ONNX":
dev = torch.device("cpu")
else:
dev = torch.device("cpu")
# dev = torch.device("cuda", index=self.settings.gpu)
wav_44k = audio_buffer
f0 = self.f0_detector.extract(wav_44k, uv_interp=True, device=dev)
f0 = torch.from_numpy(f0).float().to(dev).unsqueeze(-1).unsqueeze(0)
f0 = f0 * 2 ** (float(10) / 12)
# print("f0:", f0)
print("wav_44k:::", wav_44k)
c = self.encoder.encode(torch.from_numpy(audio_buffer).float().unsqueeze(0).to(dev), 44100, 512)
# print("c:", c)
return c, f0
def generate_input(self, newData: any, inputSize: int, crossfadeSize: int):
# newData = newData.astype(np.float32) / 32768.0
# newData = newData.astype(np.float32) / self.hps.data.max_wav_value
if hasattr(self, "audio_buffer"):
self.audio_buffer = np.concatenate([self.audio_buffer, newData], 0) # 過去のデータに連結
else:
self.audio_buffer = newData
convertSize = inputSize + crossfadeSize + self.settings.extraConvertSize
hop_size = int(self.args.data.block_size * 44100 / self.args.data.sampling_rate)
print("hopsize", hop_size)
if convertSize % hop_size != 0: # モデルの出力のホップサイズで切り捨てが発生するので補う。
convertSize = convertSize + (hop_size - (convertSize % hop_size))
print("convsize", convertSize)
self.audio_buffer = self.audio_buffer[-1 * convertSize:] # 変換対象の部分だけ抽出
crop = self.audio_buffer[-1 * (inputSize + crossfadeSize):-1 * (crossfadeSize)]
rms = np.sqrt(np.square(crop).mean(axis=0))
vol = max(rms, self.prevVol * 0.0)
self.prevVol = vol
c, f0 = self.get_unit_f0(self.audio_buffer, self.settings.tran)
return (c, f0, convertSize, vol)
def _onnx_inference(self, data):
if hasattr(self, "onnx_session") == False or self.onnx_session == None:
print("[Voice Changer] No onnx session.")
return np.zeros(1).astype(np.int16)
c = data[0]
f0 = data[1]
convertSize = data[2]
vol = data[3]
if vol < self.settings.silentThreshold:
return np.zeros(convertSize).astype(np.int16)
c, f0, uv = [x.numpy() for x in data]
audio1 = self.onnx_session.run(
["audio"],
{
"c": c,
"f0": f0,
"g": np.array([self.settings.dstId]).astype(np.int64),
"uv": np.array([self.settings.dstId]).astype(np.int64),
"predict_f0": np.array([self.settings.dstId]).astype(np.int64),
"noice_scale": np.array([self.settings.dstId]).astype(np.int64),
})[0][0, 0] * self.hps.data.max_wav_value
audio1 = audio1 * vol
result = audio1
return result
pass
def _pyTorch_inference(self, data):
if hasattr(self, "model") == False or self.model == None:
print("[Voice Changer] No pyTorch session.")
return np.zeros(1).astype(np.int16)
if self.settings.gpu < 0 or self.gpu_num == 0:
dev = torch.device("cpu")
else:
dev = torch.device("cpu")
# dev = torch.device("cuda", index=self.settings.gpu)
c = data[0]
f0 = data[1]
convertSize = data[2]
vol = data[3]
if vol < self.settings.silentThreshold:
return np.zeros(convertSize).astype(np.int16)
with torch.no_grad():
c.to(dev)
f0.to(dev)
vol = torch.from_numpy(np.array([vol] * c.shape[1])).float().to(dev).unsqueeze(-1).unsqueeze(0)
spk_id = torch.LongTensor(np.array([[1]])).to(dev)
# print("vol", vol)
print("input", c.shape, f0.shape)
seg_output, _, (s_h, s_n) = self.model(c, f0, vol, spk_id=spk_id)
seg_output = seg_output.squeeze().cpu().numpy()
print("SEG:", seg_output)
return seg_output
def inference(self, data):
if self.settings.framework == "ONNX":
audio = self._onnx_inference(data)
else:
audio = self._pyTorch_inference(data)
return audio
def destroy(self):
del self.net_g
del self.onnx_session