This is an innovative app built with React + Solana + Tencent Cloud TRTC + Pinata, allowing users to conduct real-time voice-modulated calls and mint their own voice recordings as unique NFTs stored on the Solana blockchain.
- 🔧 React
- 💸 Solana Web3
- 🔐 @solana/wallet-adapter
- 🧰 Metaplex UMI
- 🗂️ Pinata (IPFS)
- 📞 Tencent TRTC SDK (CallKit)
- 🧩 Ant Design
- WebRTC-based audio call using Tencent TRTC
- Users can speak in real-time with live voice-changing effects
- Supports multiple voice filters (e.g. male, female, loli, deep male voice, etc.)
- Voice-modulated conversations are recorded (user's own voice, not pre-recorded clips)
- Recordings are used to mint NFTs that capture unique voice moments
- Users can upload a custom cover image for the audio
- Audio and image files are uploaded to IPFS via Pinata
- A
metadata.jsonfile is automatically generated (including name, description, image, animation_url) - NFTs are minted on Solana Devnet using Metaplex UMI and sent to the user's Phantom wallet
- Users can connect their Phantom wallet
- View and manage all Voice NFTs minted via the app
src/
├── CallKit/ # Tencent TRTC SDK wrapper and voice modulation logic
├── components/
│ ├── Audio/RecordButton.tsx # Audio recording button component
│ ├── Common/UploadImage.tsx # Image upload component
│ └── Voice/NFTCard/NFTCard.tsx # NFT card component
├── services/
│ └── recordingService.ts # Local audio recording and storage logic
├── utils/
│ ├── ApiClient.ts # HTTP request utility
│ └── message.ts # Global message handler
└── pages/
└── VoiceNFTPage.tsx # Main page integrating call, record, upload, and mintingnpm installnpm run devIf the backend OpenAPI schema changes, regenerate the API client by following these steps:
cd src/apiopenapi-generator-cli generate \
-g typescript \
-i https://backend.mindfans.ai/voice-agent/test/api/openapi.json \
--additional-properties=useSingleRequestParameter=true,usePromises=true \
-o fe-client-typescriptSet the following environment variables in a .env file at the root of the project:
VITE_JWT="<your-Pinata-token>"
VITE_TUI_APP_ID=<your-tencent-trtc-app-id>
VITE_TUI_USER_SIG=<your-trtc-user-signature>
VITE_TUI_CUSTOM_SIG=<your-trtc-custom-signature>