Spaces:
Paused
Paused
Commit
·
73cbe81
1
Parent(s):
8a8c049
-refactor room
Browse files- Dockerfile +12 -52
- README.md +1 -5
- seamless_server/.DS_Store +0 -0
- seamless_server/models/.DS_Store +0 -0
- seamless_server/src/simuleval_transcoder.py +0 -2
- seamless_server/whl/seamless_communication-1.0.0-py3-none-any.whl +0 -0
- streaming-react-app/src/RoomConfig.tsx +5 -6
- streaming-react-app/src/StreamingInterface.tsx +34 -36
- streaming-react-app/src/react-xr/XRDialog.tsx +2 -2
- streaming-react-app/src/theme.ts +2 -2
Dockerfile
CHANGED
@@ -3,8 +3,6 @@ FROM node:20-alpine AS frontend
|
|
3 |
RUN apk add --no-cache libc6-compat
|
4 |
WORKDIR /app
|
5 |
|
6 |
-
ARG DUMMY_ARG=1
|
7 |
-
|
8 |
COPY streaming-react-app .
|
9 |
RUN \
|
10 |
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
@@ -47,55 +45,21 @@ RUN apt-get update && \
|
|
47 |
# gradio dependencies \
|
48 |
ffmpeg \
|
49 |
# fairseq2 dependencies \
|
|
|
|
|
50 |
libsndfile-dev && \
|
51 |
apt-get clean && \
|
52 |
rm -rf /var/lib/apt/lists/*
|
53 |
|
54 |
-
|
55 |
-
|
56 |
-
#
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
# echo "Contents of /usr/local/libpng/lib:" && ls /usr/local/libpng/lib && \
|
64 |
-
# # ls /usr/local/lib/libpng* &&\
|
65 |
-
# ldconfig &&\
|
66 |
-
# cd ..
|
67 |
-
# ENV LD_LIBRARY_PATH=/usr/local/libpng/lib:
|
68 |
-
|
69 |
-
# RUN wget http://www.ijg.org/files/jpegsrc.v9a.tar.gz &&\
|
70 |
-
# tar -xzvf jpegsrc.v9a.tar.gz &&\
|
71 |
-
# cd jpeg-9a &&\
|
72 |
-
# ./configure --prefix=/usr/local/libjpeg &&\
|
73 |
-
# make &&\
|
74 |
-
# make install
|
75 |
-
# RUN cd .. &&\
|
76 |
-
# echo "Contents of /usr/local/lib :" && ls /usr/local && \
|
77 |
-
# echo "Contents of /usr/local/libjpeg/lib :" && ls /usr/local/libjpeg/lib && \
|
78 |
-
# ls /usr/local/lib/libpng* &&\
|
79 |
-
# ldconfig
|
80 |
-
# # ENV LD_LIBRARY_PATH=/usr/local/libpng/lib:
|
81 |
-
|
82 |
-
# RUN wget libjpeg62-turbo_2.0.6-4_amd64.deb &&\
|
83 |
-
# tar -xzvf jpegsrc.v9a.tar.gz &&\
|
84 |
-
# cd jpeg-9a &&\
|
85 |
-
# ./configure --prefix=/usr/local/libjpeg &&\
|
86 |
-
# make &&\
|
87 |
-
# make install
|
88 |
-
# RUN cd .. &&\
|
89 |
-
# echo "Contents of /usr/local/lib :" && ls /usr/local && \
|
90 |
-
# echo "Contents of /usr/local/libjpeg/lib :" && ls /usr/local/libjpeg/lib && \
|
91 |
-
# ls /usr/local/lib/libpng* &&\
|
92 |
-
# ldconfig
|
93 |
-
# ENV LD_LIBRARY_PATH=/usr/local/libpng/lib:
|
94 |
-
|
95 |
-
# RUN apt-get update &&\
|
96 |
-
# apt-get -y install libjpeg62-turbo-dev &&\
|
97 |
-
# apt-get install libjpeg8 libbodfile1
|
98 |
-
|
99 |
RUN useradd -m -u 1000 user
|
100 |
USER user
|
101 |
ENV HOME=/home/user \
|
@@ -113,8 +77,7 @@ RUN pyenv install $PYTHON_VERSION && \
|
|
113 |
COPY --chown=user:user ./seamless_server ./seamless_server
|
114 |
# change dir since pip needs to seed whl folder
|
115 |
RUN cd seamless_server && \
|
116 |
-
pip install fairseq2
|
117 |
-
# pip install fairseq2 --pre --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/nightly/pt2.1.1/cu118 && \
|
118 |
pip install --no-cache-dir --upgrade -r requirements.txt
|
119 |
COPY --from=frontend /app/dist ./streaming-react-app/dist
|
120 |
|
@@ -124,10 +87,7 @@ RUN --mount=type=secret,id=HF_TOKEN,mode=0444,required=false \
|
|
124 |
huggingface-cli download meta-private/SeamlessExpressive pretssel_melhifigan_wm-final.pt --local-dir ./models/Seamless/ || echo "HF_TOKEN error" && \
|
125 |
ln -s $(readlink -f models/Seamless/pretssel_melhifigan_wm-final.pt) models/Seamless/pretssel_melhifigan_wm.pt || true;
|
126 |
|
127 |
-
USER root
|
128 |
-
RUN ln -s /usr/lib/x86_64-linux-gnu/libsox.so.3 /usr/lib/x86_64-linux-gnu/libsox.so
|
129 |
USER user
|
130 |
RUN ["chmod", "+x", "./run_docker.sh"]
|
131 |
CMD ./run_docker.sh
|
132 |
|
133 |
-
|
|
|
3 |
RUN apk add --no-cache libc6-compat
|
4 |
WORKDIR /app
|
5 |
|
|
|
|
|
6 |
COPY streaming-react-app .
|
7 |
RUN \
|
8 |
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
|
|
45 |
# gradio dependencies \
|
46 |
ffmpeg \
|
47 |
# fairseq2 dependencies \
|
48 |
+
libjpeg8-dev \
|
49 |
+
libpng-dev \
|
50 |
libsndfile-dev && \
|
51 |
apt-get clean && \
|
52 |
rm -rf /var/lib/apt/lists/*
|
53 |
|
54 |
+
USER root
|
55 |
+
RUN ln -s /usr/lib/x86_64-linux-gnu/libsox.so.3 /usr/lib/x86_64-linux-gnu/libsox.so
|
56 |
+
# install older versions libjpeg62-turbo and libpng15
|
57 |
+
RUN wget http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.1.5-2_amd64.deb && \
|
58 |
+
dpkg -i libjpeg62-turbo_2.1.5-2_amd64.deb && \
|
59 |
+
rm libjpeg62-turbo_2.1.5-2_amd64.deb
|
60 |
+
RUN wget https://master.dl.sourceforge.net/project/libpng/libpng15/1.5.30/libpng-1.5.30.tar.gz && \
|
61 |
+
tar -xvf libpng-1.5.30.tar.gz && cd libpng-1.5.30 && ./configure && make && make install && cd .. && rm -rf libpng-1.5.30.tar.gz libpng-1.5.30
|
62 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
RUN useradd -m -u 1000 user
|
64 |
USER user
|
65 |
ENV HOME=/home/user \
|
|
|
77 |
COPY --chown=user:user ./seamless_server ./seamless_server
|
78 |
# change dir since pip needs to seed whl folder
|
79 |
RUN cd seamless_server && \
|
80 |
+
pip install fairseq2 --pre --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/nightly/pt2.1.1/cu118 && \
|
|
|
81 |
pip install --no-cache-dir --upgrade -r requirements.txt
|
82 |
COPY --from=frontend /app/dist ./streaming-react-app/dist
|
83 |
|
|
|
87 |
huggingface-cli download meta-private/SeamlessExpressive pretssel_melhifigan_wm-final.pt --local-dir ./models/Seamless/ || echo "HF_TOKEN error" && \
|
88 |
ln -s $(readlink -f models/Seamless/pretssel_melhifigan_wm-final.pt) models/Seamless/pretssel_melhifigan_wm.pt || true;
|
89 |
|
|
|
|
|
90 |
USER user
|
91 |
RUN ["chmod", "+x", "./run_docker.sh"]
|
92 |
CMD ./run_docker.sh
|
93 |
|
|
README.md
CHANGED
@@ -10,10 +10,6 @@ models:
|
|
10 |
- facebook/seamless-streaming
|
11 |
---
|
12 |
|
13 |
-
# RESOURCES AWS
|
14 |
-
I use a g4 machine with 35GB of volume. You could delete the volume and create a new one and connect it to the instance when needed. Obv you'd need to re-pull the docker image.
|
15 |
-
The same is true for the elastic IP. Both the volume and the elastic IP costs me ~0.10$ per day, for an overall of ~0.22$. It does not make sense to keep them if you don't need to use it for a couple of months.
|
16 |
-
|
17 |
# Seamless Streaming demo
|
18 |
## Running on HF spaces
|
19 |
You can simply duplicate the space to run it.
|
@@ -71,4 +67,4 @@ To enable additional logging from uvicorn pass `--log-level debug` or `--log-lev
|
|
71 |
|
72 |
### Debuging
|
73 |
|
74 |
-
If you enable "Server Debug Flag" when starting streaming from the client, this enables extensive debug logging and it saves audio files in /debug folder.
|
|
|
10 |
- facebook/seamless-streaming
|
11 |
---
|
12 |
|
|
|
|
|
|
|
|
|
13 |
# Seamless Streaming demo
|
14 |
## Running on HF spaces
|
15 |
You can simply duplicate the space to run it.
|
|
|
67 |
|
68 |
### Debuging
|
69 |
|
70 |
+
If you enable "Server Debug Flag" when starting streaming from the client, this enables extensive debug logging and it saves audio files in /debug folder.
|
seamless_server/.DS_Store
CHANGED
Binary files a/seamless_server/.DS_Store and b/seamless_server/.DS_Store differ
|
|
seamless_server/models/.DS_Store
CHANGED
Binary files a/seamless_server/models/.DS_Store and b/seamless_server/models/.DS_Store differ
|
|
seamless_server/src/simuleval_transcoder.py
CHANGED
@@ -19,8 +19,6 @@ import traceback
|
|
19 |
import time
|
20 |
import random
|
21 |
import colorlog
|
22 |
-
import nltk
|
23 |
-
nltk.download('averaged_perceptron_tagger_eng')
|
24 |
|
25 |
from .speech_and_text_output import SpeechAndTextOutput
|
26 |
|
|
|
19 |
import time
|
20 |
import random
|
21 |
import colorlog
|
|
|
|
|
22 |
|
23 |
from .speech_and_text_output import SpeechAndTextOutput
|
24 |
|
seamless_server/whl/seamless_communication-1.0.0-py3-none-any.whl
ADDED
Binary file (204 kB). View file
|
|
streaming-react-app/src/RoomConfig.tsx
CHANGED
@@ -87,7 +87,6 @@ export default function RoomConfig({
|
|
87 |
'join_room',
|
88 |
clientID,
|
89 |
createNewRoom ? null : roomID,
|
90 |
-
true,
|
91 |
configObject,
|
92 |
(result) => {
|
93 |
console.log('join_room result:', result);
|
@@ -151,7 +150,7 @@ export default function RoomConfig({
|
|
151 |
return (
|
152 |
<Stack direction="column" spacing="12px">
|
153 |
<Stack direction="row" spacing="12px" sx={{alignItems: 'center'}}>
|
154 |
-
|
155 |
size="small"
|
156 |
label="Room Code"
|
157 |
variant="outlined"
|
@@ -168,9 +167,9 @@ export default function RoomConfig({
|
|
168 |
}
|
169 |
}}
|
170 |
sx={{width: '8em'}}
|
171 |
-
/>
|
172 |
|
173 |
-
|
174 |
<Button
|
175 |
variant="contained"
|
176 |
disabled={
|
@@ -181,7 +180,7 @@ export default function RoomConfig({
|
|
181 |
onClick={() => onJoinRoom(false)}>
|
182 |
{roomState?.room_id != null ? 'Update Roles' : 'Join Room'}
|
183 |
</Button>
|
184 |
-
</div>
|
185 |
|
186 |
{roomState?.room_id == null && (
|
187 |
<div>
|
@@ -193,7 +192,7 @@ export default function RoomConfig({
|
|
193 |
streamingStatus !== 'stopped'
|
194 |
}
|
195 |
onClick={() => onJoinRoom(true)}>
|
196 |
-
{'
|
197 |
</Button>
|
198 |
</div>
|
199 |
)}
|
|
|
87 |
'join_room',
|
88 |
clientID,
|
89 |
createNewRoom ? null : roomID,
|
|
|
90 |
configObject,
|
91 |
(result) => {
|
92 |
console.log('join_room result:', result);
|
|
|
150 |
return (
|
151 |
<Stack direction="column" spacing="12px">
|
152 |
<Stack direction="row" spacing="12px" sx={{alignItems: 'center'}}>
|
153 |
+
<TextField
|
154 |
size="small"
|
155 |
label="Room Code"
|
156 |
variant="outlined"
|
|
|
167 |
}
|
168 |
}}
|
169 |
sx={{width: '8em'}}
|
170 |
+
/>
|
171 |
|
172 |
+
<div>
|
173 |
<Button
|
174 |
variant="contained"
|
175 |
disabled={
|
|
|
180 |
onClick={() => onJoinRoom(false)}>
|
181 |
{roomState?.room_id != null ? 'Update Roles' : 'Join Room'}
|
182 |
</Button>
|
183 |
+
</div>
|
184 |
|
185 |
{roomState?.room_id == null && (
|
186 |
<div>
|
|
|
192 |
streamingStatus !== 'stopped'
|
193 |
}
|
194 |
onClick={() => onJoinRoom(true)}>
|
195 |
+
{'Create New Room'}
|
196 |
</Button>
|
197 |
</div>
|
198 |
)}
|
streaming-react-app/src/StreamingInterface.tsx
CHANGED
@@ -6,7 +6,7 @@ import FormControl from '@mui/material/FormControl';
|
|
6 |
import Select, {SelectChangeEvent} from '@mui/material/Select';
|
7 |
import MenuItem from '@mui/material/MenuItem';
|
8 |
import Stack from '@mui/material/Stack';
|
9 |
-
import seamlessLogoUrl from './assets/
|
10 |
import {
|
11 |
AgentCapabilities,
|
12 |
BaseResponse,
|
@@ -744,44 +744,42 @@ export default function StreamingInterface() {
|
|
744 |
src={seamlessLogoUrl}
|
745 |
className="header-icon-sra"
|
746 |
alt="Seamless Translation Logo"
|
747 |
-
height={
|
748 |
-
width={
|
749 |
/>
|
750 |
|
751 |
<div>
|
752 |
-
<Typography variant="h1" sx={{color: '#
|
753 |
-
|
754 |
-
</Typography>
|
755 |
-
<Typography variant="body2" sx={{color: '#800020'}}>
|
756 |
-
<span style={{ fontStyle: 'italic' }}>
|
757 |
-
Natale 2023
|
758 |
-
</span>
|
759 |
</Typography>
|
760 |
</div>
|
761 |
</div>
|
762 |
<div className="header-container-sra">
|
763 |
<div>
|
764 |
<Typography variant="body2" sx={{color: '#65676B'}}>
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
<br/>
|
769 |
Use headphones if you are both speaker and listener to prevent feedback.
|
770 |
<br/>
|
|
|
|
|
|
|
771 |
<br/>
|
772 |
-
<a target="_blank" rel="noopener noreferrer" href="https://
|
773 |
-
a research model and streaming quality works best if you pause
|
774 |
-
every couple of sentences. The real-time performance will degrade
|
775 |
-
if you try streaming multiple speakers at the same time.
|
776 |
-
<br/>
|
777 |
<br/>
|
778 |
-
|
|
|
|
|
|
|
|
|
|
|
779 |
</Typography>
|
780 |
</div>
|
781 |
</div>
|
782 |
<Stack spacing="22px" direction="column">
|
783 |
<Box>
|
784 |
-
|
785 |
roomState={roomState}
|
786 |
serverState={serverState}
|
787 |
streamingStatus={streamingStatus}
|
@@ -790,7 +788,7 @@ export default function StreamingInterface() {
|
|
790 |
// player to play eagerly, since currently the listener doesn't have any stop/start controls
|
791 |
bufferedSpeechPlayer.start();
|
792 |
}}
|
793 |
-
/>
|
794 |
|
795 |
{isListener && !isSpeaker && (
|
796 |
<Box
|
@@ -812,9 +810,9 @@ export default function StreamingInterface() {
|
|
812 |
<Divider />
|
813 |
|
814 |
<Stack spacing="12px" direction="column">
|
815 |
-
|
816 |
Model
|
817 |
-
</FormLabel>
|
818 |
<FormControl
|
819 |
disabled={
|
820 |
streamFixedConfigOptionsDisabled ||
|
@@ -822,10 +820,10 @@ export default function StreamingInterface() {
|
|
822 |
}
|
823 |
fullWidth
|
824 |
sx={{minWidth: '14em'}}>
|
825 |
-
|
826 |
Model
|
827 |
-
</InputLabel>
|
828 |
-
|
829 |
labelId="model-selector-input-label"
|
830 |
label="Model"
|
831 |
onChange={(e: SelectChangeEvent) => {
|
@@ -847,14 +845,14 @@ export default function StreamingInterface() {
|
|
847 |
{agent.name}
|
848 |
</MenuItem>
|
849 |
))}
|
850 |
-
</Select>
|
851 |
</FormControl>
|
852 |
|
853 |
</Stack>
|
854 |
|
855 |
<Stack spacing={0.5}>
|
856 |
<FormLabel id="output-modes-radio-group-label">
|
857 |
-
|
858 |
</FormLabel>
|
859 |
|
860 |
<Box sx={{paddingTop: 2, paddingBottom: 1}}>
|
@@ -919,7 +917,7 @@ export default function StreamingInterface() {
|
|
919 |
spacing={1}
|
920 |
alignItems="flex-start"
|
921 |
sx={{flexGrow: 1}}>
|
922 |
-
{
|
923 |
'expressive',
|
924 |
) && (
|
925 |
<FormControlLabel
|
@@ -939,7 +937,7 @@ export default function StreamingInterface() {
|
|
939 |
}
|
940 |
label="Expressive"
|
941 |
/>
|
942 |
-
)}
|
943 |
|
944 |
{isListener && (
|
945 |
<Box
|
@@ -963,10 +961,10 @@ export default function StreamingInterface() {
|
|
963 |
justifyContent="space-between">
|
964 |
<Box sx={{flex: 1}}>
|
965 |
<FormControl disabled={streamFixedConfigOptionsDisabled}>
|
966 |
-
|
967 |
Input Source
|
968 |
-
</FormLabel>
|
969 |
-
|
970 |
aria-labelledby="input-source-radio-group-label"
|
971 |
value={inputSource}
|
972 |
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
@@ -982,8 +980,8 @@ export default function StreamingInterface() {
|
|
982 |
control={<Radio />}
|
983 |
label={label}
|
984 |
/>
|
985 |
-
))}
|
986 |
-
|
987 |
</FormControl>
|
988 |
</Box>
|
989 |
|
|
|
6 |
import Select, {SelectChangeEvent} from '@mui/material/Select';
|
7 |
import MenuItem from '@mui/material/MenuItem';
|
8 |
import Stack from '@mui/material/Stack';
|
9 |
+
import seamlessLogoUrl from './assets/seamless.svg';
|
10 |
import {
|
11 |
AgentCapabilities,
|
12 |
BaseResponse,
|
|
|
744 |
src={seamlessLogoUrl}
|
745 |
className="header-icon-sra"
|
746 |
alt="Seamless Translation Logo"
|
747 |
+
height={24}
|
748 |
+
width={24}
|
749 |
/>
|
750 |
|
751 |
<div>
|
752 |
+
<Typography variant="h1" sx={{color: '#65676B'}}>
|
753 |
+
Seamless Translation
|
|
|
|
|
|
|
|
|
|
|
754 |
</Typography>
|
755 |
</div>
|
756 |
</div>
|
757 |
<div className="header-container-sra">
|
758 |
<div>
|
759 |
<Typography variant="body2" sx={{color: '#65676B'}}>
|
760 |
+
Welcome! This space is limited to one speaker at a time.
|
761 |
+
If using the live HF space, sharing room code to listeners on another
|
762 |
+
IP address may not work because it's running on different replicas.
|
|
|
763 |
Use headphones if you are both speaker and listener to prevent feedback.
|
764 |
<br/>
|
765 |
+
If max speakers reached, please duplicate the space <a target="_blank" rel="noopener noreferrer" href="https://huggingface.co/spaces/facebook/seamless-streaming?duplicate=true">here</a>.
|
766 |
+
In your duplicated space, join a room as speaker or listener (or both),
|
767 |
+
and share the room code to invite listeners.
|
768 |
<br/>
|
769 |
+
Check out the seamless_communication <a target="_blank" rel="noopener noreferrer" href="https://github.com/facebookresearch/seamless_communication/tree/main">README</a> for more information.
|
|
|
|
|
|
|
|
|
770 |
<br/>
|
771 |
+
SeamlessStreaming model is a research model and is not released
|
772 |
+
for production deployment. It is important to use a microphone with
|
773 |
+
noise cancellation (for e.g. a smartphone), otherwise you may see model hallucination on noises.
|
774 |
+
It works best if you pause every couple of sentences, or you may wish adjust the VAD threshold
|
775 |
+
in the model config. The real-time performance will degrade
|
776 |
+
if you try streaming multiple speakers at the same time.
|
777 |
</Typography>
|
778 |
</div>
|
779 |
</div>
|
780 |
<Stack spacing="22px" direction="column">
|
781 |
<Box>
|
782 |
+
<RoomConfig
|
783 |
roomState={roomState}
|
784 |
serverState={serverState}
|
785 |
streamingStatus={streamingStatus}
|
|
|
788 |
// player to play eagerly, since currently the listener doesn't have any stop/start controls
|
789 |
bufferedSpeechPlayer.start();
|
790 |
}}
|
791 |
+
/>
|
792 |
|
793 |
{isListener && !isSpeaker && (
|
794 |
<Box
|
|
|
810 |
<Divider />
|
811 |
|
812 |
<Stack spacing="12px" direction="column">
|
813 |
+
<FormLabel id="output-modes-radio-group-label">
|
814 |
Model
|
815 |
+
</FormLabel>
|
816 |
<FormControl
|
817 |
disabled={
|
818 |
streamFixedConfigOptionsDisabled ||
|
|
|
820 |
}
|
821 |
fullWidth
|
822 |
sx={{minWidth: '14em'}}>
|
823 |
+
<InputLabel id="model-selector-input-label">
|
824 |
Model
|
825 |
+
</InputLabel>
|
826 |
+
<Select
|
827 |
labelId="model-selector-input-label"
|
828 |
label="Model"
|
829 |
onChange={(e: SelectChangeEvent) => {
|
|
|
845 |
{agent.name}
|
846 |
</MenuItem>
|
847 |
))}
|
848 |
+
</Select>
|
849 |
</FormControl>
|
850 |
|
851 |
</Stack>
|
852 |
|
853 |
<Stack spacing={0.5}>
|
854 |
<FormLabel id="output-modes-radio-group-label">
|
855 |
+
Output
|
856 |
</FormLabel>
|
857 |
|
858 |
<Box sx={{paddingTop: 2, paddingBottom: 1}}>
|
|
|
917 |
spacing={1}
|
918 |
alignItems="flex-start"
|
919 |
sx={{flexGrow: 1}}>
|
920 |
+
{currentAgent?.dynamicParams?.includes(
|
921 |
'expressive',
|
922 |
) && (
|
923 |
<FormControlLabel
|
|
|
937 |
}
|
938 |
label="Expressive"
|
939 |
/>
|
940 |
+
)}
|
941 |
|
942 |
{isListener && (
|
943 |
<Box
|
|
|
961 |
justifyContent="space-between">
|
962 |
<Box sx={{flex: 1}}>
|
963 |
<FormControl disabled={streamFixedConfigOptionsDisabled}>
|
964 |
+
<FormLabel id="input-source-radio-group-label">
|
965 |
Input Source
|
966 |
+
</FormLabel>
|
967 |
+
<RadioGroup
|
968 |
aria-labelledby="input-source-radio-group-label"
|
969 |
value={inputSource}
|
970 |
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
|
|
980 |
control={<Radio />}
|
981 |
label={label}
|
982 |
/>
|
983 |
+
))}
|
984 |
+
</RadioGroup>
|
985 |
</FormControl>
|
986 |
</Box>
|
987 |
|
streaming-react-app/src/react-xr/XRDialog.tsx
CHANGED
@@ -64,7 +64,7 @@ export default function XRDialog(props: XRConfigProps) {
|
|
64 |
|
65 |
return (
|
66 |
<>
|
67 |
-
|
68 |
Enter AR Experience
|
69 |
</Button>
|
70 |
{isDialogOpen && (
|
@@ -85,7 +85,7 @@ export default function XRDialog(props: XRConfigProps) {
|
|
85 |
</IconButton>
|
86 |
<XRContent {...props} />
|
87 |
</Dialog>
|
88 |
-
)}
|
89 |
</>
|
90 |
);
|
91 |
}
|
|
|
64 |
|
65 |
return (
|
66 |
<>
|
67 |
+
<Button variant="contained" onClick={() => setIsDialogOpen(true)}>
|
68 |
Enter AR Experience
|
69 |
</Button>
|
70 |
{isDialogOpen && (
|
|
|
85 |
</IconButton>
|
86 |
<XRContent {...props} />
|
87 |
</Dialog>
|
88 |
+
)}
|
89 |
</>
|
90 |
);
|
91 |
}
|
streaming-react-app/src/theme.ts
CHANGED
@@ -2,12 +2,12 @@ import {createTheme} from '@mui/material/styles';
|
|
2 |
|
3 |
const themeObject = {
|
4 |
palette: {
|
5 |
-
background: {default: '#
|
6 |
primary: {
|
7 |
main: '#465A69',
|
8 |
},
|
9 |
info: {
|
10 |
-
main: '#
|
11 |
},
|
12 |
text: {primary: '#1C2A33'},
|
13 |
},
|
|
|
2 |
|
3 |
const themeObject = {
|
4 |
palette: {
|
5 |
+
background: {default: '#383838'},
|
6 |
primary: {
|
7 |
main: '#465A69',
|
8 |
},
|
9 |
info: {
|
10 |
+
main: '#0064E0',
|
11 |
},
|
12 |
text: {primary: '#1C2A33'},
|
13 |
},
|