This is the initial Flutter implementation of the Comparative Wordlist Elicitation Tool for linguistic fieldwork.
This app is designed to assist linguists, fieldworkers, and community members in the systematic elicitation and documentation of minority languages through the collection of comparative wordlists.
- XML Import: Import Dekereke XML wordlist files
- Local Storage: SQLite database for persistent storage using
sqflite - Session Tracking: Track progress through wordlist entries
- Export: Export collected data as ZIP archive containing:
- Dekereke XML with transcriptions
- Audio recordings (WAV format)
- Consent log (JSON format)
- Simple, Visual UI: Large buttons and high-contrast design
- Localization Support: Framework ready for multiple languages
- IPA Input: Text fields compatible with IPA characters
- Progress Tracking: Visual progress indicators
- High-Quality Recording: WAV format audio capture
- Easy Controls: Large, recognizable recording button
- Playback: Instant audio review capability
- Proper Naming: Audio files named as
{reference}{gloss}.wav(e.g.,0001body.wav)
- Consent Records: Database structure for consent logging
- Export Integration: Consent logs included in data exports
lib/
├── main.dart # App entry point
├── models/ # Data models
│ ├── wordlist_entry.dart
│ └── consent_record.dart
├── providers/ # State management (Provider pattern)
│ └── wordlist_provider.dart
├── screens/ # UI screens
│ ├── home_screen.dart
│ ├── import_screen.dart
│ ├── elicitation_screen.dart
│ └── export_screen.dart
├── services/ # Business logic
│ ├── database_service.dart
│ ├── xml_service.dart
│ ├── audio_service.dart
│ └── export_service.dart
└── widgets/ # Reusable UI components
Key packages used:
- State Management:
provider - Database:
sqflitefor SQLite - XML Parsing:
xml - Audio:
recordfor recording,audioplayersfor playback - File Operations:
file_picker,archive,share_plus - Localization:
flutter_localizations,intl - Permissions:
permission_handler
- Flutter SDK 3.0.0 or higher
- Android Studio or VS Code with Flutter extensions
- Android SDK (for Android builds)
-
Install Flutter dependencies:
flutter pub get
-
Run the app:
flutter run
flutter build apk --releaseThe APK will be generated at: build/app/outputs/flutter-apk/app-release.apk
- Launch the app
- Tap "Import Wordlist"
- Select a Dekereke XML file
- Wait for import to complete
- Tap "Start Elicitation" from home screen
- For each word:
- View the English gloss
- Tap the microphone to record
- Enter IPA transcription
- Tap "Save & Next"
- Tap "Export Data" from home screen
- Review summary statistics
- Tap "Export as ZIP"
- Share the exported file via "Share Export"
The app requires the following permissions (configured in AndroidManifest.xml):
RECORD_AUDIO: For audio recordingREAD_EXTERNAL_STORAGE: For file access (Android < 13)WRITE_EXTERNAL_STORAGE: For file storage (Android < 13)READ_MEDIA_AUDIO: For media access (Android 13+)
To add new languages:
- Add locale to
supportedLocalesinmain.dart - Create corresponding
.arbfiles inlib/l10n/ - Run
flutter gen-l10n
The app follows Clean Architecture principles with:
- Models: Data structures
- Services: Business logic and external integrations
- Providers: State management using Provider pattern
- Screens: UI layer
- Import: XML → Parser → Database
- Elicitation: UI → Provider → Database + Audio Files
- Export: Database + Audio → ZIP Archive
The app reads and writes the real Dekereke XML structure used by the
QWOM data file: a UTF-16
little-endian file with a <phon_data> root containing one <data_form>
record per word. All fields in each record are preserved on import and
written back on export, with <Phonetic> filled from the collected
transcription and <SoundFile> pointing at the recorded WAV file.
<?xml version="1.0" encoding="utf-16" standalone="yes" ?>
<phon_data>
<data_form>
<Reference>0001</Reference>
<CAWL>1</CAWL>
<Category>N</Category>
<Gloss>body</Gloss>
<SoundFile>0001body.wav</SoundFile>
<Image_File>0001body.png</Image_File>
<GlossTokPisin>bodi</GlossTokPisin>
<GlossIndonesian>tubuh, badan</GlossIndonesian>
<Phonetic>bɔdi</Phonetic>
<SemanticDomain>Body parts</SemanticDomain>
...
</data_form>
</phon_data>A simplified <Wordlist>/<Entry> structure (Reference/Gloss/Picture) is
also accepted for hand-made test files, and UTF-8 files are detected
automatically.
- LIFT XML export format
- Cloud sync capabilities
- Custom font integration (Charis SIL, Doulos SIL)
- Enhanced keyboard support (Keyman integration)
- Offline-first architecture improvements
- Data validation and quality checks
- Configurable consent text (per-language, via bundling wizard)
This code is licensed under AGPL-3.0. See the LICENSE file in the repository root for details.
Important: The wordlist data used by this app is licensed separately under CC BY-NC-SA 4.0. The app does not bundle any wordlist data.
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
All contributions must be licensed under AGPL-3.0 or a compatible license.
- Audio recording uses device default sample rate
- Currently supports Dekereke XML format only
- No built-in consent screen (manual consent logging required)
- Images referenced in XML are not yet displayed
To run tests:
flutter testThe project uses the default Flutter lints. Run:
flutter analyzeFor issues, feature requests, or questions:
- Open an issue on the GitHub repository
- Check existing issues for similar problems
- Review the main project README for architectural guidance
This implementation follows the project goals and technical requirements outlined in the main repository README, which was collaboratively authored by Seth Johnston via conversation with Gemini (Google).