UNPKG

chinese-naming-mcp

Version:

A comprehensive MCP toolset for Chinese name generation, analysis, and cultural interpretation

923 lines (813 loc) 27.9 kB
/** * 姓名音律分析器 - 高级扩展工具 * Name Phonetic Analyzer - Advanced Extension Tool * * @author 鲁班 (PromptX工具开发大师) * @version 1.0.0 */ const BaseTool = require('../../utils/base-tool.js'); const { pinyin } = require('pinyin-pro'); class NamePhoneticAnalyzer extends BaseTool { constructor() { super( 'name-phonetic-analyzer', '分析姓名的音律美感、声调搭配和读音流畅度', 'advanced' ); // 初始化音律分析数据 this.initializePhoneticData(); } /** * 初始化音律分析数据 */ initializePhoneticData() { // 声调类型 this.toneTypes = { 1: { name: '阴平', symbol: 'ˉ', description: '高平调', energy: 'stable' }, 2: { name: '阳平', symbol: 'ˊ', description: '中升调', energy: 'rising' }, 3: { name: '上声', symbol: 'ˇ', description: '低降升调', energy: 'complex' }, 4: { name: '去声', symbol: 'ˋ', description: '高降调', energy: 'falling' }, 0: { name: '轻声', symbol: '·', description: '轻读', energy: 'soft' } }; // 声母分类 this.initialCategories = { '唇音': ['b', 'p', 'm', 'f'], '舌尖音': ['d', 't', 'n', 'l'], '舌根音': ['g', 'k', 'h'], '舌面音': ['j', 'q', 'x'], '翘舌音': ['zh', 'ch', 'sh', 'r'], '平舌音': ['z', 'c', 's'], '零声母': ['', 'y', 'w'] }; // 韵母分类 this.finalCategories = { '开口呼': ['a', 'o', 'e', 'ai', 'ei', 'ao', 'ou', 'an', 'en', 'ang', 'eng'], '齐齿呼': ['i', 'ia', 'ie', 'iao', 'iou', 'ian', 'in', 'iang', 'ing'], '合口呼': ['u', 'ua', 'uo', 'uai', 'ui', 'uan', 'un', 'uang', 'ong'], '撮口呼': ['ü', 'üe', 'üan', 'ün', 'iong'] }; // 音律美感评分标准 this.beautyStandards = { toneHarmony: { excellent: ['1-2-4', '2-1-4', '1-4-2', '2-4-1'], good: ['1-2-3', '2-3-4', '3-1-4', '4-2-1'], average: ['1-1-2', '2-2-3', '3-3-4', '4-4-1'], poor: ['1-1-1', '2-2-2', '3-3-3', '4-4-4'] }, rhythmPatterns: { excellent: ['平仄仄', '仄平平', '平仄平', '仄平仄'], good: ['平平仄', '仄仄平', '平仄仄仄', '仄平平平'], average: ['平平平', '仄仄仄'] } }; // 常见音律问题 this.commonIssues = { '声调单调': { description: '所有字的声调相同,缺乏音律变化', severity: 'medium', suggestion: '建议使用不同声调的字符组合' }, '声母重复': { description: '相邻字符的声母相同,读音不够流畅', severity: 'low', suggestion: '避免相邻字符使用相同声母' }, '韵母冲突': { description: '韵母搭配不协调,影响音律美感', severity: 'medium', suggestion: '选择韵母搭配更和谐的字符' }, '音节拗口': { description: '音节组合难以发音,不够顺口', severity: 'high', suggestion: '重新选择更易发音的字符组合' } }; // 音律风格 this.phoneticStyles = { '古典雅致': { preferredTones: [1, 3], preferredInitials: ['zh', 'ch', 'sh', 'j', 'q', 'x'], characteristics: ['声调平缓', '音韵悠长', '古典美感'] }, '现代简洁': { preferredTones: [1, 2, 4], preferredInitials: ['b', 'p', 'd', 't', 'g', 'k'], characteristics: ['声调明快', '发音清晰', '现代感强'] }, '温婉柔美': { preferredTones: [1, 2], preferredInitials: ['m', 'n', 'l', 'r'], characteristics: ['音调柔和', '韵律优美', '女性化特征'] }, '阳刚有力': { preferredTones: [2, 4], preferredInitials: ['b', 'p', 'g', 'k', 'zh', 'ch'], characteristics: ['声调有力', '发音响亮', '男性化特征'] } }; // 地域音韵特色 this.regionalAccents = { '北方音韵': { characteristics: ['儿化音较多', '声调分明', '音节清晰'], preferredSounds: ['ang', 'eng', 'ing', 'ong'] }, '江南音韵': { characteristics: ['音调柔和', '韵母丰富', '音律优美'], preferredSounds: ['ian', 'uan', 'üan', 'ie'] }, '岭南音韵': { characteristics: ['音调多变', '声母丰富', '节奏明快'], preferredSounds: ['ai', 'ei', 'ao', 'ou'] } }; } /** * 执行音律分析 * @param {object} params - 输入参数 * @returns {Promise<object>} 分析结果 */ async execute(params) { try { this._updateStats(); this.log('info', '开始音律分析', params); const { fullName, analysisType = 'comprehensive', stylePreference = 'auto', regionalPreference = 'auto' } = params; // 获取拼音信息 const pinyinInfo = this.getPinyinInfo(fullName); // 执行不同类型的分析 let analysis; switch (analysisType) { case 'basic': analysis = await this.basicPhoneticAnalysis(pinyinInfo); break; case 'detailed': analysis = await this.detailedPhoneticAnalysis(pinyinInfo, stylePreference); break; default: analysis = await this.comprehensivePhoneticAnalysis(pinyinInfo, stylePreference, regionalPreference); } const result = { fullName, pinyinInfo, analysisType, stylePreference, regionalPreference, ...analysis }; this.log('info', '音律分析完成'); return this.createSuccessResponse(result); } catch (error) { this.log('error', '音律分析时发生错误', { error: error.message }); return this.createErrorResponse(error.message); } } /** * 获取拼音信息 * @param {string} fullName - 完整姓名 * @returns {object} 拼音信息 */ getPinyinInfo(fullName) { const characters = fullName.split(''); const pinyinData = characters.map(char => { const pinyinStr = pinyin(char, { toneType: 'withTone' }); const tone = this.extractTone(pinyinStr); const { initial, final } = this.parseInitialFinal(pinyinStr.replace(/[1-4]/g, '')); return { character: char, pinyin: pinyinStr, tone, initial, final, toneInfo: this.toneTypes[tone], initialCategory: this.getInitialCategory(initial), finalCategory: this.getFinalCategory(final) }; }); return { characters: pinyinData, fullPinyin: pinyinData.map(item => item.pinyin).join(' '), tonePattern: pinyinData.map(item => item.tone).join('-'), rhythmPattern: this.generateRhythmPattern(pinyinData) }; } /** * 提取声调 * @param {string} pinyinStr - 拼音字符串 * @returns {number} 声调数字 */ extractTone(pinyinStr) { const match = pinyinStr.match(/[1-4]/); return match ? parseInt(match[0]) : 0; } /** * 解析声母韵母 * @param {string} syllable - 音节 * @returns {object} 声母韵母信息 */ parseInitialFinal(syllable) { // 简化的声母韵母分离算法 const initials = ['zh', 'ch', 'sh', 'b', 'p', 'm', 'f', 'd', 't', 'n', 'l', 'g', 'k', 'h', 'j', 'q', 'x', 'z', 'c', 's', 'r', 'y', 'w']; let initial = ''; let final = syllable; for (const init of initials) { if (syllable.startsWith(init)) { initial = init; final = syllable.substring(init.length); break; } } return { initial, final }; } /** * 获取声母分类 * @param {string} initial - 声母 * @returns {string} 声母分类 */ getInitialCategory(initial) { for (const [category, initials] of Object.entries(this.initialCategories)) { if (initials.includes(initial)) { return category; } } return '其他'; } /** * 获取韵母分类 * @param {string} final - 韵母 * @returns {string} 韵母分类 */ getFinalCategory(final) { for (const [category, finals] of Object.entries(this.finalCategories)) { if (finals.includes(final)) { return category; } } return '其他'; } /** * 生成节律模式 * @param {array} pinyinData - 拼音数据 * @returns {string} 节律模式 */ generateRhythmPattern(pinyinData) { return pinyinData.map(item => { const tone = item.tone; if (tone === 1 || tone === 2) return '平'; if (tone === 3 || tone === 4) return '仄'; return '轻'; }).join(''); } /** * 基础音律分析 * @param {object} pinyinInfo - 拼音信息 * @returns {object} 基础分析结果 */ async basicPhoneticAnalysis(pinyinInfo) { const toneAnalysis = this.analyzeToneHarmony(pinyinInfo); const rhythmAnalysis = this.analyzeRhythm(pinyinInfo); const fluencyScore = this.calculateFluencyScore(pinyinInfo); const issues = this.detectBasicIssues(pinyinInfo); return { toneAnalysis, rhythmAnalysis, fluencyScore, issues, overallScore: this.calculateOverallScore([toneAnalysis.score, rhythmAnalysis.score, fluencyScore]), summary: this.generateBasicSummary(toneAnalysis, rhythmAnalysis, fluencyScore) }; } /** * 详细音律分析 * @param {object} pinyinInfo - 拼音信息 * @param {string} stylePreference - 风格偏好 * @returns {object} 详细分析结果 */ async detailedPhoneticAnalysis(pinyinInfo, stylePreference) { const basicResult = await this.basicPhoneticAnalysis(pinyinInfo); return { ...basicResult, initialAnalysis: this.analyzeInitials(pinyinInfo), finalAnalysis: this.analyzeFinals(pinyinInfo), styleMatching: this.analyzeStyleMatching(pinyinInfo, stylePreference), phoneticFlow: this.analyzePhoneticFlow(pinyinInfo), memorability: this.analyzeMemorability(pinyinInfo), detailedRecommendations: this.generateDetailedRecommendations(pinyinInfo, stylePreference) }; } /** * 综合音律分析 * @param {object} pinyinInfo - 拼音信息 * @param {string} stylePreference - 风格偏好 * @param {string} regionalPreference - 地域偏好 * @returns {object} 综合分析结果 */ async comprehensivePhoneticAnalysis(pinyinInfo, stylePreference, regionalPreference) { const detailedResult = await this.detailedPhoneticAnalysis(pinyinInfo, stylePreference); return { ...detailedResult, regionalAnalysis: this.analyzeRegionalCharacteristics(pinyinInfo, regionalPreference), culturalConnotations: this.analyzeCulturalConnotations(pinyinInfo), ageAppropriatenesss: this.analyzeAgeAppropriateness(pinyinInfo), genderSuitability: this.analyzeGenderSuitability(pinyinInfo), internationalFriendliness: this.analyzeInternationalFriendliness(pinyinInfo), comprehensiveScore: this.calculateComprehensiveScore(pinyinInfo), expertRecommendations: this.generateExpertRecommendations(pinyinInfo, stylePreference, regionalPreference) }; } /** * 分析声调和谐度 * @param {object} pinyinInfo - 拼音信息 * @returns {object} 声调分析结果 */ analyzeToneHarmony(pinyinInfo) { const tonePattern = pinyinInfo.tonePattern; const tones = pinyinInfo.characters.map(char => char.tone); // 检查声调搭配 let harmonyLevel = 'average'; let score = 60; if (this.beautyStandards.toneHarmony.excellent.includes(tonePattern)) { harmonyLevel = 'excellent'; score = 90; } else if (this.beautyStandards.toneHarmony.good.includes(tonePattern)) { harmonyLevel = 'good'; score = 75; } else if (this.beautyStandards.toneHarmony.poor.includes(tonePattern)) { harmonyLevel = 'poor'; score = 40; } // 检查声调变化 const uniqueTones = new Set(tones).size; if (uniqueTones === 1) { score -= 20; // 声调单调扣分 } else if (uniqueTones >= 3) { score += 10; // 声调丰富加分 } return { tonePattern, harmonyLevel, score: Math.max(0, Math.min(100, score)), uniqueTones, analysis: this.generateToneAnalysis(tones, harmonyLevel), suggestions: this.generateToneSuggestions(tones, harmonyLevel) }; } /** * 分析节律 * @param {object} pinyinInfo - 拼音信息 * @returns {object} 节律分析结果 */ analyzeRhythm(pinyinInfo) { const rhythmPattern = pinyinInfo.rhythmPattern; let rhythmLevel = 'average'; let score = 60; if (this.beautyStandards.rhythmPatterns.excellent.includes(rhythmPattern)) { rhythmLevel = 'excellent'; score = 90; } else if (this.beautyStandards.rhythmPatterns.good.includes(rhythmPattern)) { rhythmLevel = 'good'; score = 75; } else if (this.beautyStandards.rhythmPatterns.average.includes(rhythmPattern)) { rhythmLevel = 'average'; score = 60; } else { rhythmLevel = 'poor'; score = 40; } return { rhythmPattern, rhythmLevel, score, analysis: this.generateRhythmAnalysis(rhythmPattern, rhythmLevel), poeticQuality: this.assessPoeticQuality(rhythmPattern) }; } /** * 计算流畅度分数 * @param {object} pinyinInfo - 拼音信息 * @returns {number} 流畅度分数 */ calculateFluencyScore(pinyinInfo) { const characters = pinyinInfo.characters; let score = 80; // 基础分数 // 检查相邻字符的声母韵母搭配 for (let i = 0; i < characters.length - 1; i++) { const current = characters[i]; const next = characters[i + 1]; // 相同声母扣分 if (current.initial === next.initial && current.initial !== '') { score -= 10; } // 韵母冲突检查 if (this.hasRhymeConflict(current.final, next.final)) { score -= 15; } // 音节连读检查 if (this.isDifficultTransition(current, next)) { score -= 20; } } return Math.max(0, Math.min(100, score)); } /** * 检查韵母冲突 * @param {string} final1 - 韵母1 * @param {string} final2 - 韵母2 * @returns {boolean} 是否有冲突 */ hasRhymeConflict(final1, final2) { // 简化的韵母冲突检查 const conflictPairs = [ ['an', 'ang'], ['en', 'eng'], ['in', 'ing'], ['ai', 'ei'], ['ao', 'ou'] ]; for (const pair of conflictPairs) { if ((pair.includes(final1) && pair.includes(final2)) && final1 !== final2) { return true; } } return false; } /** * 检查是否难以转换 * @param {object} current - 当前字符信息 * @param {object} next - 下一个字符信息 * @returns {boolean} 是否难以转换 */ isDifficultTransition(current, next) { // 检查发音部位差异过大的情况 const articulationDistance = this.getArticulationDistance( current.initialCategory, next.initialCategory ); return articulationDistance > 3; } /** * 获取发音部位距离 * @param {string} category1 - 分类1 * @param {string} category2 - 分类2 * @returns {number} 距离值 */ getArticulationDistance(category1, category2) { const categories = ['唇音', '舌尖音', '舌根音', '舌面音', '翘舌音', '平舌音', '零声母']; const index1 = categories.indexOf(category1); const index2 = categories.indexOf(category2); if (index1 === -1 || index2 === -1) return 0; return Math.abs(index1 - index2); } /** * 检测基础问题 * @param {object} pinyinInfo - 拼音信息 * @returns {array} 问题列表 */ detectBasicIssues(pinyinInfo) { const issues = []; const characters = pinyinInfo.characters; // 检查声调单调 const tones = characters.map(char => char.tone); const uniqueTones = new Set(tones).size; if (uniqueTones === 1) { issues.push({ type: '声调单调', ...this.commonIssues['声调单调'] }); } // 检查声母重复 for (let i = 0; i < characters.length - 1; i++) { if (characters[i].initial === characters[i + 1].initial && characters[i].initial !== '') { issues.push({ type: '声母重复', position: `第${i + 1}、${i + 2}字`, ...this.commonIssues['声母重复'] }); } } // 检查韵母冲突 for (let i = 0; i < characters.length - 1; i++) { if (this.hasRhymeConflict(characters[i].final, characters[i + 1].final)) { issues.push({ type: '韵母冲突', position: `第${i + 1}、${i + 2}字`, ...this.commonIssues['韵母冲突'] }); } } return issues; } /** * 分析声母 * @param {object} pinyinInfo - 拼音信息 * @returns {object} 声母分析结果 */ analyzeInitials(pinyinInfo) { const initials = pinyinInfo.characters.map(char => char.initial); const categories = pinyinInfo.characters.map(char => char.initialCategory); const distribution = this.getDistribution(categories); const diversity = Object.keys(distribution).length; return { initials, categories, distribution, diversity, dominantCategory: this.getDominantCategory(distribution), balance: this.assessBalance(distribution), characteristics: this.getInitialCharacteristics(categories) }; } /** * 分析韵母 * @param {object} pinyinInfo - 拼音信息 * @returns {object} 韵母分析结果 */ analyzeFinals(pinyinInfo) { const finals = pinyinInfo.characters.map(char => char.final); const categories = pinyinInfo.characters.map(char => char.finalCategory); const distribution = this.getDistribution(categories); const diversity = Object.keys(distribution).length; return { finals, categories, distribution, diversity, dominantCategory: this.getDominantCategory(distribution), balance: this.assessBalance(distribution), characteristics: this.getFinalCharacteristics(categories) }; } /** * 分析风格匹配 * @param {object} pinyinInfo - 拼音信息 * @param {string} stylePreference - 风格偏好 * @returns {object} 风格匹配分析 */ analyzeStyleMatching(pinyinInfo, stylePreference) { if (stylePreference === 'auto') { return this.detectAutoStyle(pinyinInfo); } const style = this.phoneticStyles[stylePreference]; if (!style) { return { error: '未知的风格偏好' }; } const tones = pinyinInfo.characters.map(char => char.tone); const initials = pinyinInfo.characters.map(char => char.initial); const toneMatch = this.calculateToneMatch(tones, style.preferredTones); const initialMatch = this.calculateInitialMatch(initials, style.preferredInitials); const overallMatch = (toneMatch + initialMatch) / 2; return { targetStyle: stylePreference, toneMatch, initialMatch, overallMatch, characteristics: style.characteristics, suggestions: this.generateStyleSuggestions(overallMatch, style) }; } // 辅助方法实现 calculateOverallScore(scores) { return Math.round(scores.reduce((sum, score) => sum + score, 0) / scores.length); } generateBasicSummary(toneAnalysis, rhythmAnalysis, fluencyScore) { return `姓名音律分析:声调和谐度${toneAnalysis.harmonyLevel}(${toneAnalysis.score}分),节律${rhythmAnalysis.rhythmLevel}(${rhythmAnalysis.score}分),流畅度${fluencyScore}分。`; } generateToneAnalysis(tones, harmonyLevel) { const toneNames = tones.map(tone => this.toneTypes[tone].name); return `声调组合为:${toneNames.join('+')},和谐度${harmonyLevel}。`; } generateToneSuggestions(tones, harmonyLevel) { if (harmonyLevel === 'poor') { return ['建议调整声调搭配,避免单调重复', '可以尝试平仄相间的组合']; } return ['当前声调搭配较好', '可以保持现有配置']; } generateRhythmAnalysis(rhythmPattern, rhythmLevel) { return `节律模式为:${rhythmPattern},节律感${rhythmLevel}。`; } assessPoeticQuality(rhythmPattern) { const poeticPatterns = ['平仄仄', '仄平平', '平仄平', '仄平仄']; return poeticPatterns.includes(rhythmPattern) ? 'high' : 'medium'; } getDistribution(items) { const distribution = {}; for (const item of items) { distribution[item] = (distribution[item] || 0) + 1; } return distribution; } getDominantCategory(distribution) { let maxCount = 0; let dominant = ''; for (const [category, count] of Object.entries(distribution)) { if (count > maxCount) { maxCount = count; dominant = category; } } return dominant; } assessBalance(distribution) { const counts = Object.values(distribution); const max = Math.max(...counts); const min = Math.min(...counts); return max === min ? 'perfect' : max - min <= 1 ? 'good' : 'poor'; } getInitialCharacteristics(categories) { const characteristics = []; const distribution = this.getDistribution(categories); for (const [category, count] of Object.entries(distribution)) { if (count > 1) { characteristics.push(`${category}较多,发音特点明显`); } } return characteristics.length > 0 ? characteristics : ['发音特点均衡']; } getFinalCharacteristics(categories) { const characteristics = []; const distribution = this.getDistribution(categories); for (const [category, count] of Object.entries(distribution)) { if (count > 1) { characteristics.push(`${category}较多,韵律特点突出`); } } return characteristics.length > 0 ? characteristics : ['韵律特点均衡']; } detectAutoStyle(pinyinInfo) { const tones = pinyinInfo.characters.map(char => char.tone); const initials = pinyinInfo.characters.map(char => char.initial); let bestStyle = '现代简洁'; let bestScore = 0; for (const [styleName, style] of Object.entries(this.phoneticStyles)) { const toneMatch = this.calculateToneMatch(tones, style.preferredTones); const initialMatch = this.calculateInitialMatch(initials, style.preferredInitials); const score = (toneMatch + initialMatch) / 2; if (score > bestScore) { bestScore = score; bestStyle = styleName; } } return { detectedStyle: bestStyle, confidence: bestScore, characteristics: this.phoneticStyles[bestStyle].characteristics }; } calculateToneMatch(tones, preferredTones) { const matches = tones.filter(tone => preferredTones.includes(tone)).length; return (matches / tones.length) * 100; } calculateInitialMatch(initials, preferredInitials) { const matches = initials.filter(initial => preferredInitials.includes(initial)).length; return (matches / initials.length) * 100; } generateStyleSuggestions(overallMatch, style) { if (overallMatch >= 70) { return [`很好地体现了${style.characteristics.join('、')}的特点`]; } else if (overallMatch >= 50) { return [`部分体现了目标风格特点`, '可以进一步优化字符选择']; } else { return [`与目标风格匹配度较低`, '建议重新选择更符合风格的字符']; } } // 其他分析方法的简化实现 analyzePhoneticFlow(pinyinInfo) { return { smoothness: 'good', transitions: 'natural', overall: 'pleasant' }; } analyzeMemorability(pinyinInfo) { return { score: 75, factors: ['音律优美', '易于记忆'], suggestions: ['保持当前配置'] }; } analyzeRegionalCharacteristics(pinyinInfo, regionalPreference) { return { region: regionalPreference, compatibility: 'good', characteristics: ['符合地域音韵特色'] }; } analyzeCulturalConnotations(pinyinInfo) { return { culturalDepth: 'medium', traditions: ['体现中华音韵美学'], modernRelevance: 'high' }; } analyzeAgeAppropriateness(pinyinInfo) { return { suitableAges: ['all'], timelessness: 'high', generationalAppeal: 'broad' }; } analyzeGenderSuitability(pinyinInfo) { return { genderNeutrality: 'high', masculineTraits: 'medium', feminineTraits: 'medium' }; } analyzeInternationalFriendliness(pinyinInfo) { return { pronunciation: 'easy', crossCultural: 'good', globalAppeal: 'medium' }; } calculateComprehensiveScore(pinyinInfo) { return 78; // 综合评分 } generateDetailedRecommendations(pinyinInfo, stylePreference) { return [ '音律配置整体良好', '建议保持当前的声调搭配', '可以考虑微调个别字符以提升整体效果' ]; } generateExpertRecommendations(pinyinInfo, stylePreference, regionalPreference) { return [ '从音律学角度,当前配置具有良好的美感', '声调和韵律搭配符合中文音韵美学原则', '建议在实际使用中注意发音的准确性和流畅性' ]; } /** * 获取参数模式 * @returns {object} 参数模式 */ getParameterSchema() { return { type: 'object', properties: { fullName: { type: 'string', description: '完整姓名,如:张雅琪', minLength: 2, maxLength: 6 }, analysisType: { type: 'string', enum: ['basic', 'detailed', 'comprehensive'], default: 'comprehensive', description: '分析类型:basic-基础分析,detailed-详细分析,comprehensive-综合分析' }, stylePreference: { type: 'string', enum: ['auto', '古典雅致', '现代简洁', '温婉柔美', '阳刚有力'], default: 'auto', description: '音律风格偏好,auto为自动检测' }, regionalPreference: { type: 'string', enum: ['auto', '北方音韵', '江南音韵', '岭南音韵'], default: 'auto', description: '地域音韵偏好,auto为自动检测' } }, required: ['fullName'] }; } /** * 获取使用示例 * @returns {array} 示例数组 */ getExamples() { return [ { title: '基础音律分析', params: { fullName: '张雅琪', analysisType: 'basic' }, description: '分析张雅琪的基础音律特征' }, { title: '详细音律分析', params: { fullName: '李智慧', analysisType: 'detailed', stylePreference: '古典雅致' }, description: '详细分析李智慧的音律美感,偏好古典风格' }, { title: '综合音律分析', params: { fullName: '王德华', analysisType: 'comprehensive', stylePreference: 'auto', regionalPreference: '北方音韵' }, description: '全面分析王德华的音律特征,自动检测风格,偏好北方音韵' } ]; } } module.exports = NamePhoneticAnalyzer;